Skip to content
🗂️ 文章分类: 容器  
🏷️ 文章标签: Docker  
📝 文章创建时间: 2023-10-12
🔥 文章最后更新时间:2025-09-22

[toc]

Docker-compose笔记1

Docker-compose是什么?

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。即用于批量管理多个Docker 容器。

在日常工作中,一个项目往往需要多个容器相互配合来运行。例如实现一个Web项目,除了Web服务容器,还需要数据库服务容器,负载均衡容器等。

并且一旦引入N个容器,容器之间就会形成某种依赖关系。也就意味某个容器的运行需要其他容器优先启动之后才能正常运行。因此容器的运行一定要有先后顺序。

而Docker-compose是 Docker 官方的开源项目。它可以批量管理多个Docker 容器,它允许用户通过一个单独的docker-compose.yml 模板文件,来定义一组相关联的应用容器为一个项目(project)。

简单来说:Docker-compose就是用来管理多个容器的,定义启动顺序的,合理编排,方便管理。

Docker-compose的两个核心概念

项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。 服务 ( service ):一个应用的容器,实际上可以包括若干个运行相同镜像的容器实例。

Docker-compose的使用步骤

  1. 先编写项目中各个容器用到的dockerfile文件,然后通过dockerfile命令构建好各个容器对应的自定义镜像。(如果使用官方镜像,则这一步可省略。)
  2. 再编写docker-compose.yml文件。在该文件中编排各个容器的启动顺序、依赖关系、环境变量、挂载卷等。
  3. 执行docker-compose up命令,来批量创建docker-compose.yml文件中定义的各个容器。

Docker-compose 注意事项

注意:只有在 Linux 系统上安装docker时没有自动安装docker-compose。而 windows、macos平台安装docker时会自动安装docker-compose。

ubuntu安装docker-compose

docker-compose是docker的独立产品,因此需要安装docker之后再单独安装docker compose。

shell
# 下载并安装docker-compose到/usr/local/bin/docker-compose目录中
curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 赋予docker-compose目录中的文件可执行权限
# linux系统中,只有被赋予执行权限的文件才能执行。普通文件不能被执行。
sudo chmod +x /usr/local/bin/docker-compose

# 查询docker-compose的版本
docker-compose version

docker_20231023185503.png

如何卸载docker-compose,直接删除即可

shell
sudo rm /usr/local/bin/docker-compose

注意事项

注意:如果网络卡顿,可以将链接中的 docker-compose-linux-x86_64 文件提前下载下来,然后将该文件重命名为docker-compose,并上传到/usr/local/bin目录中,再执行后续命令。

docker-compose常用命令

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务(或者说容器)。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务(或者说容器)都会受到命令影响。

运行这些命令需要结合docker-compose一起使用。并且必须要在docker-compose.yml文件的所在目录中才可以使用命令。不然报错。

docker-compose 命令的基本的使用格式

shell
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

# -v, --version 打印docker-compose版本并退出。
# -f, --file file_name 指定使用的 docker-compose 模板文件的路径,默认为 docker-compose.yml。
# -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
# --verbose 输出更多调试信息。
# --env-file file_name 指定项目使用的环境变量文件的路径,默认是 .env 文件。

常用命令

shell
# 帮助命令
docker-compose --help
docker-compose -h

# 检查docker-compose的配置
docker-compose config 
docker-compose config -q

# 重启docker-compose服务
docker-compose restart

# 启动docker-compose服务
docker-compose start

# 停止docker-compose服务
docker-compose stop

# 启动命令
# 创建docker-compose.yml文件中定义的各个容器并启动容器。
docker-compose up 
# 创建docker-compose.yml文件中定义的各个容器并启动容器。并后台运行
docker-compose up -d

# 停止命令
# 停止所有up 命令所启动的容器,并移除⽹络,镜像等。默认保留卷。
docker-compose down 

# 查询当前docker-compose编排的容器
docker-compose ps

# 查询当前docker-compose编排的容器进行
docker-compose top

# 进入docker-compose编排的容器终端
docker-compose exec yml文件中的服务id /bin/bash

