boxmoe_header_banner_img

Hello! 欢迎来到盒子萌!

加载中

文章导读

docker-compose详讲


avatar
Jack 2023年 8月 28日 351

一、概述

docker-compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,轻松高效地管理容器,定义运行多个容器。

docker-compose 将所管理的容器分为三层:工程(project)、服务(service)以及容器(container)。

  • docker-compose 运行目录下的所有文件(docker-compose.yml 文件、extends 文件或环境变量等)组成一个工程,默认工程名为当前目录名。
  • 一个工程中可以包含多个服务,每个服务定义容器运行的镜像、参数、依赖。
  • 一个服务中可以包含多个容器实例,docker-compose 并未解决负载均衡,需要借助其他工具(如 consul)实现服务发现及负载均衡。
  • docker-compose 的工程配置文件默认是 docker-compose.yml,可通过环境变量 COMPOSE_FILE-f 参数自定义配置文件,实现多个相关服务及容器的定义。

官方文档:https://docs.docker.com/compose/
GitHub 主页:https://github.com/docker/compose/releases/

以前写过一篇基础文章,有兴趣可参考:Docker三剑客之Compose


二、Compose 和 Docker 兼容性

Compose 文件格式有多个版本:1、2、2.x 和 3.x。
下面表格展示了不同 Compose 文件版本所支持的 Docker 发行版(具体版本请参考官方文档)。


三、安装 Docker

安装 yum-config-manager 配置工具

yum -y install yum-utils

建议使用阿里云 yum 源(推荐)

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 docker-ce 版本

yum install -y docker-ce

启动 Docker 并设置开机启动

systemctl enable --now docker
docker --version

四、安装 docker-compose

官方安装教程:https://docs.docker.com/compose/install/other/

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

五、环境变量

1)在 docker-compose.yml 文件中直接设置环境变量:

services:
  web:
    image: nginx
    environment:
      MY_VAR: my_value

2)从 .env 文件中读取环境变量:

services:
  web:
    image: nginx
    env_file:
      - .env

3)使用 shell 环境变量:

$ export MY_VAR=my_value
$ docker-compose up

docker-compose.yml 中引用 shell 环境变量:

services:
  web:
    image: nginx
    environment:
      MY_VAR: ${MY_VAR}

六、字段详解 示例

version、services 示例:

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

build 示例:

services:
  web:
    build: ./my-web-app

build 和 image 同时写:

version: '3.8'
services:
  web:
    build: ./web
    image: myapp/web:latest

网络定义:

networks:
  my-network:
    driver: bridge

数据卷定义:

volumes:
  my-volume:
    driver: local

端口配置:

ports:
  - "8080:80"

expose 示例:

version: '3'
services:
  web:
    image: myapp:latest
    expose:
      - "8000"
      - "8080"

depends_on 示例:

depends_on:
  - db

restart 示例:

version: '3'
services:
  web:
    image: myapp:latest
    restart: always

command 多种写法:

字符串:

command: python manage.py runserver 0.0.0.0:8000

列表:

command:
  - python
  - manage.py
  - runserver
  - 0.0.0.0:8000

shell:

# command: sh -c "python manage.py runserver 0.0.0.0:8000"
command: ["sh","-c","python manage.py runserver 0.0.0.0:8000"]

healthcheck 示例:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost/health"]
  interval: 30s
  timeout: 10s
  retries: 3

configs 示例:

configs:
  - source: my-config
    target: /etc/nginx/conf.d/default.conf

secrets 示例:

secrets:
  - db_password

hostname 和 container_name 示例:

version: '3'
services:
  web:
    image: myapp:latest
    container_name: myapp

user 示例:

version: "3"
services:
  web:
    image: nginx
    user: nginx:nginx

在这个示例中,web 服务的容器名称被设置为 myapp。
总之,hostname 和 container_name 都是用于定义容器的标识符,但是 hostname 用于容器内部的标识,container_name 用于 Docker 主机上的标识。


user 字段说明

在 Docker Compose 中,user 字段用于指定容器中运行进程的用户和用户组,类似于 docker run --user
有以下三种形式:

  1. user:group(推荐),以用户和用户组身份运行:
version: "3"
services:
  web:
    image: nginx
    user: nginx:nginx
  1. uid:gid,以用户ID和组ID身份运行:
version: "3"
services:
  web:
    image: nginx
    user: "1000:1000"
  1. 只指定用户:
version: "3"
services:
  web:
    image: nginx
    user: nginx

注意:使用 user 字段后,容器中的所有进程将以指定用户身份运行,提升安全性,避免以 root 身份运行带来的安全风险。


deploy 示例

