yuanxiaojiang
人的放纵是本能,自律才是修行

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"

image

  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  # 拉取镜像

image

 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

image

 

posted on 2025-07-25 22:00  猿小姜  阅读(31)  评论(0)    收藏  举报

levels of contents