# 查询docker-compose编排的容器日志
docker-compose logs yml文件中的服务id

docker-compose up 命令

docker-compose up 命令功能十分强大,它可以根据docker-compose.yml文件中定义的服务,批量创建并启动容器。大部分时候都可以直接通过该命令来启动一个项目中的所有服务。

  • 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
  • 默认情况下,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。此时可以通过 Ctrl-C 命令来停止所有容器。
  • 如果使用 docker-compose up -d 命令,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
  • 如果使用 docker-compose up 服务id 命令,就是对当前项目中的容器服务进行操作

该命令格式如下

shell
docker-compose up [options] [SERVICE...]

# -d 在后台运行服务容器。
# --build:启动前重新构建镜像。
# --no-color 不使用颜色来区分不同的服务的控制台输出。
# --no-deps 不启动服务所链接的容器。
# --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
# --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
# --no-build 不自动构建缺失的服务镜像。
# -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

docker-compose down 命令

docker-compose down 命令用于停止 docker-compose up 命令所启动的容器,并移除⽹络,镜像等。但不会移除数据卷。

  • docker-compose down 服务id:停止并移除模板文件中指定的服务容器。
  • 如果使用 docker-compose down -v 命令,还会移除所有的卷。

docker-compose exec 命令

docker-compose exec 命令用于在指定的容器中执行命令。

shell
# 用于进入指定的容器。
docker-compose exec 服务id /bin/bash

docker-compose ps 命令

docker-compose ps 命令用于列出项目中目前的所有容器。

shell
# 查看所有容器的状态
docker-compose ps

# 查看项目中某个指定容器的状态
docker-compose ps 服务id

docker-compose top 命令

docker-compose top 命令用于查看项目中各个容器的进程信息。

shell
# 查看所有容器的进程信息
docker-compose top

# 查看项目中某个指定容器的进程信息
docker-compose top 服务id

docker-compose logs 命令

docker-compose logs 命令用于查看 docker-compose up 命令所启动的容器的日志。

默认情况下,将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

shell
# 查看所有容器的日志
docker-compose logs

# 查看项目中某个指定容器的日志
docker-compose logs 服务id

docker-compose.yml文件

下面是一个docker-compose.yml文件的范例

yml
# 指定Compose文件版本号,当前版本为3。
version: "3"
# 定义每个服务(即容器)的配置信息,包括服务名称、镜像、端口映射、环境变量等。
services:
  # 服务名称(可任意自定义)
  redis:
    # 容器的内部工作目录
    working_dir: "/usr/local"
    # 容器运行后的启动命令
    command: "redis.server /etc/redis/redis.conf"  
    # redis容器使用到的镜像
    image: redis:alpine
    # redis容器的端口映射
    ports:
      - "6379:6379"
    # 容器需要连接的docker网络
    networks:
      - my_network

  db:
    image: postgres:9.4
    # 设置容器数据卷
    volumes:
      - /home/db-data:/var/lib/db-data
    # 设定容器的环境变量
    environment:
      - MYSQL_ROOT_PASSWORD=example  
    networks:
      - my_network
 
  # 后端服务01
  backend-service01:
    image: shuyx/xxx:latest   # 该服务使用的容器
    ports:
      - 8000:80
    networks:
      - my_network
    # 依赖关系,表示该容器依赖redis和db容器。因此该容器会在redis和db容器启动后,在启动。
    depends_on:
      - redis
      - db
 
  # 前端服务01
  frontend-service01:
    # build属性用于指定dockerfile文件的路径。
    build: /homg/dockerfile
    ports:
      - 9000:80
    networks:
      - my_network
    depends_on:
      - redis
      - db

# 设置docker网络,创建一个名为my_network的网络
networks:
  my_network:

docker-compose.yml文件中有许多配置属性。下面来解释一下。具体的全部属性,需要自行去官网查询。

version:指定Compose文件版本号,当前版本为3。

services:自定义每个服务(即容器)的配置信息,包括自定义服务名称、镜像、端口映射、环境变量等。

container_name: 指定容器名称。不指定会默认使用 项目名称_服务名称_序号 这样的格式。

