一、Docker-Compose简介
参考Docker基础知识和使用示例 Docker:Docker Compose 详解
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。然而在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。而使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,其定义了多个有依赖关系的服务及每个服务运行的容器。
比如说,一个项目有数据库服务mysql-service、远程字典服务redis-service和项目自身的Web服务seckill(秒杀系统),其docker-compose.yml如下所示,此yml文件将上诉几个容器关联为一个项目,默认直接从上到下按顺序启动容器,所以seckill需要放最后。
version: "2"
services:
mysql-service:
image: mysql:5.7 #指定服务所使用的镜像
ports:
- "3306:3306"
restart: always
environment: #环境变量配置
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "dev"
MYSQL_USER: "developer"
MYSQL_PASSWORD: "123456"
redis-service:
image: redis
command: redis-server --requirepass 123456 #覆盖容器启动后默认执行的命令
ports:
- "6379:6379"
restart: always
seckill:
restart: always
build: ./ #Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "8000:8000"
links: #链接到其它服务中的容器
- mysql-service:mysql
- redis-service:redis
二、安装 Docker Compose
通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限。github源不稳定,速度极慢。建议使用daocloud源。
#github源
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#daocloud源
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Docker相关换源参考:Docker快速安装以及换镜像源
查看安装是否成功
docker-compose -v
输出
docker-compose version 1.25.0, build 0a186604
三、Docker-Compose模板文件示例
1、docker-compose模板文件编写
docker-compose.yaml文件如下:
version: '2'
services:
web1:
image: nginx
ports:
- "6061:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx
ports:
- "6062:80"
container_name: "web2"
networks:
- dev
- pro
web3:
image: nginx
ports:
- "6063:80"
container_name: "web3"
networks:
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
docker-compose.yaml文件指定了三个web服务。
2、启动应用
创建一个webapp目录,将docker-compose.yaml文件拷贝到webapp目录下,使用docker-compose启动应用。
docker-compose up -d
3、服务访问
通过浏览器访问web1,web2,web3服务:
http://127.0.0.1:6061
http://127.0.0.1:6062
http://127.0.0.1:6063
运行结果如下:
root@zhongzhanhui-VirtualBox:/home/zhongzhanhui/GoProject# mkdir docker_compose_try
root@zhongzhanhui-VirtualBox:/home/zhongzhanhui/GoProject# cd docker_compose_try/
root@zhongzhanhui-VirtualBox:/home/zhongzhanhui/GoProject/docker_compose_try# vi docker-compose.yaml
root@zhongzhanhui-VirtualBox:/home/zhongzhanhui/GoProject/docker_compose_try# docker-compose up -d
Creating network "docker_compose_try_dev" with driver "bridge"
Creating network "docker_compose_try_pro" with driver "bridge"
Pulling web1 (nginx:)...
latest: Pulling from library/nginx
000eee12ec04: Pull complete
eb22865337de: Pull complete
bee5d581ef8b: Pull complete
Digest: sha256:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
Status: Downloaded newer image for nginx:latest
Creating web2 ... done
Creating web3 ... done
Creating web1 ... done
浏览器输入上述三个服务的地址后,都显示"Welcome to nginx!",代表nginx服务启动成功。
输入命令docker ps
查看现在正在运行的容器
root@zhongzhanhui-VirtualBox:/home/zhongzhanhui/GoProject/docker_compose_try# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
325541bca9c3 nginx "nginx -g 'daemon of…" 6 minutes ago Up 5 minutes 0.0.0.0:6063->80/tcp web3
e2106b09e031 nginx "nginx -g 'daemon of…" 6 minutes ago Up 5 minutes 0.0.0.0:6061->80/tcp web1
f972b5a3c391 nginx "nginx -g 'daemon of…" 6 minutes ago Up 5 minutes 0.0.0.0:6062->80/tcp web2
可见有web1、web2、web3这三个容器正在运行中。