Docker Compose编排与Harbor私有仓库部署管理全指南

在容器化技术飞速发展的今天,Docker已成为应用打包、分发与运行的核心工具。但当面对多容器应用时,手动管理容器生命周期、网络配置、数据卷挂载等操作会变得繁琐且易出错;同时,企业级应用对镜像的安全存储、版本控制、权限管控也有着强烈需求。本文将详细介绍Docker Compose多容器编排工具的使用,以及Docker Harbor私有仓库的部署、配置与日常管理,帮助你高效搞定容器化应用的编排与镜像管理难题。

一、Docker Compose:多容器应用编排神器

1.1 核心概念与优势

Docker Compose是Docker官方提供的一款多容器编排工具,它允许通过一个YAML文件(docker-compose.yml)定义应用所需的所有容器、网络、数据卷、环境变量等配置,然后使用单条命令即可实现多容器的创建、启动、停止、销毁等全生命周期管理。

其核心优势在于:

  • 简化配置:将分散的容器配置集中到一个YAML文件,版本化管理,便于团队协作与追溯。

  • 一键操作:通过docker-compose updocker-compose down等命令,快速启停整个应用栈,无需逐个操作容器。

  • 环境一致性:在开发、测试、生产环境中使用相同的Compose配置,避免“开发环境能跑,生产环境报错”的问题。

  • 灵活扩展:支持通过配置文件调整容器实例数、资源限制等,适配不同环境的需求。

1.2 安装与基础使用

1.2.1 安装Docker Compose

Docker Compose依赖Docker引擎,需先确保已安装Docker。安装Compose的方式如下(以Linux系统为例):

# 下载最新版本的Docker Compose(可通过官网查看最新版本号)
curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 验证安装成功
docker-compose --version

# 输出类似:docker-compose version v2.24.5, build 1234567
1.2.2 核心配置文件(docker-compose.yml)详解

docker-compose.yml是Compose的核心,采用YAML语法,主要包含以下顶级字段:

  • version:指定Compose文件格式的版本(需与Docker Compose版本匹配,推荐使用3.x)。

  • services:定义应用的各个容器服务,每个服务对应一个容器。

  • networks:定义应用所需的网络,实现容器间的通信隔离与连接。

  • volumes:定义数据卷,用于持久化容器数据(如数据库数据、配置文件等)。

1.3 YAML 文件格式及编写注意事项

