这篇我们学习下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_PASSWORD
environment variable from the linkedmysql
container)
这样直接访问本地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不仅可以往大的方向扩展,还可以往小的方向收缩