(2):教你实现分钟级部署
前言¶
本章目标是展示使用容器带来的快乐。最近正好因为自己买的云服务器的公司因为自身原因决定停止云服务器的服务,因此被迫的要求进行服务器迁移。
而正因为我部分使用了容器,外加平时对服务器配置进行了备份,因此在整个迁移过程中并没有太高的成本,大概花了1天时间。其中95%时间用在将未docker化的服务进行docker化,只有5%的时间将备份重用及安装docker。
可以说真实的感受到了docker迁移带来的快乐,你可以想象到,我只需要在一台全新的服务器上安装docker,接着用写好的docker-compose.yml文件及备份过的“配置”,就可以瞬间恢复所有服务:

如上所示,就是我站点提供的所有服务:
- backup:备份服务
- blog:博客服务
- HSEVPN:VPN服务
- jenkins:CI/CD服务
- port_map:端口映射服务
- proxy:代理服务
而这些服务仅用一个文件docker-compose.yml
进行集中管理即可,整个备份也很方便,仅需要备份配置即可,好,那么接下来就开始跟着示例开启快乐之旅。
学会查看帮助信息¶
如同我在《Perl语言入门》所说:“无论你此时此刻学的是何种语言,但都要记住一点,学会看文档,无论官网的document,还是系统下的manpage,还是语言或工具独有的help,比如Linux/Unix的man,python中的help和dir,命令行工具中的–help和-h,你都必须学会看,因为那里有最权威,最准确和最详细的解释。”,工具也是一样的,学会看文档是基础。
为了更好的讲述如何使用docker,接下来我们在安装完docker后,会以搭建一个WEB服务器示例为入口,进行讲解。
后续所有的篇幅都以CentOS为主进行讲解,为了满足桌面用户的需求,也会展示MAC的操作界面(Windows基本与MAC一样)。
安装docker¶
以下仅提供部分环境的安装,更详细的信息请参考:“官网安装手册”,上面有各个系统的安装教程。
-
安装docker:按序执行以下命令
sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-pluginsudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
启动docker
- 开机自动运行docker
点击下载:安装器
点击下载:Intel芯片安装器
点击下载:苹果芯片安装器
搭建一个WEB服务器¶
注意:以下搭建的服务都只为了演示docker的操作,仅作为学习使用,在实际场景中应当使用专门的服务。
如上所示,为了更好的运维WEB服务,我们计划同时部署三个服务:
- HTTP服务:提供HTTP站点能力。
- 邮件服务(邮件客户端):提供发送邮件的能力。
- 监控服务:提供监控系统的能力,在发现“HTTP服务”停止运行时会通过“邮件服务”来发送告警邮件给管理员。
实现上述示例只需要执行以下三个命令即可,往后阅读将进行介绍:
-
启动HTTP服务:
-
启动邮件服务:
-
启动监控服务:
启动HTTP服务¶
Docker源码路径
如果想了解本服务的实现,可参阅仓库:homqyy/docker-example-http
在终端下执行命令:
docker run
:是用于启动一个容器。-d
:是detach的意思,即分离。也就是在后台运行。--name
:是给容器指定一个名字,这意味着我们将启动一个名叫local.http
的容器。--rm
:是在容器停止后,自动将容器删除- 容器存在时有“运行”和“停止”两种状态,而这里是直接将容器删除。
- 因为这只是个用例,因此退出后直接自动删除容器会比较方便。而真实环境下如果只是想临时的将服务停止,则不要追加此参数。
homqyy/example_http
:这个是镜像名称。如果本地没有此镜像则会去默认的仓库上拉去镜像。显然第一次运行的时候一定是去仓库上拉去的。
经过上面的命令,你就运行了一个http服务器了,且服务端口为默认的8080
。是不是很简单,我们可以用命令docker ps
查看一下当前运行的容器:

CONTAINER ID
:是容器的唯一标识,我们除了通过“NAMES
”来操作容器外,还可以通过“CONTAINER ID
”。
IMAGE
:表示此容器是由哪个镜像产生的。COMMAND
:运行容器时执行的命令。CREATED
:容器的创建时间。STATUS
:容器的运行状态,UP
表示还在运行中,10 Minutes
结合UP
表示的是已经运行了10分钟。PORTS
:对外暴露的端口NAMES
:容器的名称

