Docker Compose
docker compose基础
docker-compose简介
- Docker Compose 是一个用于定义和运行单机多容器Docker应用的编排工具(通过一个配置文件一键启动、管理、关联所有服务)
- 多机容器集群管理:
- ansible + docker compose + dockerfile
- docker swarm 实现集群管理
- k8s( kubernetes 实现集群管理)
- docker compose 需要单独安装( epel源,yum install -y docker-compose )
docker-compose.yaml / docker-compose.yml 格式⭐⭐⭐⭐⭐
version: "3.8" # Compose 文件版本(可选,新版本可省略)
services: # 定义容器服务
web: # 服务名称(自定义)
image: nginx:alpine # 指定使用的镜像
ports:
- "80:80" # 端口映射(主机:容器)
depends_on: # 依赖(先启动指定的容器,然后再启动当前的容器)
- db
links: # 容器连接
- php
db:
image: postgres:13
environment: # 环境变量
POSTGRES_PASSWORD: mysecretpassword
volumes: # 服务级volumes:定义容器如何挂载卷
- db_data:/var/lib/postgresql/data
volumes: # 全局volumes:声明卷的全局配置
db_data:
全局volumes与服务级volumes⭐⭐⭐
| 维度 | 全局 volumes | 服务级 volumes |
| 角色定位 |
数据卷的创建者/声明者 |
数据卷的使用者/挂载者 |
| 主要作用 |
定义和配置数据卷本身 |
将数据卷挂载到容器的特定路径 |
| 等效命令 |
docker volume create <volume_name> |
docker run -v <volume_name>:<container_path> |
| 执行结果 |
在 Docker 系统中创建或声明持久化存储空间 |
建立卷与容器内部路径的映射关系 |
| 配置位置 |
Compose 文件最外层(与 services 平级) |
在 services 下的具体服务内 |
| 依赖关系 |
独立存在,不依赖具体服务 |
依赖全局 volumes 中声明的数据卷 |
| 工作时机 |
docker-compose up 时检查/创建卷 |
容器启动时进行挂载 |
docker-compose命令格式
# 修改docker-compose.yml后(不管容器是否运行,只要执行 docker-compose up 命令就会生效)
如果只修改端口,数据卷,docker-compose up 会自动删除原有容器,重新创建容器(不修改容器的名字)
如果修改了容器的名字会造成端口冲突
# docker-compose up -d --remove-orphans:会自动更新容器并清理旧实例,避免端口或资源冲突
移除孤立的容器(孤儿容器) - 删除那些属于当前项目但不在当前 compose 文件中定义的服务容器
孤儿容器通常是因为修改了 compose 文件(删除或重命名了服务)而留下的
容器管理命令⭐⭐⭐⭐
docker-compose 命令 | 等效的 docker container 命令 | 作用 |
up -d |
docker run -d |
创建并后台运行容器(依赖 docker-compose.yml 配置) |
down |
docker stop && docker rm |
停止并删除所有容器、网络、卷(默认保留卷需手动删除) |
stop |
docker stop |
停止运行中的容器(不删除) |
start |
docker start |
启动已停止的容器 |
restart |
docker restart |
重启容器 |
ps |
docker ps |
查看当前项目的容器状态(-q 仅显示 ID) |
top |
docker top |
查看容器内运行的进程 |
logs |
docker logs |
查看容器日志(常用 -f 实时跟踪) |
rm |
docker rm |
删除已停止的容器(需先 stop 或使用 -f 强制删除) |
镜像管理命令
docker-compose 命令 | 等效的 docker image 命令 | 作用 |
images |
docker images |
列出当前项目用到的镜像 |
使用案例
version: "3.3"
services:
nginx_compose:
image: "nginx:1.22.1-alpine"
ports:
- "88:80"

