这篇我们学习下Docker的Compose。
部署一个wordpress
首先准备好两个镜像:
1 | [vagrant@docker-host ~]$ docker images |
我们需要搭建的wordpress由两部分组成,一个是web服务,一个是对应的数据服务。
先创建一个MySQL的容器

创建MySQL容器的时候指定数据的root账户密码和数据库名字。
这里我们不用把3306端口映射出来的原因是我们并不想外面访问,在同一个Docker主机上的容器在同一个网络上是可以直接访问该容器的端口的。
创建wordpress的容器
1 | [vagrant@docker-host ~]$ docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress |
-e WORDPRESS_DB_PASSWORD=...(defaults to the value of theMYSQL_ROOT_PASSWORDenvironment variable from the linkedmysqlcontainer)
这样直接访问本地8080端口即可。
这样我们使用了两个容器启动了一个wordpress。
对于一个服务需要多个容器的话我们需要分别管理各个容器,有些麻烦。
我们可以将这些容器当成一个组,可以统一管理(启动,删除等),这就是Docker Compose。
Docker Compo到底是什么?
Docker Compo是一个命令行工具,可以批处理容器。- 这个工具可以通过一个
yml文件定义多容器的docker应用。 - 通过一个命令就可以根据
yml文件的定义去创建或者管理这多个容器
官方文档:https://docs.docker.com/compose/compose-file/#reference-and-guidelines
这个关键的yml文件有一个默认的名字docker-compose.yml,我们是可以修改这个名字的。
不同版本的Compose的功能是稍微不同的:对于version 3来说是支持多机的,version 2是不支持多机的。
现在一般都是使用version 3,我们看下一个师范的yml:
1 | version: "3" |
Compose的yml文件中有三个主要的组成:Services,Networks,Volumes。
service
一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建。
Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用。
我们看个栗子:
1 | services: |
上面的yaml文件功能和下面的一样:
1 | docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4 |
我们还可以直接指定Dockerfile文件,build出对应的镜像。
1 | service: |
Volumes
我们看到上面的yaml文件中有使用volumes:
1 | volumes: |
这么引用是因为我们需要在和services同级的地方定义一下这个volumes。
1 | volumes: |
上面相当于创建了一个volumes。
1 | docker volume create db-data |
Networks
我们看到上面的yaml文件中有使用networks:
1 | networks: |
这么引用是因为我们需要在和services同级的地方定义一下这个networks。
1 | networks: |
上面的相当于使用bridge当驱动创建了一个名为back-tier的网络。
1 | docker network create -d bridge back-tier |
我们看下如何将第一个小节部署的wordpress服务通过Docker Compose的yaml抒写:
1 | version: '3' # 表示使用版本 |
Docker Compose的安装和基本使用
安装
我们看下Linux环境下如何安装
官方文档:https://docs.docker.com/compose/install/#install-compose
直接执行下面命令安装:
1 | sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
赋予可执行权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
验证版本
1 | [root@hongshaorou ~]# docker-compose --version |
使用
我们看看如何使用
1 | ➜ wordpress ls |
当我们使用docker-compose up的时候会默认执行当前目录下名为docker-compose.yml的文件,我们同样可以使用-f参数指定文件。
1 | ➜ wordpress docker-compose -f docker-compose.yml up -d |
我们看下命令有哪些
1 | Commands: |
使用ps列出创建的容器。
上面说错了一点,services名字并不是容器的名字。
1 | ➜ wordpress docker-compose ps |
使用stop停止,使用start开启,使用down停止并删除
1 | ➜ wordpress docker-compose stop |
使用images可以查看创建的容器及其使用镜像
1 | ➜ wordpress docker-compose images |
使用exec进入到容器中
1 | ➜ wordpress docker-compose exec mysql bash |
上面我们使用的yaml文件是直接从远程拉取镜像,下面我们看一个Flask程序,镜像是通过Dockerfile创建而来的。
1 | ➜ flask-redis ls |
直接使用compose进行创建容器
1 | ➜ flask-redis docker-compose up -d |
运行完成后 查看浏览器

这样我们就使用compose通过Dockerfile创建了一个完成的容器应用。
水平扩展和负载均衡
上面我们已经成功运行起来了web服务,但是是单一的服务,当存在高并发的时候可用性较差。

这个小节,我们将完成上面的一个具有负载均衡的多服务的一个配置。
实现的主要技术点是使用scale,将容器扩展到指定数目。
1 | --scale SERVICE=NUM Scale SERVICE to NUM instances. Overrides the |
现在我们使用上节的yaml文件做实验,不过需要修改调端口映射,防止报错。
1 | version: "3" |
我们先运行起整个服务
1 | ➜ flask-redis docker-compose up -d |
上面三个web服务监听的事容器的5000端口,并没有端口映射,这三个web服务都会访问redis服务。
这时候虽然服务多了起来,但是还是需要一个负载均衡将访问均分到每个web服务。
现在我们根据老师提供的文件,增加上负载均衡。
1 | ➜ lb-scale ls |
首先我们创建服务:
1 | ➜ lb-scale ls |
看看有哪些容器
1 | ➜ lb-scale docker ps |
访问我们创建的服务
1 | ➜ lb-scale curl 127.0.0.1:8080 |
最后的69117a34ca80是容容器的ID。
我们将wbe服务扩展为三个然后再访问服务。
1 | ➜ lb-scale docker-compose up --scale web=3 -d |
通过最后打印的容器ID,我们可以看到通过负载均衡轮询分配。
scale不仅可以往大的方向扩展,还可以往小的方向收缩