同时也用命令docker images
查看下当前本地有哪些镜像:

REPOSITORY
:是仓库的意思,表示的是仓库名称。TAG
:仓库的版本,latest
是最新版的意思。IMAGE ID
:是镜像的唯一标识,我们除了通过“仓库:版本”来操作镜像外,还可以通过“IMAGE ID
”。CREATED
:镜像的获取时间。SIZE
:镜像大小。

隔离
上述运行的容器并不支持与本机通信,因此你没法访问此HTTP服务器,如果期望本机可以访问的话,可以使用命令:
这里会发现,我们用相同的镜像启动了第二个容器,而且它们之间不会产生冲突!这是绝对是值得高兴的事情。- 这里比上面的命令多了个
-p 80:8080
,意思是本机80
端口映射到容器的8080
端口,这说明,我们可以访问“http://localhost
”来访问容器,就好像这个容器的HTTP服务就安装在你本地一样。 -
执行命令
wget -O - http://localhost
进行测试(如果有浏览器也可以直接用浏览器),得到如下结果:
由于开放本机访问权限不是我们的主题,因此可以把local.http.hostmode
容器先给删除了,执行命令:
- 由于之前我们加了--rm参数,因此停止容器后将自动删除
启动邮件服务¶
docker源码路径
如果想了解本服务的实现,可参阅仓库:homqyy/docker-example-mailer
在终端下执行命令:
同上所述,可以自行查看docker的运行情况。之前没有讲怎么查看容器的启动日志,可通过以下命令查看:
结果如下所示:

桌面的话,点击容器即可查看日志:

启动监控服务¶
docker源码路径
如果想了解本服务的实现,可参阅仓库:homqyy/docker-example-monitor
在终端下执行命令启动监控服务:
docker run -it --name local.monitor --rm \
--link local.http:insidehttp \
--link local.mailer:insidemailer \
homqyy/example_monitor
- 观察“监控服务器”的运行命令可以发现,这里有个细微的变化,就是用
-it
取代了-d
参数:i
:interactive,交互的意思,会把标准输入映射到容器中,即我们在键盘的输入会映射到容器中。t
:tty,终端的意思,会申请一个伪终端,即讲容器的标准输出打印到主机的终端上。
- 用了
-it
参数之后,我们就像进入到容器内部一样,可以进行操作和直接查看(不必通过docker日志查看了)。 --link
:链接,将容器链接到一起的意思,这样彼此之间就可以相互通信了(之前我们讲过,容器之间时相互隔离的,其中包括网络隔离。而通过“链接”我们可以让原本网络隔离的容器间不再隔离了,可以通过网络进行通信。比如,这里的意思就是将“监控服务器(local.monitor)”与“http服务器(local.http)”和“邮件客户端(local.mailer)”链接到一起,使之可以进行通信。
成功启动后终端会一直打印监控信息,结果如下所示:

这里之所以每秒输出一条日志是因为我给“监控服务器”设置的监控间隔为1秒钟。
小知识
从交互模式切到后台模 如果在使用-it与容器进行交互了一段时间后,想在不中断容器运行的情况下退出交互模式,可以使用组合键“ctrl+p+q”来实现。
这时候我们可以用一个全新的终端或则从“交互模式”切换到“后台模式”后,执行命令docker stop local.http
来停止HTTP服务器,并观察“监控服务器”的日志信息:

停止后我们发现,“监控服务器”输出了“系统异常,发送告警邮件”。此时我们再一次通过docker logs -f local.mail查看`邮件客户端“的日志信息:

我们发现,“邮件客户端”发送了邮件,邮件内容为:
总结¶
回顾一下部署HTTP服务器的示例步骤,会发现部署过程很简单,也就三条指令:
- 启动HTTP服务:
docker run -d --name local.http --rm homqyy/example_http
- 启动邮件服务:
docker run -d --name local.mailer --rm homqyy/example_mailer
- 启动监控服务:
docker run -it --name local.monitor --rm --link local.http:insidehttp --link local.mailer:insidemailer homqyy/example_monitor
本文所述的命令涉及的参数都只是一部分,请发挥“阅读文档”的能力,去升华对docker命令行的理解和使用:
docker仓库:
代码仓库: