欢迎光临
我们一直在努力

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 ComposeKubernetes
定位 单机多容器编排 集群级容器编排
管理范围 单台主机上的多个容器 跨多台主机的容器集群
架构 无中心架构,直接调用本地 Docker Engine 主从架构(Master + Node),有 API Server、Scheduler、Controller Manager 等组件
部署复杂度 极低,一个 YAML 文件 + 一条命令 较高,需要搭建集群、配置网络插件、存储插件等
赞(0)
未经允许不得转载:171主机测评 » docker compose
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址