在容器化技术飞速发展的今天,Docker已成为应用打包、分发与运行的核心工具。但当面对多容器应用时,手动管理容器生命周期、网络配置、数据卷挂载等操作会变得繁琐且易出错;同时,企业级应用对镜像的安全存储、版本控制、权限管控也有着强烈需求。本文将详细介绍Docker Compose多容器编排工具的使用,以及Docker Harbor私有仓库的部署、配置与日常管理,帮助你高效搞定容器化应用的编排与镜像管理难题。
一、Docker Compose:多容器应用编排神器
1.1 核心概念与优势
Docker Compose是Docker官方提供的一款多容器编排工具,它允许通过一个YAML文件(docker-compose.yml)定义应用所需的所有容器、网络、数据卷、环境变量等配置,然后使用单条命令即可实现多容器的创建、启动、停止、销毁等全生命周期管理。
其核心优势在于:
-
简化配置:将分散的容器配置集中到一个YAML文件,版本化管理,便于团队协作与追溯。
-
一键操作:通过
docker-compose up、docker-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界面可轻松管理用户、项目和权限:
-
创建项目:登录Harbor Web界面,点击“项目”→“新建项目”,填写项目名称(如test),选择“私有”(仅授权用户可访问)或“公共”(所有用户可访问),点击“确定”。
-
创建用户:点击“用户管理”→“新建用户”,填写用户名、密码、邮箱等信息,设置用户状态为“启用”,点击“确定”。
-
分配权限:进入项目(如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的核心用法。动手实践起来,将它们应用到实际项目中,感受容器化技术带来的高效与便捷吧!

2314

被折叠的 条评论
为什么被折叠?



