docker compose是一种docker编排工具。所谓的编排,是指将多个容器组织在一起,统一管理它们的启动、停止、网络、数据卷等。简单理解,就是之前我们创建、启动docker容器,要一个容器、一个容器孤立地编写、运行脚本,而docker compose可以将它们统一写到一个yaml文件里,然后就运行这个yaml文件即可。写的脚本也不像之前那么多。

就是这么简单,没有多么神秘。

以下说说使用方法:

一、安装docker compose

1、下载二进制文件

下载(在有网络的机器上执行)

wget https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64 -O docker-compose

2、安装

docker compose的用法,跟同一服务器的docker版本息息相关。

(1)如果docker version >= 20

从 Docker 20.10 版本开始,Docker CLI 引入了 插件化架构。docker compose 并不是 Docker 引擎的一部分,而是一个独立的插件(plugin),Docker CLI 会在预定义的目录中自动扫描并加载插件。

创建插件目录(如果不存在)
sudo mkdir -p /usr/lib/docker/cli-plugins

将文件拷贝到插件目录,并改名为 docker-compose。
sudo cp docker-compose /usr/lib/docker/cli-plugins/docker-compose

赋予可执行权限
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose

验证
docker compose --version

(2)如果 docker version < 20

把二进制文件放到 PATH 中的目录(如 /usr/local/bin)
sudo cp docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证
docker-compose --version

二、编写docker compose脚本

这是一个完整额docker-compose.yml内容。它的作用,是创建6个docker容器,这些容器将共享一个自定义的 Docker 网络(docker-fixed-net),从而在创建容器时能够指定固定 IP 地址,便于容器间相互访问和引用。

version: '3.8'

services:
  redis01:
    image: redis:latest
    container_name: redis01
    restart: always
    tty: true
    stdin_open: true
    ports:
      - "6379:6379"
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.2

  proxysql:
    image: proxysql/proxysql
container_name: proxysql
restart: always
    # command 对应 docker run 末尾传入的启动参数
    command: proxysql --initial -f -c /etc/proxysql.cnf
    ports:
      - "6032:6032"
      - "6033:6033"
    volumes:
      - /home/work/docker/proxysql/proxysql.cnf:/etc/proxysql.cnf
      - /home/work/docker/proxysql/data:/var/lib/proxysql
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.3

  nginx-web:
    image: nginx:latest
    container_name: nginx-web
    restart: always
    privileged: true
    tty: true
    stdin_open: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/work/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
      - /home/work/docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro
      - /home/work/docker/web/dist:/usr/share/nginx/html:rw
      - /home/work/docker/nginx/logs:/var/log/nginx
      - /home/work/docker/nginx/cert:/etc/nginx/cert
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.4

  web-server-101:
    image: web-server:1.0.1
    container_name: web-server-101
    restart: always
    tty: true
    stdin_open: true
    ports:
      - "8090:8090"
    volumes:
      - /home/work/docker/web-server:/usr/data
      - /home/work/web-server-output:/usr/output
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.5

  ackctrl-105:
    image: ackctrl:1.0.5
    container_name: ackctrl-105
    restart: always
    tty: true
    stdin_open: true
    ports:
      - "10992:10992"
    cap_add:
      - NET_RAW
    volumes:
      - /home/work/docker/ackctrl/config:/ackctrl/config
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.6

  outer-api:
    image: outer-api-zjsj:1.0.0
    container_name: outer-api
    restart: always
    tty: true
    stdin_open: true
    ports:
      - "8091:8091"
    volumes:
      - /home/work/docker/outer-api:/usr/data
    networks:
      docker-fixed-net:
        ipv4_address: 172.18.0.7

networks:
  docker-fixed-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/24
          gateway: 172.18.0.1

创建的容器是这样的:
在这里插入图片描述

三、运行docker compose

1、创建、启动docker容器

docker compose up -d
#或者旧版本:
docker-compose up -d
部分含义
docker composeDocker 的编排子命令,用来管理一组容器
up"启动"的意思:读取当前目录下的 docker-compose.yml,创建并启动里面定义的所有容器
-ddetached 的缩写,意思是"后台运行"(不占用当前终端)

前面讲到,我们有一个叫docker-compose.yml的文件,那命令 docker compose up -d 里的docker compose是指该文件名吗?不是,这里docker compose是命令名称,与yaml的名称没有关系。但是,一般会把这个yaml命名为docker-compose.yml。因为默认情况下,命令会自动寻找当前目录下名为 docker-compose.yml 或 docker-compose.yaml 的文件。

注意是在yml文件所在文件夹下运行的命令。

当然叫其他名字也可以,在运行命令时通过 -f 参数指定即可:

sudo docker-compose -f nas-stack.yml up -d

2、常用的docker compose命令

命令说明
docker compose up -d启动所有服务(-d 表示后台运行)
docker compose up -d 服务名只启动指定服务
docker compose down停止并删除所有容器、网络
docker compose down --volumes停止并删除容器、网络和数据卷
docker compose stop停止所有容器(不删除)
docker compose start启动已停止的容器
docker compose restart重启所有容器

四、使用docker compose的好处

我们服务器是统信UOS 1070e。有一个不好的地方是,每次重启,docker的自定义网络会丢失,这样就导致使用该网络的docker容器无法启动。后来没办法,使用笨办法,重启之后自动重建docker网络,然后将docker容器与之相关联。但这些操作在没有docker compose之前,要写一大坨脚本:

#!/bin/bash
# 1. 确保网络存在
docker network inspect docker-fixed-net >/dev/null 2>&1 || \
    docker network create --driver bridge --subnet=172.18.0.0/24 --gateway=172.18.0.1 docker-fixed-net

# 2. 定义需要处理的容器列表
CONTAINERS="redis01 nginx-web-i web-server-i data-sync outer-api srs6 srs6-ai nginx-preview1 nginx-preview2 nginx-camera nginx-ai"

# 3. 循环连接并启动
for container in $CONTAINERS; do
    # 尝试连接网络(如果已连接会报错,所以加个判断或忽略错误)
    docker network connect docker-fixed-net $container >/dev/null 2>&1
    # 启动容器
    docker start $container
done

有了docker compose,语句明显精简:

cat << 'EOF' > /home/work/docker/autosetup-docker.sh
#!/bin/bash

sleep 10

cd /home/work/docker/

docker-compose down
docker-compose up -d
EOF

五、docker compose与k8s的比较

Docker Compose 和 Kubernetes(简称 k8s)都是容器编排工具,但它们的定位、能力和适用场景有很大差异。

对比维度Docker ComposeKubernetes
定位单机多容器编排集群级容器编排
管理范围单台主机上的多个容器跨多台主机的容器集群
架构无中心架构,直接调用本地 Docker Engine主从架构(Master + Node),有 API Server、Scheduler、Controller Manager 等组件
部署复杂度极低,一个 YAML 文件 + 一条命令较高,需要搭建集群、配置网络插件、存储插件等

更多推荐