working_dir:定义容器中的工作目录。

command: 定义容器的启动后默认执行的命令

build: 用于指定Dockerfile文件所在路径。

networks:定义网络配置信息,包括网络名称、IP地址段等。

volumes:定义数据卷配置信息,包括挂载点和卷类型等。

environment/env_file:设置环境变量,可以在services和networks级别设置全局或者在单个服务中设置特定环境变量。env_file属性用于从文件中读取环境变量。

ports/expose:ports属性用于将容器端口映射到主机上的端口,expose属性则仅暴露容器内部端口而不进行映射。

volumes:设置容器的数据卷。

depends_on / links:depends_on属性用于指定依赖关系,在启动时需要先启动依赖的服务。links属性则用于创建链接到其他容器或服务中的别名。

restart / recreate / no-recreate: 设置容器重启策略。restart属性值有no、always、on-failure三种。recreate表示在容器停止后重新创建新的实例;no-recreate则表示不会重新创建新的实例。

deploy:用于在Docker Swarm中部署服务时定义服务的配置信息,包括副本数、更新策略等。

container_name属性 (不推荐使用)

container_name属性用于指定容器名称。不指定会默认使用 项目名称_服务名称_序号 这样的格式。

yml
version: "3"
services:
  # 服务名称(可自定义)
  redis:
    # 指定容器名称
    container_name: redis01   # 指定该redis容器名称为redis01

当不指定container_name属性时,容器名称会默认使用 项目名称_服务名称_序号 这样的格式。

  • 项目名称:如果没有指定项目名称,默认会使用docker-compose.yml文件所在目录的名称。
  • 服务名称:可自定义。
  • 序号:如果一个服务有多个副本(即多个容器实例),则会在容器名称后面添加一个序号,例如 redis_1、redis_2 等。

为什么不推荐使用容器名称?

  1. 如果手动指定容器名称后,该服务将无法进行扩展,因为 Docker 不允许多个容器实例具有相同的名称。
  2. 影响自动化部署和 CI/CD。固定的容器名称会使部署脚本难以重用

为什么应该使用服务名称代替容器名称?

  1. 不指定 container_name 时,Docker Compose 会自动为扩展的容器添加序号后缀,从而实现无缝服务扩展。
  2. 简化服务间通信。服务之间可以直接通过服务名称相互访问,无需配置容器名称
  3. 不使用 container_name 可以简化自动化部署流程

build属性

build属性用于指定Dockerfile文件所在路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。通常有几种用法

yml
# 用法1:指定Dockerfile文件所在的绝对路径
version: "3"
services:
  redis:
    build: /path/to/build/dir

# 用法2:指定Dockerfile文件所在的相对路径。
# . 表示当前目录 ./dir 表示当前目录的dir目录中
build: ./dir

# 用法3:
# 使用 context 子属性指定 Dockerfile 所在目录的路径。
# 使用 dockerfile 子属性指定 Dockerfile 的文件名。
# 下面这个例子中,指定的是 ./dir/Dockerfile_aaa 文件
build:
  context: ./dir    
  dockerfile: Dockerfile_aaa

command属性

command属性用于定义容器的启动后默认执行的命令。类似 docker run 命令的 command 参数。

如果定义了command属性,那么在启动容器时,会覆盖镜像Dockerfile文件中定义的CMD命令。

yml
version: "3"
services:
  redis:
    # 容器运行后的启动命令
    command: redis-server /etc/redis.conf

上面例子中一个redis容器,启动后会执行 redis-server /etc/redis.conf 命令。

networks属性

networks属性用于定义容器使用的网络。可以指定多个网络,每个网络可以有不同的配置。

单独使用的话用于创建网络。可以同时创建多个网络。

yml
version: "3"
services:
  some-service:
    networks:
     - my_network  #指定容器服务使用的网络
     - other-network

# 创建网络
networks:   
  my_network:
  other-network:

restart属性

restart属性用于设置容器的重启策略。

restart属性值有no、always、on-failure三种。

  • no:容器退出时不重启。
  • always:容器退出时总是重启。
  • on-failure:容器退出时如果退出码非0(非0表示异常退出),则重启。
