Docker 镜像仓库与加速配置
本文介绍 Docker 镜像仓库的搭建配置、镜像加速方案以及 Harbor 私有仓库的部署方法。
概述
在使用 Docker 的过程中,镜像的拉取和推送速度直接影响开发和部署效率。本文将介绍如何配置镜像加速器、搭建私有镜像仓库,以及 Harbor 企业级镜像仓库的部署方法。
镜像加速器配置
国内镜像源
由于网络原因,从 Docker Hub 拉取镜像可能会很慢。配置国内镜像加速器可以显著提升拉取速度。
配置方法
Docker Daemon 配置
# 创建/编辑配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
EOF
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
K3s 容器镜像加速
# 创建 registries 配置
mkdir -p /etc/rancher/k3s
cat > /etc/rancher/k3s/registries.yaml <<-'EOF'
mirrors:
docker.io:
endpoint:
- "https://docker.m.daocloud.io"
- "https://docker.1ms.run"
- "https://docker.xuanyuan.me"
- "https://docker.mirrors.ustc.edu.cn"
registry.k8s.io:
endpoint:
- "https://k8s.mirror.nju.edu.cn"
EOF
# 重启 K3s
systemctl restart k3s
验证配置
# 查看当前配置
docker info | grep -A 10 "Registry Mirrors"
# 测试拉取速度
time docker pull nginx:latest
私有镜像仓库
使用 Docker Registry
快速启动
# 启动私有仓库
docker run -d \
-p 5000:5000 \
--name registry \
--restart always \
-v /data/registry:/var/lib/registry \
registry:2
客户端配置
# 配置信任私有仓库
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"insecure-registries": [
"192.168.1.100:5000",
"registry.example.com"
]
}
EOF
sudo systemctl restart docker
推送和拉取镜像
# 标记镜像
docker tag myapp:v1.0 192.168.1.100:5000/myapp:v1.0
# 推送镜像
docker push 192.168.1.100:5000/myapp:v1.0
# 拉取镜像
docker pull 192.168.1.100:5000/myapp:v1.0
Harbor 企业级仓库
Harbor 简介
Harbor 是一个开源的企业级 Docker 镜像仓库,提供:
- 基于角色的访问控制(RBAC)
- 镜像复制和同步
- 漏洞扫描(集成 Trivy/Clair)
- 镜像签名和验证
- 审计日志
Harbor 部署
Docker Compose 方式
# 下载 Harbor 安装包
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
tar -xzf harbor-offline-installer-v2.9.0.tgz
cd harbor
# 复制配置文件
cp harbor.yml.tmpl harbor.yml
HTTP 配置
# harbor.yml
hostname: harbor.example.com
http:
port: 80
# 禁用 HTTPS(内网使用)
# https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
harbor_admin_password: YourSecurePassword
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
data_volume: /data/harbor
Clair:
updaters_interval: 12
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
insecure: false
HTTPS 配置(推荐)
# 生成自签名证书(测试环境)
mkdir -p ~/harbor/certs/{ca,server,client}
cd ~/harbor/certs
# 生成 CA 证书
openssl genrsa -out ca/ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.example.com" \
-key ca/ca.key \
-out ca/ca.crt
# 生成服务器证书
openssl genrsa -out server/harbor.example.com.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.example.com" \
-key server/harbor.example.com.key \
-out server/harbor.example.com.csr
# 创建扩展文件
cat > server/v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=example.com
DNS.2=harbor.example.com
EOF
# 签发证书
openssl x509 -req -sha512 -days 3650 \
-extfile server/v3.ext \
-CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
-in server/harbor.example.com.csr \
-out server/harbor.example.com.crt
安装 Harbor
cd ~/harbor
# 准备配置
./prepare
# 安装并启动
./install.sh
# 安装特定组件(如 Trivy 扫描器)
./install.sh --with-trivy
启动和停止
# 停止 Harbor
docker-compose -f /opt/harbor/docker-compose.yml down
# 启动 Harbor
docker-compose -f /opt/harbor/docker-compose.yml up -d
# 查看状态
docker-compose -f /opt/harbor/docker-compose.yml ps
客户端配置
配置证书信任
# 复制 CA 证书到 Docker 信任目录
sudo mkdir -p /etc/docker/certs.d/harbor.example.com
sudo cp ~/harbor/certs/ca/ca.crt /etc/docker/certs.d/harbor.example.com/
# 系统信任证书(Ubuntu/Debian)
sudo cp ~/harbor/certs/ca/ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo update-ca-certificates
# 系统信任证书(CentOS/RHEL)
sudo cp ~/harbor/certs/ca/ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
# 重启 Docker
sudo systemctl restart docker
登录仓库
# 登录 Harbor
docker login harbor.example.com -u admin
# 推送镜像
docker tag myapp:v1.0 harbor.example.com/project/myapp:v1.0
docker push harbor.example.com/project/myapp:v1.0
# 拉取镜像
docker pull harbor.example.com/project/myapp:v1.0
Kubernetes 集成
创建镜像拉取 Secret
# 创建 Secret
kubectl create secret docker-registry harbor-secret \
--docker-server=harbor.example.com \
--docker-username=admin \
--docker-password=YourPassword \
--docker-email=admin@example.com \
-n default
在 Pod 中使用
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: myapp
image: harbor.example.com/project/myapp:v1.0
配置默认 ServiceAccount
# 为 default ServiceAccount 添加拉取密钥
kubectl patch serviceaccount default \
-p '{"imagePullSecrets": [{"name": "harbor-secret"}]}' \
-n default
镜像复制与同步
Harbor 仓库间复制
# 在 Harbor UI 中配置:
# 1. 创建目标仓库(仓库管理 -> 新建目标)
# 2. 创建复制规则(仓库管理 -> 复制 -> 新建规则)
使用 Skopeo 同步
# 安装 Skopeo
sudo apt-get install -y skopeo
# 复制镜像
skopeo copy \
docker://harbor1.example.com/project/image:tag \
docker://harbor2.example.com/project/image:tag \
--src-creds=user1:pass1 \
--dest-creds=user2:pass2
# 同步整个仓库
skopeo sync \
--src docker \
--dest docker \
harbor1.example.com/project \
harbor2.example.com \
--src-creds=user1:pass1 \
--dest-creds=user2:pass2
镜像清理策略
Harbor 自动清理
# 在 harbor.yml 中配置
garbage_collection:
enabled: true
schedule: "0 0 * * *" # 每天凌晨执行
workers: 5
手动清理
# 进入 Harbor 目录
cd /opt/harbor
# 执行垃圾回收
docker-compose exec registry bin/registry garbage-collect \
/etc/registry/config.yml
# 清理未使用的卷
docker volume prune -f
多架构镜像支持
构建多架构镜像
# 启用 Buildx
docker buildx create --name multiarch --use
# 构建并推送多架构镜像
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t harbor.example.com/project/myapp:v1.0 \
--push .
创建 Manifest
# 拉取不同架构镜像
docker pull --platform linux/amd64 harbor.example.com/project/myapp:v1.0-amd64
docker pull --platform linux/arm64 harbor.example.com/project/myapp:v1.0-arm64
# 创建 manifest 列表
docker manifest create harbor.example.com/project/myapp:v1.0 \
harbor.example.com/project/myapp:v1.0-amd64 \
harbor.example.com/project/myapp:v1.0-arm64
# 注解架构信息
docker manifest annotate harbor.example.com/project/myapp:v1.0 \
harbor.example.com/project/myapp:v1.0-amd64 --arch amd64
docker manifest annotate harbor.example.com/project/myapp:v1.0 \
harbor.example.com/project/myapp:v1.0-arm64 --arch arm64
# 推送 manifest
docker manifest push harbor.example.com/project/myapp:v1.0
安全加固
启用漏洞扫描
# 安装时启用 Trivy
./install.sh --with-trivy
# 在 UI 中配置扫描策略:
# 1. 项目 -> 配置管理 -> 部署安全
# 2. 开启自动扫描镜像
# 3. 阻止危险级别漏洞的镜像运行
镜像签名(Notary)
# 安装时启用 Notary
./install.sh --with-notary
# 推送并签名镜像
export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com
docker push harbor.example.com/project/myapp:v1.0
访问控制
# 创建项目并配置成员权限
# 1. 管理员(Admin):完全控制
# 2. 维护者(Maintainer):推送/拉取/配置
# 3. 开发者(Developer):推送/拉取
# 4. 访客(Guest):仅拉取
监控与日志
启用 Prometheus 监控
# harbor.yml
metric:
enabled: true
port: 9090
path: /metrics
日志配置
# harbor.yml
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
external_endpoint:
protocol: tcp
host: logstash.example.com
port: 5044
故障排查
常见问题
# 查看 Harbor 日志
cd /opt/harbor
docker-compose logs -f
# 查看特定服务日志
docker-compose logs -f core
docker-compose logs -f registry
# 检查磁盘空间
df -h /data/harbor
# 修复权限
docker-compose exec registry chown -R 10000:10000 /storage
重置管理员密码
cd /opt/harbor
docker-compose down
# 修改配置文件中的密码
vim harbor.yml
# harbor_admin_password: NewPassword
# 重新准备和启动
./prepare
docker-compose up -d
总结
本文介绍了 Docker 镜像仓库的配置方法:
- 镜像加速:配置国内镜像源提升拉取速度
- 私有仓库:使用 Docker Registry 快速搭建简单仓库
- Harbor 部署:企业级仓库的完整部署和配置流程
- K8s 集成:Secret 配置和默认 ServiceAccount 设置
- 镜像同步:使用 Skopeo 和 Harbor 复制功能
- 多架构支持:构建和推送多平台镜像
- 安全加固:漏洞扫描、镜像签名、访问控制
通过合理配置镜像仓库,可以构建高效、安全的企业级容器镜像管理体系。