一、作用
个人理解:使用容器编排工具可以批量的管理容器、或容器组。比如有依赖关系的几个容器共通组成的服务,典型的有dockerhub。比如在单个服务启动后需要留启动脚本记录容器启动命令的情况。
官方文档
二、安装
yum -y install epel-release
yum -y install python-pip
pip install docker-compose
docker-compose version
三、使用
注意:使用docker-compose需要编写docker-compose.yml文件,并在文件的同级目录下执行。
1.docker-compose.yaml
version: '3'
services:
socket5:
image: hub.ict.ac.cn/local_proxy/local_proxy:v3
container_name: socket5
restart: always
ports:
- '7012:7012'
stdin_open: true
tty: true
busybox:
image: docker.io/busybox
container_name: busybox
stdin_open: true
tty: true
2.指令
- version 指定了 compose file 的版本,最新的版本为 3.4
- services 下定义服务,这里定义了一个爬虫服务 spider
- build 指定构建镜像上下文、Dockerfile 文件和 ARGS 等
- volumes 用于创建卷并挂载,这里挂载了源码目录和数据存储目录
- command 指定服务启动时执行的命令,参考 Dockerfile COMMAND
image: 指定容器启动的镜像
build: 服务除了可以基于指定的镜像
command: 使用 command 可以覆盖容器启动后默认执行的命令
**container_name**: 指定运行时容器名称,而不使用默认格式(<项目名称><服务名称><序号>)
**restart**:重启策略
**depends_on**: 指明服务之间依赖,解决了容器的依赖、启动先后的问题
dns: 指定 DNS 服务器。
tmpfs: 挂载临时目录到容器内部,与 run 的参数一样
entrypoint: 在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令
env_file: 专门存放变量的文件。如果通过 docker-compose -f FILE 指定了配置文件,则 env_file 中路径会使用配置文件路径。如果有变量名称与 environment 指令冲突,则以后者为准
environment: 与上面的 env_file 设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置
expose: 这个标签与 Dockerfile 中的 EXPOSE 指令一样,用于指定暴露的端口
external_links:让 Compose 项目里面的容器连接到那些项目配置外部的容器
extra_hosts: 添加主机名的标签,就是往 /etc/hosts 文件中添加一些记录
labels: 向容器添加元数据,和 Dockerfile 的 LABEL 指令一个意思
**links**: 上面的 depends_on 标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与 Docker client 的 –link 一样效果,会连接到其它服务中的容器。
logging: 用于配置日志服务。默认的 driver 是 json-file
pid: 将 PID 模式设置为主机 PID 模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。
ports: 映射端口的标签。使用 HOST:CONTAINER 格式或者只是指定容器的端口,宿主机会随机映射端口。
security_opt: 为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。
stop_signal: 设置另一个信号来停止容器。在默认情况下使用的是 SIGTERM 停止容器。设置另一个信号可以使用 stop_signal 标签。
volumes: 挂载一个目录或者一个已存在的数据卷容器
cap_add, cap_drop: 添加或删除容器的内核功能
devices: 设备映射列表
extends: 这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置。
3.启动、关闭
启动
docker-compose up
如果启动时指定-d标志,则以守护进程模式运行服务
docker-compose up -d
如果要批量启动服务(如启动 8 个 Scrapy),则在--scale选项指定服务的个数:
docker-compose up -d --scale spider=8
列出本地 docker-compose.yml 文件里定义的正在运行的所有服务
docker-compose ps
logs: 查看服务的日志,这个命令会追踪服务的日志文件,类似tail -f命令,使用Ctrl+C退出
docker-compose logs
stop: 停止所有服务,如果服务没有停止,可以使用docker-compose kill强制杀死服务
docker-compose stop
rm: 删除所有服务
docker-compose rm
4、官方示例
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data: