关于Docker及其实践
环境
- MacOS:10.13.4
- Docker: 17.12.0-ce
简介
本文通过一个示例简单介绍开发中使用到的docker命令,可以回答三个问题:
- 是什么
- 怎么使用
- 怎么debug
Docker的定义及获取
所谓Docker,类似传统意义上的虚拟机,但是比那个要轻量。虽然大家对Docker有各种不同的诠释,但作为开发者,只需知道Docker比虚拟机性能要好,且更具实用价值即可。
我们可以通过官方网站选择下载Docker的运行时环境及客户端。安装并启动后,运行下面的命令可以获取得到Docker的基本信息:
jingwei@wheresmile:~/tmp/docker$ docker version
Client:
Version: 17.12.0-ce
#省略几行
Server:
Engine:
Version: 17.12.0-ce
#这里也省略几行
开始使用——启动一个ubuntu系统
我们尝试一下用Docker代替虚拟机进行一些开发。
拉取镜像
如果想查找docker镜像,可以直接通过搜索引擎搜索关键词。比如在百度搜索docker ubuntu可以找到Docker官方库中Ubuntu的镜像链接。
DockerHub是由官方维护的一个镜像仓库,里面维护了镜像的基本信息。我们可以从里面找到需要的镜像。
# 把标签为16.04,名称为ubuntu的镜像从docker-hub拉取下来
docker pull ubuntu:16.04
# 拉取镜像成功后,可以通过下面的命令查看当前电脑中存在哪些镜像
docker images
启动镜像
镜像下载下来以后,我们就可以基于这个镜像启动一个容器实例:
# 首先创建一个临时目录备用
mkdir -pv /tmp/jing
# 启动一个服务,其中
# -it 指定为交互模式,如果不添加则无法进入容器
# -rm 指定退出容器后自动删除容器实例,如果希望进入容器后的操作在退出容器后也能找回,就不要加这个,但是时间久了会有很多垃圾容器实例。
# --name jingwei 命名容器实例,否则会是一个随机值
# -p 60630:22 把容器里的22端口映射到主机的60630端口
# -v /tmp/jing:/tmp/wei 把主机的/tmp/jing目录mount到容器的/tmp/wei目录
docker run -it --rm --name jingwei -p 60630:22 -v /tmp/jing:/tmp/wei ubuntu:16.04 bash
如果顺利,我们已经进入到容器的Ubuntu里(且已经是root权限),至此我们可以像在一个虚拟机里的Ubuntu里做自己想做的事情了。
因为Docker中的Ubuntu:16.04比较纯净,需要自己安装一些工具。比如运行下面的命令,安装vim、ssh、ifconfig、ping等:
# 更新
apt update
# 安装vim
apt install -y vim
# 安装一个sshd,用于ssh连接
apt install -y openssh-server
# 启动ssh服务
service ssh start
# 安装ifconfig 命令
apt install -y net-tools
# 安装ping命令
apt install -y iputils-ping
与启动起来的Container交互
上一步中,我们已经启动了一个容器,我们可以再开一个terminal的tab,在另一个标签里进入这个容器。
# 其中 jingwei 即上面启动服务时 --name 指定的名称
docker exec -it jingwei bash
当然,因为我们已经在容器中安装了ssh服务,且把它的22端口进行了映射(60630),理论上我们可以通过在主机上ssh -p 60630 root@localhost
进行远程连接。但是需要进行一些特殊处理,把/etc/ssh/ssh_config
中的PermitRootLogin
设置成yes
,参考SSH远程登陆docker容器。
再起一个容器并和第一个容器交互
在开发的过程中,容器之间的交互很是常见,比如写一个web服务,依赖一个mysql的服务,那么怎么让容器中的web服务调用容器中的mysql服务呢?
再起一个容器
# --link 把jingwei这个容器链接到 iamsecond 容器,并且给jingwei起个别名叫mykk
# 其他的标识参考前面的注释
docker run -it --rm --link jingwei:mykk --name iamsecond ubuntu:16.04 bash
我们通过--link
把已命名的jingwei
给链接到了第二个容器里。进一步,我们可以通过在第二个容器的hosts
查看发生了啥:
root@fd64c29001eb:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mykk c5f123ecc767 jingwei
172.17.0.3 fd64c29001eb
root@fd64c29001eb:/#
其中172.17.0.2 mykk c5f123ecc767 jingwei
标明了第一个容器的地址,这样我们就可以在第二个容器里通过 mykk
或者jingwei
甚至c5f123ecc767
(只要你不怕麻烦)来访问第一个容器了。
通过ssh登录到第一个容器
比如我们可以通过下面的命令,从第二个容器ssh到第一个容器:
# 更新
apt update
# 安装一个sshd,用于ssh连接
apt install -y openssh-server
ssh root@mykk
# 输入密码就切到第一个容器了✌️
至此,成功。
接下来
本文从实践上简单探究了docker的使用,在探究完上面的内容,可以进一步研究下面几个问题:
- 如何打自己的镜像并分享给别人
- 什么是Dockerfile及其编写规范
- docker命令进阶
参考
- Docker 基础教程 很基础的教程
- SSH远程登陆docker容器 解决了ssh远程登录docker容器的配置问题
- Docker官方参考文档 详细但是繁杂的官方文档