deploy:
  replicas: 3
  resources:
    limits:
      cpus: '0.5'
      memory: '256M'
    reservations:
      cpus: '0.25'
      memory: '128M'

七、port 和 expose 区别

portsexpose 都用于暴露端口,但含义不同:

  • ports 将容器端口映射到宿主机端口,允许外部访问。
  • expose 只是告诉 Docker 该端口会被暴露给其他容器,不映射到宿主机。

ports 示例:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"

expose 示例:

version: "3"
services:
  db:
    image: mysql
    expose:
      - "3306"
  web:
    image: nginx
    expose:
      - "80"

八、configs 与 secrets 区别

version: '3.7'
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    configs:
      - source: nginx_conf
        target: /etc/nginx/nginx.conf
    secrets:
      - source: db_password
        target: /run/secrets/db_password

configs:
  nginx_conf:
    file: ./nginx.conf

secrets:
  db_password:
    file: ./db_password.txt

九、挂载

1)命名卷挂载

version: "3.7"
services:
  app:
    image: myapp:latest
    volumes:
      - myapp_data:/app/data

volumes:
  myapp_data:

2)主机目录挂载

version: "3.7"
services:
  app:
    image: myapp:latest
    volumes:
      - /host/data:/app/data

十、网络

1)bridge 网络类型

version: '3'
services:
  web:
    build: .
    ports:
      - "80:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

2)host 网络类型

version: '3'
services:
  web:
    build: .
    network_mode: host

3)none 网络类型

version: '3'
services:
  worker:
    build: .
    network_mode: none

4)自定义网络

version: '3'
services:
  web:
    image: nginx
    networks:
      - my_network

networks:
  my_network:
    driver: bridge

在这个示例中,web 服务被连接到 my_network 网络,而不是默认的网络。该网络使用 bridge 驱动,这是 Docker Compose 默认的网络类型。


📁 Compose 项目目录说明:

Compose 项目目录是包含 docker-compose.yml 文件的目录。通常结构如下:

myapp/
├── docker-compose.yml
├── app/
│   ├── Dockerfile
│   └── app.py
└── data/

在此示例中:

  • myapp 是项目目录名。
  • docker-compose.yml 是定义服务的 Compose 文件。
  • app/ 存放应用代码和构建文件。

十一、域名解析(DNS)

在 Docker Compose 中,容器可以通过 服务名或容器名 相互访问,无需使用 IP 地址。

示例说明:

  • Compose 会为每个服务自动创建 DNS 记录。
  • 默认网络名为 <projectname>_default
  • 可使用以下命令查看服务的 DNS 名称:
docker-compose run  nslookup 

示例:

docker-compose run web nslookup web

输出结果类似:

Server: 127.0.0.11
Address 1: 127.0.0.11
Name: web
Address 1: 172.18.0.2

说明 web 服务的 DNS 名称为 "web",可直接通过该名称访问。


十二、健康检查(Healthcheck)

Docker Compose 支持为服务定义健康检查,用于确认服务是否正常运行。

1)基本语法:

healthcheck:
  test: ["CMD-SHELL", "command"]
  interval: 30s
  timeout: 10s
  retries: 3

参数说明:

  • test:执行的检测命令。
  • interval:检测间隔,默认 30s。
  • timeout:检测超时,默认 30s。
  • retries:最大重试次数,默认 3。

2)三种写法示例:

① 字符串形式:

healthcheck:
  test: curl --fail http://localhost:80 || exit 1
  interval: 30s
  timeout: 10s
  retries: 5

② 数组形式(CMD):

healthcheck:
  test: ["CMD", "curl", "--fail", "http://localhost:80"]
  interval: 30s
  timeout: 10s
  retries: 5

③ Shell 形式(推荐):

healthcheck:
  test: ["CMD-SHELL", "curl --fail http://localhost:80 || exit 1"]
  interval: 30s
  timeout: 10s
  retries: 5

3)示例:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "80:80"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m
      timeout: 10s
      retries: 3

启动服务:

docker-compose up

查看健康状态:

docker-compose ps

输出示例:

Name               Command                  State        Ports
webapp_web_1       nginx -g daemon off;     Up (healthy) 0.0.0.0:80->80/tcp

十三、常用命令

- docker-compose up:启动并创建所有服务
- docker-compose down:停止并删除服务与网络
- docker-compose ps:显示服务状态
- docker-compose logs:查看容器日志
- docker-compose build:构建镜像
- docker-compose pull:拉取镜像
- docker-compose restart:重启服务
- docker-compose stop:停止服务
- docker-compose start:启动服务
- docker-compose exec  :在容器中执行命令
- docker-compose run  :运行一次性命令
- docker-compose config:检查配置语法并显示合并后的配置


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码