docker compose
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 compose | Docker 的编排子命令,用来管理一组容器 |
up | "启动"的意思:读取当前目录下的 docker-compose.yml,创建并启动里面定义的所有容器 |
-d | detached 的缩写,意思是"后台运行"(不占用当前终端) |
前面讲到,我们有一个叫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 Compose | Kubernetes |
|---|---|---|
| 定位 | 单机多容器编排 | 集群级容器编排 |
| 管理范围 | 单台主机上的多个容器 | 跨多台主机的容器集群 |
| 架构 | 无中心架构,直接调用本地 Docker Engine | 主从架构(Master + Node),有 API Server、Scheduler、Controller Manager 等组件 |
| 部署复杂度 | 极低,一个 YAML 文件 + 一条命令 | 较高,需要搭建集群、配置网络插件、存储插件等 |
更多推荐
所有评论(0)