关于Docker及其实践

环境

简介

本文通过一个示例简单介绍开发中使用到的docker命令,可以回答三个问题:

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的使用,在探究完上面的内容,可以进一步研究下面几个问题:

参考