多数的现在应用通过多个更小的服务互相协同来组成一个完整可用的应用。比如一个简单的示例应用可能由如下4个服务组成。
1. web前端。
2. 订单管理。
3. 品类管理。
4. 后台数据库。
部署和管理繁多的服务是困难的,这正是Docker Compose要解决的问题。
安装docker-compose很简单,在ubuntu上用这条命令就好。
sudo apt install docker-compose
Docker Compose使用YAML文件来定义多服务应用。Docker Compose默认使用文件名为docker-compose.yml,当然用户也可以使用-f参数指定具体文件。
示例简介
接下来讲一个Compose文件的示例,它定义了一个包含两个服务(web-fe和redis)的小型Flask应用。这是一个能够对访问者进行计数并将其保存到Redis的简单的Web服务。本例中将其命名为counter-app,并将其作为后续内容的示例应用程序。
先看下其docker-compose.yml的内容
可以看到它包含4个一级key:version、services、networks、volumes。
version是必须指定的,而且总是位于文件的第一行。它定义了Compose文件格式的版本。
services用于定义不同的应用服务。这里定义了两个服务,一个名为web-fe的Web前端服务以及一个名为redis的内存数据库服务。Docker Compose会将每个服务部署在各自的容器中。
networks用于指引Docker创建新的网络。默认情况下,Docker Compose会创建bridge网络。这是一种单主机网络,只能够实现同一主机上容器的连接。
volumes用于指引Docker来创建新的卷。
很明显services是其中最关键的key,本例中定义了两个服务,下面单独分析下。
services:
web-fe:
#二级key,定义web-fe服务
build: .
#指定Docker基于当前目录下的Dockerfile中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器。
command: python app.py
#指定Docker在容器中执行名为app.py的Python脚本作为主程序。
ports:
#指定Docker将容器内(-target)的5000端口映射到主机(published)的5000端口。
- target: 5000
published: 5000
networks:
#使得Docker可以将服务连接到指定网络上,这里用了networks一级key中定义的网络。
- counter-net
volumes:
#指定Docker将counter-vol卷(source:)挂载到容器内的/code(target:)。counter-vol卷应该是已存在的,或者是在文件下方的volumes一级key中定义的。
- type: volume
source: counter-vol
target: /code
redis:
image: "redis:alpine"
基于redis:alpine镜像启动一个独立的名为redis的容器。这个镜像会被从Docker Hub上拉取下来。
networks:
counter-net:
Dockerfile文件用于创建上面提到的web-fe镜像, 从其内容可以看到,它先下载python:3.4-alpine基础镜像,然后将app复制到镜像中,把code目录设置为工作目录,安装依赖,最后设置app.py为默认启动命令。
app.py 是真正运行的应用程序,它使用了名为flask的web微框架。
示例启动
之后执行docker-compose up &将应用启动起来。
然后用docker image ls可以看到在部署过程中构建或拉取的3个镜像。
REPOSITORY TAG
counterappmaster_web-fe latest
redis alpine
python 3.4-alpine
再用docker container ls看到两个容器。
counterappmaster_web-fe 容器中运行的是应用的web前端。其执行的是app.py。
下面两个命令可以看到名为counterappmaster_counter-net的网络和名为counterappmaster_counter-vol的卷。
应用部署成功以后,可以用IE访问主机的5000端口查看运行效果。
单机浏览器的刷新按钮,访问计数会增加。
同时终端窗口会有相应日志打印。
示例停止
docker-compose down命令可以停止应用。
打印中的第1、2行开始尝试关闭两个服务。
由3~7行可知,stop指令会发送SIGTERM信号。信号会被发送到每个容器PID为1的进程。然后可以看到redis容器自行关闭。
随后web-fe服务也被成功停止。随后可以看到已经停止的服务和网络都被删除。
但是名为counterappmaster_counter-vol的卷并不会被删除,因为卷是用于数据的长期持久化存储的。因此卷的生命周期与相应的容器是完全解耦的。
其他几个有用的命令
docker-compose up -d
后台启动应用
docker-compose ps
查看应用的状态
docker-compose top
列出各个容器内运行的进程,其中的PID编号是在Docker主机上的进程ID
docker-compose stop
停止应用,但不会删除资源
docker-compose restart
重新启动应用
这几条命令的效果如下