YAML(YAML Ain't Markup Language)是一种简洁的数据序列化格式,常用于配置文件。它比 JSON 更加简洁易读,并且支持更复杂的数据结构。使用 YAML 编写 Docker Compose 配置文件时,有几个 注意事项:

1.3.1 YAML 基本语法

大小写敏感:YAML 是大小写敏感的,所以一定要注意区分大小写。

缩进:YAML 使用空格进行缩进,不支持 TAB 缩进。通常推荐使用两个空格作为一个层级的缩 进。

列表:列表项使用 -(短横线)表示。

字典:字典使用 :(冒号)连接键值对,冒号后面需要加一个空格。

注释:使用 # 来添加注释。

字符串:如果字符串包含特殊字符,可以使用单引号 ' 或双引号 " 来包裹

1.3.2 Docker Compose配置常用字段
字段                                      
build                                 # 描述指定 Dockerfile 文件名,
                                        要指定Dockerfile文件需要在build标签的子级标签中使用
dockerfile标签指定

dockerfile                            # 构建镜像上下文路径
context                               # 可以是 dockerfile 的路径,或者是指向 git 仓库
                                        的 url 地址
image                                 # 指定镜像
command:                              # 执行命令,覆盖容器启动后默认执行的命令
container_name                        # 指定容器名称,由于容器名称是唯一的,如果指定自定
                                        义名称,则无法scale指定容器数量  
deploy                                # 指定部署和运行服务相关配置,只能在 Swarm 模式使
                                        用
environment                           # 添加环境变量
networks                              # 加入网络,引用顶级networks下条目
network_mode                          # 设置容器的网络模式,如 host,bridge,...
ports                                 # 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes                               # 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 
                                        volumes 定义卷名称
volumes_from                          # 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,
                                        仅版本 '2' 支持
hostname                              # 容器主机名
sysctls                               # 在容器内设置内核参数
links                                 # 连接到另外一个容器,- 服务名称[:服务别名]
privileged                            # 用来给容器root权限,注意是不安全的,true | 
false
restart                               # 设置重启策略,no,always,nounless-st
failure,oped
depends_on                          no,默认策略,在容器退出时不重启容器。
                                    on-failure,在容器非正常退出时(退出状态非0),才会
                                    重启容器。
                                    on-failure:3,在容器非正常退出时重启容器,最多重启3
                                    次。
                                    always,在容器退出时总是重启容器。
                                    unless-stopped,在容器退出的容器时总是重启容器,但
                                    是不考虑在 Docker 守护进程启动时就已经停止了。
                                    
                                                                                                            
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到
下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器
会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
php:
  depends_on:
 - apache
 - mysql
1.3.3 Docker Compose 常用命令
字段                                      描述
build                                       重新构建服务
ps                                          列出容器
up                                          创建和启动容器
exec                                        在容器里执行命令
scale                                       指定一个服务容器启动数量
top                                         显示容器进程
logs                                        查看容器输出
down                                        删除容器、网络、数据卷和镜像
stop/start/restart                          停止/启动/重启服务
1.3.4 YUML示例
1 准备依赖文件
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.20.2.tar.gz ./

vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <hmj>
#添加环境包
RUN rm -rf /etc/yum.repos.d/*
ADD  CentOS-Base.repo /etc/yum.repos.d/ 
RUN yum clean all && \
    yum makecache && \
    yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \

useradd -M -s /sbin/nologin nginx

#上传nginx软件压缩包,并解压
ADD nginx-1.20.2.tar.gz /usr/local/src/

#指定工作目录
WORKDIR /usr/local/src/nginx-1.20.2
RUN ./configure \--prefix=/usr/local/nginx \--user=nginx 

--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf      #关闭nginx  在后台运行

#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
#关闭 nginx 在
echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html

编写配置文件Docker-compose.yml

vim /opt/compose_nginx/docker-compose.yml
version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d
--------------------------------------------------------------------------------------------f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行

docker ps -a
CONTAINER ID   IMAGE        COMMAND         CREATED     STATUS         PORTS        NAMES                                 
b48dceee248f   compose_nginx_nginx  "/run.sh"  About a minute ago   Up About a minute   
0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1
cd /opt/compose_nginx/
docker-compose ps                   
浏览器访问:http://192.168.10.23:1216

以下是一个典型的多容器应用(Nginx + MySQL + PHP)的docker-compose.yml示例:

version: '3.8'  # Compose文件版本

services:
  # Nginx服务
  nginx:
    image: nginx:1.25-alpine  # 使用的镜像
    ports:
      - "80:80"  # 端口映射(主机端口:容器端口)
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d  # 挂载Nginx配置文件
      - ./html:/usr/share/nginx/html    # 挂载网站根目录
    networks:
      - app-network  # 加入自定义网络
    depends_on:
      - php  # 依赖php服务,确保php先启动

  # PHP服务
  php:
    image: php:8.2-fpm-alpine
    volumes:
      - ./html:/usr/share/nginx/html    # 与Nginx共享网站目录
      - ./php/php.ini:/usr/local/etc/php/php.ini  # 挂载PHP配置
    networks:
      - app-network
    depends_on:
      - mysql  # 依赖mysql服务

  # MySQL服务
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123  #  root用户密码
      MYSQL_DATABASE: test_db       # 初始化创建的数据库
      MYSQL_USER: test_user         # 初始化创建的用户
      MYSQL_PASSWORD: test123       # 初始化用户密码
    volumes:
      - mysql-data:/var/lib/mysql  # 挂载数据卷,持久化MySQL数据
    networks:
      - app-network
    ports:
      - "3306:3306"

# 自定义网络
networks:
  app-network:
    driver: bridge  # 桥接网络,默认类型

# 数据卷
volumes:
  mysql-data:  # 命名数据卷,会自动创建

二、Docker Harbor:企业级私有镜像仓库

2.1 核心功能与架构

Docker Harbor是VMware开源的企业级Docker私有仓库,相比Docker官方的Registry,Harbor提供了更丰富的企业级特性,如:镜像安全扫描、权限管控、镜像复制、日志审计、UI管理界面等,非常适合企业内部存储和管理镜像。

Harbor的核心架构包含以下组件(通过Docker Compose编排部署):

  • harbor-core:核心服务,处理API请求、身份认证、权限管理等。

  • harbor-db:PostgreSQL数据库,存储Harbor的配置信息、用户数据、镜像元数据等。

  • harbor-redis:Redis缓存,用于缓存会话信息、减轻数据库压力。

  • harbor-registry:镜像存储核心,基于Docker Registry改造,支持镜像的推拉、存储等。

  • harbor-portal:Web管理界面,提供可视化的镜像管理、用户管理、配置等功能。

  • harbor-jobservice:任务服务,处理镜像复制、垃圾清理等后台任务。

  • clair:镜像安全扫描服务,检测镜像中的漏洞。

  • nginx:反向代理,统一接收客户端请求,转发到各个组件。

2.2 Harbor部署步骤(Linux系统)

2.2.1 环境准备

部署Harbor需满足以下条件:

  • 已安装Docker(版本≥19.03)和Docker Compose(版本≥2.2.3)。

  • 服务器内存≥4GB(推荐8GB,扫描镜像时占用内存较大)。

  • 操作系统:CentOS 7/8、Ubuntu 18.04/20.04等。

  • 开放端口:80(HTTP)、443(HTTPS,推荐)、4443(可选,内部通信)。

2.2.2 下载与配置Harbor
# 1. 下载Harbor安装包(前往官网https://github.com/goharbor/harbor/releases获取最新版本)
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz

# 2. 解压安装包
tar -zxvf harbor-offline-installer-v2.10.0.tgz -C /opt/
cd /opt/harbor

# 3. 复制配置模板,生成自定义配置文件
cp harbor.yml.tmpl harbor.yml

# 4. 编辑配置文件(核心配置项)
vim harbor.yml

核心配置项说明(需根据实际环境修改):

hostname: 192.168.1.100  # Harbor服务器的IP或域名(必填)

# 端口配置(默认80,若需HTTPS,需配置certificate和private_key)
http:
  port: 80

# HTTPS配置(推荐开启,生产环境必备)
https:
  port: 443
  certificate: /opt/harbor/certs/harbor.crt  # SSL证书路径
  private_key: /opt/harbor/certs/harbor.key  # SSL私钥路径

# 管理员密码(默认admin,首次登录需修改)
harbor_admin_password: Harbor12345

# 数据库配置(默认使用内置PostgreSQL,可改为外部数据库)
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 100

# 数据存储路径(默认/opt/harbor/data,建议挂载到大容量磁盘)
data_volume: /opt/harbor/data

# 日志配置
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
2.2.3 生成SSL证书(可选,开启HTTPS时需配置)

若使用HTTPS,需生成SSL证书(可使用自签名证书或CA颁发的证书)。以下是自签名证书的生成步骤:

hostname: 192.168.1.100  # Harbor服务器的IP或域名(必填)

# 端口配置(默认80,若需HTTPS,需配置certificate和private_key)
http:
  port: 80

# HTTPS配置(推荐开启,生产环境必备)
https:
  port: 443
  certificate: /opt/harbor/certs/harbor.crt  # SSL证书路径
  private_key: /opt/harbor/certs/harbor.key  # SSL私钥路径

# 管理员密码(默认admin,首次登录需修改)
harbor_admin_password: Harbor12345

# 数据库配置(默认使用内置PostgreSQL,可改为外部数据库)
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 100

# 数据存储路径(默认/opt/harbor/data,建议挂载到大容量磁盘)
data_volume: /opt/harbor/data

# 日志配置
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
2.2.4 安装与启动Harbor
# 1. 运行安装脚本(会自动加载配置,拉取镜像,启动容器)
./install.sh

# 2. 查看Harbor容器状态(所有容器均为up状态即启动成功)
docker-compose ps

# 3. 访问Harbor Web界面
# 浏览器输入:http://192.168.1.100 或 https://192.168.1.100
# 用户名:admin,密码:配置文件中设置的harbor_admin_password(默认Harbor12345)

2.3 Harbor日常管理

2.3.1 镜像推拉操作

在客户端使用Harbor私有仓库,需先登录仓库(若为HTTPS且是自签名证书,需配置Docker信任该仓库):

# 1. 配置Docker信任Harbor(自签名证书时)
# 编辑Docker配置文件
vim /etc/docker/daemon.json
# 添加以下内容(hostname为Harbor服务器IP/域名)
{
  "insecure-registries": ["192.168.1.100:80"]  # HTTP协议时配置
  # 若为HTTPS,无需配置此项,但需将证书复制到/etc/docker/certs.d/<hostname>/目录
}

# 2. 重启Docker服务
systemctl restart docker
cd /opt/harbor
docker-compose restart

# 3. 登录Harbor仓库
docker login 192.168.1.100
# 输入用户名(admin)和密码,登录成功提示:Login Succeeded

# 4. 标记本地镜像(格式:Harbor地址/项目名/镜像名:标签)
# 例:将本地nginx:1.25镜像标记为Harbor的test项目下的nginx:v1
docker tag nginx:1.25 192.168.1.100/test/nginx:v1

# 5. 推送镜像到Harbor
docker push 192.168.1.100/test/nginx:v1

# 6. 从Harbor拉取镜像
docker pull 192.168.1.100/test/nginx:v1

# 7. 退出Harbor登录
docker logout 192.168.1.100
2.3.2 用户与权限管理

Harbor支持基于项目的权限管控,通过Web界面可轻松管理用户、项目和权限:

  1. 创建项目:登录Harbor Web界面,点击“项目”→“新建项目”,填写项目名称(如test),选择“私有”(仅授权用户可访问)或“公共”(所有用户可访问),点击“确定”。

  2. 创建用户:点击“用户管理”→“新建用户”,填写用户名、密码、邮箱等信息,设置用户状态为“启用”,点击“确定”。

  3. 分配权限:进入项目(如test),点击“成员”→“添加成员”,选择创建好的用户,分配角色(如“开发者”可推拉镜像,“管理员”拥有项目全权限),点击“确定”。

2.3.3 镜像安全扫描与清理
  • 镜像扫描:Harbor集成Clair扫描服务,推送镜像后会自动扫描漏洞。也可手动扫描:进入项目→选择镜像→点击“扫描”,等待扫描完成后,查看漏洞详情(高危、中危、低危),并根据提示修复(如更新基础镜像)。

  • 镜像清理:当镜像版本过多时,可清理废弃镜像(无标签或过期镜像)。通过Web界面:进入项目→“镜像清理”→创建清理规则(如清理30天前的无标签镜像),执行清理任务;也可通过命令行:docker-compose exec jobservice cli garbage-collect --dry-run(模拟清理),docker-compose exec jobservice cli garbage-collect(实际清理)。

2.3.4 Harbor启停与升级
# 1. 停止Harbor
cd /opt/harbor
docker-compose down

# 2. 启动Harbor
docker-compose up -d

# 3. 重启Harbor
docker-compose restart

# 4. 升级Harbor(需备份数据和配置)
# 备份数据:cp -r /opt/harbor/data /opt/harbor/data_backup
# 备份配置:cp /opt/harbor/harbor.yml /opt/harbor/harbor.yml_backup
# 下载新版本安装包,解压后替换旧版本的harbor目录,重新配置harbor.yml,执行安装脚本

三、总结与最佳实践

Docker Compose简化了多容器应用的编排与管理,让开发者可以专注于应用逻辑而非容器配置;Docker Harbor则为企业提供了安全、可控的私有镜像仓库,解决了镜像的存储、权限、安全等问题。两者结合使用,可构建一套完整的容器化应用交付流程。

最佳实践建议:

  • Compose配置文件:使用版本3.x以上,合理划分服务、网络、数据卷,通过depends_on控制服务启动顺序,避免依赖冲突。

  • 镜像管理:生产环境中使用Harbor私有仓库,开启HTTPS和镜像扫描,定期清理废弃镜像,避免存储占用过大。

  • 权限管控:Harbor中采用“项目-用户-角色”的权限模型,最小化授权,避免过度开放权限。

  • 数据备份:定期备份Harbor的镜像数据和配置文件,避免数据丢失。

  • 性能优化:Harbor服务器建议配置较高的内存和IO性能,镜像存储目录挂载到大容量磁盘;Docker Compose可通过deploy字段配置服务的资源限制(如CPU、内存)。

通过本文的讲解,相信你已掌握Docker Compose和Harbor的核心用法。动手实践起来,将它们应用到实际项目中,感受容器化技术带来的高效与便捷吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值