Docker Compose

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。有以下三个选项

  • json-file
  • syslog
  • none

仅在 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。

# 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 <<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  # 只启动容器 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
### Docker Compose 使用指南 #### 简介 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件(`docker-compose.yml`),可以配置应用程序所需的所有服务、网络和卷等资源。然后,使用简单的命令即可创建并启动所有服务[^2]。 #### 基本概念 - **服务(Service)**:一个服务代表一个容器实例。可以在 `docker-compose.yml` 文件中定义多个服务,每个服务都有自己的镜像、端口映射、环境变量等。 - **工程(Project)**:Docker Compose 中的“工程”是指包含所有服务的集合。默认情况下,工程名是当前目录名,但也可以通过 `-p` 参数自定义工程名[^2]。 - **YAML 文件**:`docker-compose.yml` 是 Docker Compose 的核心配置文件,用于定义服务、网络、卷等资源。YAML 是一种简洁的数据序列化格式,易于阅读和编写[^2]。 #### 安装 Docker Compose Docker Compose 可以通过以下命令安装在 Linux 系统上: ```bash 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` 验证是否安装成功。输出应类似于 `Docker Compose version v2.2.3`[^2]。 #### 常用命令 以下是一些常用的 Docker Compose 命令及其用途: - **启动服务** ```bash docker-compose up ``` 该命令会构建并启动所有在 `docker-compose.yml` 文件中定义的服务。加上 `-d` 参数可以让服务在后台运行: ```bash docker-compose up -d ```[^3] - **停止服务** ```bash docker-compose stop ``` 该命令会停止所有正在运行的服务。如果需要停止特定服务,可以指定服务名称: ```bash docker-compose stop <service_name> ``` - **删除容器** ```bash docker-compose rm ``` 该命令会删除所有已停止的容器。如果需要删除特定容器,可以指定服务名称: ```bash docker-compose rm <service_name> ``` - **查看运行中的容器** ```bash docker-compose ps ``` 该命令会列出所有正在运行的容器及其状态。 - **查看日志** ```bash docker-compose logs ``` 该命令会显示所有服务的日志信息。如果需要查看特定服务的日志,可以指定服务名称: ```bash docker-compose logs <service_name> ``` - **构建或重新构建服务** ```bash docker-compose build ``` 该命令会构建或重新构建所有服务。如果需要构建特定服务,可以指定服务名称: ```bash docker-compose build <service_name> ```[^3] - **启动已存在的容器** ```bash docker-compose start ``` 该命令会启动所有已存在的容器。如果需要启动特定容器,可以指定服务名称: ```bash docker-compose start <service_name> ``` - **通过发送 SIGKILL 信号停止服务** ```bash docker-compose kill ``` 该命令会通过发送 SIGKILL 信号来强制停止所有服务。如果需要停止特定服务,可以指定服务名称: ```bash docker-compose kill <service_name> ``` #### YAML 文件示例 以下是一个简单的 `docker-compose.yml` 文件示例,定义了一个名为 `web` 的服务,使用 `nginx` 镜像,并将本地的 `./html` 目录挂载到容器中的 `/usr/share/nginx/html` 目录: ```yaml version: '3' services: web: image: nginx ports: - "80:80" volumes: - ./html:/usr/share/nginx/html ``` 在这个示例中,`version` 指定了 Docker Compose 文件的版本,`services` 定义了所有服务,`web` 是服务名称,`image` 指定了使用的镜像,`ports` 定义了端口映射,`volumes` 定义了卷映射[^2]。 #### 注意事项 - **运行目录**:Docker Compose 命令必须在 `docker-compose.yml` 文件所在的目录中运行,否则会报错。如果修改了配置文件并且 `docker-compose up -d` 未成功,建议先运行 `docker-compose stop`,然后运行 `docker-compose rm`,最后重新构建镜像: ```bash docker-compose stop docker-compose rm docker-compose build ```[^1] - **工程名**:默认情况下,Docker Compose 会使用当前目录名作为工程名。如果需要自定义工程名,可以在命令中使用 `-p` 参数,例如: ```bash docker-compose -p myproject up -d ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值