Docker-Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层:
工程(project)服务(service)容器(container)
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
2. 安装$ curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose $ docker-compose --version Docker Compose version v2.2.33. YAML 模板
默认模板文件为 docker-compose.yml
version:指定版本,不同版本的语法略有差异
build:镜像构建参数
version: "3.7"
services:
webapp:
build:
context: .
dockerfile: Dockerfile
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
context:路径dockerfile:Dockerfile 文件名args:构建参数,即构建过程中的环境变量labels:设置构建镜像的标签target:多层构建,可以指定构建哪一层
cap_add,cap_drop:添加或删除容器拥有的宿主机的内核功能
cap_add: - ALL # 开启全部权限 cap_drop: - SYS_PTRACE # 关闭 ptrace权限
cgroup_parent:为容器指定父 cgroup 组,意味着将继承该组的资源限制
cgroup_parent: m-executor-abcd
command:覆盖容器启动的默认命令
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name:指定自定义容器名称,而不是自动生成的名称
container_name: mysql-server
depends_on:启动依赖关系
docker-compose up :以依赖性顺序启动服务。docker-compose up SERVICE :自动包含 SERVICE 的依赖项。docker-compose up web 还将创建并启动 db 和 redisdocker-compose stop :按依赖关系顺序停止服务。先启动的后停止
注意:web 服务不会等待 redis db 完全启动 之后才启动。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
devices:指定设备映射列表
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
dns: 自定义 DNS 服务器
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
dns_search: 自定义 DNS 搜索域。可以是单个值或列表
dns_search: google.com dns_search: - google.com - baidu.com
entrypoint: 覆盖容器默认的 entrypoint
entrypoint: /bin/entrypoint.sh entrypoint: - redis-server - /etc/redis/redis.conf
env_file: 从文件添加环境变量
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
environment: 添加环境变量
environment: RACK_ENV: development SHOW: 'true'
expose:暴露端口,但不映射到宿主机,只被连接的服务访问。
expose: - "3000" - "8000"
extra_hosts: 添加主机名映射。类似 docker client --add-host。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost 50.31.209.229 otherhost
healthcheck: 用于检测 docker 服务是否健康运行。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s # 启动后,多少秒开始启动检测程序
image: 指定容器运行的镜像
image: ubuntu:14.04
logging:服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
json-filesyslognone
仅在 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。
# json-file
logging:
driver: json-file
options:
max-size: "200k"
max-file: "10"
# syslog
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode:网络模式
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks:配置容器连接的网络,引用顶级 networks 下的条目
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
restart:重启策略
no:默认不重启always:容器总是重新启动on-failure:在容器非正常退出时(退出状态非0),才会重启容器。unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no" restart: always restart: on-failure restart: unless-stopped
secrets: 存储敏感数据:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
security_opt: 修改容器默认的 schema 标签
security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period: 指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。
stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒
stop_signal: 设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1
sysctls: 设置容器中的内核参数,可以使用数组或字典格式。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
tmpfs: 在容器内安装一个临时文件系统。可以是单个值或列表的多个值
tmpfs: /run tmpfs: - /run - /tmp
ulimits: 覆盖容器默认的 ulimit
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes: 将主机的数据卷或着文件挂载到容器里
version: "3.7"
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
其他:
user: nginx # 容器运行用户 working_dir: /opt/mysql # 工作空间 domainname: your_website.com hostname: test mac_address: 08-00-27-00-0C-0A privileged: true read_only: true stdin_open: true # 打开标准输入,可以接受外部输入 tty: true # 模拟一个伪终端4. 示例 4.1 redis-mysql
$ mkdir -p ~/redis-mysql && cd $_ $ mkdir -p conf $ mkdir -p data/redis $ mkdir -p data/mysql $ cat > conf/redis.conf <conf/mysql.cnf < docker-compose.yml < 5. 管理命令 docker-compose up -d # 后台方式 docker-compose up --no-recreate -d docker-compose up -d redis # 只启动容器 redis docker-compose stop docker-compose start docker-compose down # 停止并销毁容器6. 开机自启# 方法一:跟随系统 crontab -e @reboot sleep 60 && /usr/local/bin/docker-compose -f /root/redis-mysql/docker-compose.yml up -d # 方法二:重启策略 restart: always