yml
version: "3"
services:
  # 自定义服务名称
  my_src:
    restart: always

volumes属性

用于设置容器的数据卷。即指定宿主机目录和容器目录映射。有几种用法

  • 在容器中使用volumes属性。表示指定容器服务使用的数据卷。
  • 单独使用volumes属性。表示在docker中创建数据卷。
yml
version: "3"
services:
  # 自定义服务名称
  my_src:
    volumes:  
      ## 只是指定一个路径,Docker会自动在容器内创建一个目录。
      - /var/lib/mysql
      ## 使用绝对路径挂载数据卷,宿主机目录/opt/data 映射到容器目录/var/lib
      - /opt/data:/var/lib
      ## 以docker-compose.yml文件为中心的相对路径作为数据卷挂载到容器
      - ./cache:/var/lib
      ## 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)
      - ~/configs:/etc/configs/:ro
      ## 可以直接使用数据卷名称来进行挂载。mysql_data数据卷映射到容器中的/var/lib/mysql目录。
      - mysql_data:/var/lib/mysql

# 定义并创建一个数据卷
volumes:  
  mysql_data:

environment属性

设置环境变量。有数组或字典两种格式的写法。

注意: 如果只给定环境变量名称,而没有指定对应的值的话。容器会自动获取宿主机上对应变量的值。这样做的目的是防止泄露不必要的数据。

yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    
    # 设置容器环境变量,有数组或字典两种格式的写法。
    # 字典格式写法
    environment:
      TZ: Asia/Shanghai           # 设置容器时区
      MYSQL_ROOT_PASSWORD: root   # 设置 root 用户密码
#====================================================
    # 数组格式写法
    environment:
      - TZ=Asia/Shanghai    
      - MYSQL_ROOT_PASSWORD=your_root_password

depends_on 属性

depends_on属性用于指定依赖关系,在启动时需要先启动依赖的服务。

以下例子中会先启动 redis 、mysql服务之后再启动 web服务。

yml
version: '3'
services:
  # redis服务
  redis:
    image: redis
  # mysql服务
  mysql:
    image: mysql
  # web服务
  web:
    build: .
    depends_on: # web服务依赖于mysql和web服务
      - mysql
      - redis

expose属性

expose属性用于暴露容器内部的端口,但不映射到宿主机上,只是用于给其他容器服务提供。

yml
expose:
    - "3000"
    - "8000"

案例 docker-compose 快速部署 mysql和redis容器

  1. 先准备各个文件

文件路径如下

docker/mysql-redis/docker-compose.yml
docker/mysql-redis/mysql
docker/mysql-redis/my.cnf
docker/mysql-redis/redis
docker/mysql-redis/redis.conf
  1. 编辑好my.cnf配置文件和redis.conf配置文件

配置文件内容,自行编辑。

  1. 编写docker-compose.yml
yml
version: '3'
services:
  mysql:
    hostname: mysql
    image: mysql:5.7.26
    # 指定容器名称,如果不设置此参数,则由系统自动生成
    container_name: mysql
    # 设置容器自启模式
    restart: always
    # 容器启动命令,设置utf8字符集 
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    # 设置环境变量
    environment:
      - MYSQL_ROOT_PASSWORD=123456 # 设置root密码
    # 设置容器数据卷 
    volumes:
       - /docker/mysql-redis/mysql:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
       - /docker/mysql-redis/my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
    # 设置端口映射
    ports:
        - "3306:3306"

  redis:  
    hostname: redis
    image: redis:5.0.4
    container_name: redis
    restart: always
    command: redis-server /etc/redis.conf # 启动redis命令
    volumes:
      - /docker/mysql-redis/redis:/data
      - /docker/mysql-redis/redis.conf:/etc/redis.conf
    ports:
        - "6379:6379"
  1. 运行docker-compose.yml来创建容器
shell
# 先检查yaml文件配置是否有误
docker-compose config -q
# 然后在创建容器
docker-compose -f docker-compose.yml up -d

Released under the MIT License.