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

harbor的镜像同步
81节点上配置harbor并进行配置
# 拷贝软件包 [root@docker02 ~]# scp harbor-offline-installer-v2.3.1.tgz root@10.0.0.81:~ # 压缩软件包 [root@docker01 ~]# tar xf /root/harbor-offline-installer-v2.3.1.tgz -C /app/tools/ # 生成配置文件 [root@docker01 ~]# cp /app/tools/harbor/harbor.yml{.tmpl,} # 修改harbor的配置文件 hostname: 10.0.0.81 # 此处使用ip地址 #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_admin_password: yuanxiaojiang data_volume: /app/tools/harbor/data# 安装harbor [root@docker01 ~]# /app/tools/harbor/install.sh
81节点上的docker配置文件
[root@docker01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.m.daocloud.io" ], "insecure-registries": [ "harbor.yuanxiaojiang.cn" ] } [root@docker01 ~]# systemctl restart docker
82节点上的docker配置文件
[root@docker02 ~]# cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.m.daocloud.io" ], "insecure-registries": [ "harbor.yuanxiaojiang.cn", "10.0.0.81" ] } [root@docker02 ~]# systemctl restart docker
测试
[root@docker02 ~]# docker tag alpine:latest 10.0.0.81/library/alpine:latest [root@docker02 ~]# docker login -uadmin -pyuanxiaojiang http://10.0.0.81 [root@docker02 ~]# docker push 10.0.0.81/library/alpine:latest




https://www.cnblogs.com/fengkm/p/17085676.html
harbor部署基于官方认证的https⭐⭐⭐⭐⭐
- 自定义https证书(SSL证书)
# 安装OpenSSL sudo yum install openssl -y # 创建证书目录 sudo mkdir -p /etc/ssl/private sudo mkdir -p /etc/ssl/certs # 生成私钥 sudo openssl genrsa -out /etc/ssl/private/harbor.yuanxiaojiang.cn.key 2048 # 生成证书签名请求 sudo openssl req -new -key /etc/ssl/private/harbor.yuanxiaojiang.cn.key \ -out /etc/ssl/private/harbor.yuanxiaojiang.cn.csr Common Name:重要 输入 harbor.yuanxiaojiang.cn # 生成自签名证书 sudo openssl x509 -req -days 365 \ -in /etc/ssl/private/harbor.yuanxiaojiang.cn.csr \ -signkey /etc/ssl/private/harbor.yuanxiaojiang.cn.key \ -out /etc/ssl/certs/harbor.yuanxiaojiang.cn.crt # 设置权限 sudo chmod 600 /etc/ssl/private/harbor.yuanxiaojiang.cn.key sudo chmod 644 /etc/ssl/certs/harbor.yuanxiaojiang.cn.crt
- 修改harbor配置文件
[root@docker01 harbor]# vim harbor.yml hostname: harbor.yuanxiaojiang.cn http: port: 80 https: port: 443 certificate: /etc/ssl/certs/harbor.yuanxiaojiang.cn.crt private_key: /etc/ssl/private/harbor.yuanxiaojiang.cn.key harbor_admin_password: yuanxiaojiang data_volume: /app/tools/harbor/data [root@docker01 harbor]# docker-compose down [root@docker01 harbor]# ./prepare 重新加载Harbor配置文件,生成新的docker-compose.yml文件 [root@docker01 harbor]# docker-compose up -d 根据 docker-compose.yml 启动或重启 Docker 容器
- 修改hosts文件和docker配置文件
# 修改虚拟机的hosts文件 [root@docker01 ~]# cat /etc/hosts 10.0.0.81 harbor.yuanxiaojiang.cn # 修改宿主机的hosts文件 10.0.0.81 harbor.yuanxiaojiang.cn # docker配置文件 [root@docker01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.m.daocloud.io" ], "insecure-registries": [ "harbor.yuanxiaojiang.cn", "harbor.yuanxiaojiang.cn:443" ] } [root@docker01 ~]# systemctl restart docker

浙公网安备 33010602011771号