Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。
使用Compose 基本上分为三步:
1. Dockerfile 定义应用的运行环境
2. docker-compose.yml 定义组成应用的各服务
3. docker-compose up 启动整个应用
基本规则:
1. 大小写敏感
2. 使用缩进表示层级关系
3. 禁止使用tab缩进,只能使用空格键
4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
5. 使用#表示注释
6. 字符串可以不用引号标注
## 安装Compose
Compose网站:[https://docs.docker.com/compose/](https://docs.docker.com/compose/)
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
## 编写示例
```
version: "3"
services:
nginx:
# docker镜像,先拉取本地,再拉取云端
image: nginx:${NGINX_VERSION}
# 容器名称
container_name: web
# 端口映射
ports:
- "${NGINX_HTTP_HOST_PORT}:80"
# 数据挂载 宿主机:docker 此处可以写相对路径
volumes:
- ${SOURCE_DIR}:/var/www/html/:rw
# 重启策略
# no是默认的重启策略,在任何情况下都不会重启容器。
# 指定为always时,容器总是重新启动。
restart: always
# 注意:如果服务之间是在同个networks之下的话就可以通过 服务名:port 来访问链接
networks:
- default
php72:
# build用context指定的dockerfile创建
build:
context: .
# 传入dockerfile里面的参数,注意与context同级,在dockerfile里面通过ARG接收
args:
- PHP_VERSION: ${PHP72_VERSION}
# 指定容器名称
container_name: php72
# 链接到另一个服务中的容器 SERVICE:ALIAS
# 在当前的web服务的容器中可以通过链接的db服务的别名database访问db容器中的数据库应用
# 如果没有指定别名,则可直接使用服务名访问。
links:
- db:database
# 链接到docker-compose.yml 外部的容器
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresq
# 使用该参数,container内的root拥有真正的root权限。
# 否则,container内的root只是外部的一个普通用户权限。
privileged: true
# 容器名称
container_name: php72
# 启动时必须等mysql服务启动好
depends_on:
- mysql
cap_add:
- SYS_PTRACE
networks:
- default
mysql:
image: mysql:${MYSQL_VERSION}
ports:
- "${MYSQL_HOST_PORT}:3306"
volumes:
- ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
- ${MYSQL_DATA_DIR}:/var/lib/mysql/:rw
restart: always
networks:
- default
# 环境变量传入dockerfile里面的变量
# 与args不同environment定义的变量在容器内部也可以反问
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
redis:
image: redis:${REDIS_VERSION}
ports:
- "${REDIS_HOST_PORT}:6379"
volumes:
- ${REDIS_CONF_FILE}:/etc/redis.conf:ro
restart: always
entrypoint: ["redis-server", "/etc/redis.conf"]
networks:
- default
# 指定其为同个docker网络
# docker network ls来查看
# 同一网络下,可以通过服务名来互联
networks:
default:
```
- 变量来自同目录下的.env文件
- php通过同级目录的dockerfile来构建
- 镜像改了之后要通过`docker-compose build --no-cache` 来重新构建一下
## 常用命令
* **ps**:列出所有运行容器
~~~
docker-compose ps
~~~
* **logs**:查看服务日志输出
~~~
docker-compose logs // 加-f,持续输出。
~~~
* **port**:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
~~~
docker-compose port eureka 8761
~~~
* **build**:构建或者重新构建服务
~~~
docker-compose build
~~~
* **start**:启动指定服务已存在的容器
~~~
docker-compose start eureka
~~~
* **stop**:停止已运行的服务的容器
~~~
docker-compose stop eureka
~~~
* **rm**:删除指定服务的容器
~~~
docker-compose rm eureka
~~~
* **up**:构建、启动容器
~~~
docker-compose up
~~~
* **kill**:通过发送 SIGKILL 信号来停止指定服务的容器
~~~
docker-compose kill eureka
~~~
* **pull**:下载服务镜像
* **scale**:设置指定服务运气容器的个数,以 service=num 形式指定
~~~
docker-compose scale user=3 movie=3
~~~
* **run**:在一个服务上执行一个命令
~~~
docker-compose run 容器名 bash
~~~
>[info]
> 1. 通过docker-compose编排的的容器是没有容器自己的ip,因为他们共用一个或多个network,可以通过`docker network ls`来查看,可以通过服务名来链接网络,`docker network inspect <container id>`可以查看对应网络的配置。
> 2. 通过docker-compose build的dockerfile一定要有CMD \[ "/bin/bash" \]等执行命令,才能通过docker-compose up起来
### 更多参考
* [官方技术文档](https://docs.docker.com/compose/)
* [compose file reference](https://docs.docker.com/compose/compose-file/)
* [docker-compose的每个设置项都介绍了](https://docs.docker.com/compose/compose-file/#network-configuration-reference)
* [docker-compose各参数中文解释](https://blog.csdn.net/qq_29349715/article/details/80818605)