docker-compose部署kodexp⭐⭐
# 通过启动容器的命令来编写
version: "3.3"
services:
kodexp_nginx:
image: "nginx:1.28-alpine"
ports:
- "10086:80"
links:
- "kodexp_php:php" # 建议在nginx的子配置文件中不要使用别名,使用容器名
depends_on:
- "kodexp_php"
volumes:
- "./conf/nginx.conf:/etc/nginx/nginx.conf"
- "./conf/kodexp.conf:/etc/nginx/conf.d/default.conf"
- "./code/:/app/code/kodexp/"
kodexp_php:
image: "php:8-fpm-alpine"
volumes:
- "./conf/www.conf:/usr/local/etc/php-fpm.d/www.conf"
- "./code/:/app/code/kodexp/"
docker镜像仓库
| docker镜像仓库方案 |
应用场景与特点 |
| 镜像保存为压缩包 |
通过docker save/load 进行使用,不方便 |
| registry镜像仓库 |
命令行操作,适用于小型网站集群(镜像不多) |
| harbor镜像仓库 |
图形化界面,企业级镜像仓库(docker,k8s都可用) |
| 公有云镜像仓库 |
公有云上申请 |
registry仓库⭐⭐⭐
环境规划
| 域名 |
环境与IP地址 |
| docker01.linux.cn |
docker环境 10.0.0.81/172.16.1.81 |
| registry.yuanxiaojiang.cn |
registry环境 10.0.0.82/172.16.1.82 |
cat >>/etc/hosts<<EOF
10.0.0.81 docker01.linux.cn
10.0.0.82 docker02.linux.cn registry.yuanxiaojiang.cn
EOF
命令方式部署
# 1. 下载registry # 镜像仓库服务器配置
docker pull registry
# 2. 配置(docker服务端准许使用http)(所有需要与私有docker仓库交互的docker节点配置)
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"],
"insecure-registries": ["registry.yuanxiaojiang.cn:5000"]
}
允许 Docker 通过 HTTP(非 HTTPS)协议访问指定的私有仓库
registry.yuanxiaojiang.cn:5000是私有镜像仓库地址
默认 Docker 要求仓库使用 HTTPS,对于内部或测试环境可以这样配置
[root@docker02 ~]# systemctl restart docker # 配置完成之后重启docker
# 3. 镜像仓库服务器
docker volume create registry
docker volume ls
docker run -d --name "my_registry" \
-p 5000:5000 \
-v registry:/var/lib/registry/ \
--restart=always registry:latest # --restart=always:表示容器异常退出时会自动重启
# 4. 查看私有仓库镜像信息(默认没有有用信息)
[root@docker02 ~]# curl -L http://registry.yuanxiaojiang.cn:5000/v2/_catalog/
{"repositories":[]}
# 5. 上传镜像到私有仓库
tag 给镜像打上标签(地址/仓库名/镜像名:版本)
push 镜像 上传镜像到私有仓库
[root@docker02 ~]# docker tag nginx:alpine registry.yuanxiaojiang.cn:5000/web/nginx:alpine
[root@docker02 ~]# docker push registry.yuanxiaojiang.cn:5000/web/nginx:alpine
[root@docker02 ~]# docker pull registry.yuanxiaojiang.cn:5000/web/nginx:alpine # 拉取镜像

docker-compose一键部署
docker volume create registry
docker run -d --name "my_registry" -p 5000:5000 -v registry:/var/lib/registry/ --restart=always registry:latest
version: "3.3"
services:
my_registry:
image: "registry:latest"
ports:
- "5000:5000"
restart: always
volumes:
- "registry:/var/lib/registry"
volumes:
registry:
企业级镜像仓库-harbor仓库⭐⭐⭐⭐⭐
harbor软件目录结构及hosts文件
# harbor软件目录结构
[root@docker02 harbor]# pwd
/app/tools/harbor
[root@docker02 harbor]# tree -L 1
├── common.sh
├── harbor.v2.3.1.tar.gz
├── harbor.yml.tmpl # 临时配置文件,正式配置文件harbor.yml
├── install.sh # 每次修改配置,需要执行下
├── LICENSE
└── prepare
# hosts文件
cat >>/etc/hosts<<EOF
10.0.0.81 docker01.linux.cn
10.0.0.82 docker02.linux.cn registry.yuanxiaojiang.cn harbor.yuanxiaojiang.cn
EOF
harbor配置文件
# 配置文件准备
cp harbor.yml.tmpl harbor.yml
# 修改域名部分
hostname: harbor.yuanxiaojiang.cn
# 禁用https功能
注释掉了 https相关的内容
#https:
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# 修改harbor仓库默认密码
harbor_admin_password: yuanxiaojiang
# 安装
./install.sh # 注意检查80端口是否被占用
daemon.json文件的修改
[root@docker01 docker]# cat /etc/docker/daemon.json # 修改完需要重启docker
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
],
"insecure-registries": [
"harbor.yuanxiaojiang.cn"
]
}
测试
docker login -uadmin -pyuanxiaojiang http://harbor.yuanxiaojiang.cn
docker tag nginx:1.22.1-alpine harbor.yuanxiaojiang.cn/library/nginx:1.22.1-alpine
docker push harbor.yuanxiaojiang.cn/library/nginx:1.22.1-alpine
