1. 简介
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.3
3. 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 和 redis - docker-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。有以下三个选项
仅在 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。
logging:
driver: json-file
options:
max-size: "200k"
max-file: "10"
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:
driver: custom-driver-1
other-network:
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
stop_grace_period: 1m30s
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 <<EOF
bind 0.0.0.0
protected-mode yes
port 6379
daemonize no
loglevel notice
databases 16
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir /data
EOF
$ cat > conf/mysql.cnf <<EOF
[mysql]
default-character-set=utf8mb4
[client]
port=3306
default-character-set=utf8mb4
[mysqld]
port=3306
character-set-server=utf8mb4
default-time-zone='+08:00'
long_query_time=5
EOF
$ cat > docker-compose.yml <<EOF
version: "3"
services:
mysql:
image: mysql:8.0.28
container_name: mysql-server
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MYSQL_ROOT_PASSWORD: "123456"
depends_on:
- redis
volumes:
- ./conf/mysql.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- ./data/mysql:/var/lib/mysql
redis:
image: redis:5.0.12
container_name: redis-server
ports:
- 6379:6379
restart: always
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- ./data/redis:/data
- ./conf/redis.conf:/etc/redis/redis.conf
command:
redis-server /etc/redis/redis.conf
EOF
docker-compose up
5. 管理命令
docker-compose up -d
docker-compose up --no-recreate -d
docker-compose up -d 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)