Skip to content

Docker-仓库

Docker镜像仓库概述

Docker镜像仓库(Docker Registry)是负责存储、管理和分发Docker镜像的服务,类似于其他编程语言中的包管理系统。它允许开发者上传、下载和管理Docker镜像,是整个Docker容器化流程中的关键环节。

核心概念解析

  • Registry(注册服务器):镜像存储和分发的服务端应用,如Docker Hub、Harbor或官方registry。
  • Repository(仓库/镜像仓库):同一类镜像的集合,例如nginx是一个repository,可以包含多个版本。
  • Image(镜像):构建和运行容器的基础文件,是仓库中的具体对象,可以有多个标签。
  • Tag(标签):同一仓库下镜像的不同版本标识,如nginx:1.25或nginx:latest

仓库组成

tex
[registry:仓库地址]/[namespace:命令空间(作者名)]/[image:镜像名]:[tag:标签(版本号)]
docker.io/library/nginx:latest
  • docker.io:仓库地址。
  • docker.io/library/nginx:镜像仓库。存放一个镜像的不同版本。

公共仓库

官方地址:

开放给所有人使用的镜像仓库,公有仓库的特点是任何人都可以拉取(pull)镜像,适合开源项目、公开分发和学习交流。

阿里云ACR

操作步骤

  • 登录阿里云控制台搜索ACR
  • 创建个人版(镜像工具里有镜像加速器)
  • 创建命令空间
  • 创建镜像仓库

操作命令

登录阿里云 Container Registry

bash
docker login --username=阿里云用户名 阿里云加速域名.cn-beijing.personal.cr.aliyuncs.com

从Registry中拉取镜像

bash
docker pull crpi-vseztbia2u1dmfxq.cn-beijing.personal.cr.aliyuncs.com/linuxjs/linuxjs:[镜像版本号]

将镜像推送到Registry

bash
docker tag [ImageId] crpi-vseztbia2u1dmfxq.cn-beijing.personal.cr.aliyuncs.com/linuxjs/linuxjs:[镜像版本号]
docker push crpi-vseztbia2u1dmfxq.cn-beijing.personal.cr.aliyuncs.com/linuxjs/linuxjs:[镜像版本号]

Harbor 企业级仓库

Harbor是VMware公司开源的企业级Docker Registry项目,相比官方registry提供了更多企业级功能

Harbor特性

  • 基于角色的访问控制(RBAC):用户与Docker镜像仓库通过"项目"进行则指管理,一个用户可以对多个镜像仓库在同一个命名空间(project)里有不同的权限。
  • 镜像漏洞扫描
  • 图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
  • 镜像复制同步:镜像可以在多个Registry实例中复制(同步).尤其适合于负载均衡,高可用,混合云和多云的场景。
  • AD/LDAP支持:Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  • 支持Helm Charts
  • RESTful API:提供给管理员对于Harbor更多的操控,使得与其它管理软件集成变得更容易。
  • 审计日志:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化支持(包括中文):以拥有英文,中文,德文,日文和俄文的本地化版本。更多的语言将会添加进来。

Harbor 高可用部署

环境准备

服务器名称IP说明操作系统预装软件
nginx192.168.148.130Nginx负载均衡openEuler-24.03(LTS)Nginx
harbor-01192.168.148.131Harbor节点openEuler-24.03(LTS)Docker、docker-compose、Harbor
harbor-02192.168.148.132Harbor节点openEuler-24.03(LTS)Docker、docker-compose、Harbor
nfs192.168.148.133共享存储openEuler-24.03(LTS)NFS
client192.168.148.134Docker客户端openEuler-24.03(LTS)Docker

NFS 部署

在NFS上操作

bash
dnf install -y nfs-utils rpcbind
mkdir -p /data/harbor
chmod 755 -R /data
chown -R nobody:nobody /data

# 配置
echo "/data 192.168.1.0/24(rw,sync,no_root_squash)" > /etc/exports

# 内核优化
cat >> /etc/sysctl.conf <<EOF
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
EOF
sysctl -p  # 立即生效

# 启动服务
systemctl enable rpcbind nfs --now
# 检测端口
showmount -e

部署Harbor

在harbor-01和harbor-02上操作

挂载NFS
bash
# 安装客户端
dnf install -y nfs-utils
# 开的机自动挂载
echo "192.168.148.133:/data/harbor /data/harbor nfs defaults,_netdev 0 0" >> /etc/fstab
mount -a
Docker 安装
bash
# 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 替换centos识别版本号
sed -i 's+$releasever+9+' /etc/yum.repos.d/docker-ce.repo

# 安装Docker
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 设置配置文件
cat > /etc/docker/daemon.json << 'EOF'
{
    "data-root":"/data/docker",
    "bip":"172.18.0.1/16",
    "exec-opts":["native.cgroupdriver=systemd"],
    "live-restore":true,
    "ipv6": false
}
EOF
systemctl daemon-reload

# 开启Docker服务
systemctl start docker

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
Harbor 安装
bash
wget https://github.com/goharbor/harbor/releases/download/v2.13.0/harbor-offline-installer-v2.13.0.tgz

tar -xvf harbor-offline-installer-v2.13.0.tgz -C /usr/local

cd /usr/local/harbor
cp harbor.yml.tmpl harbor.yml

vim harbor.yml
hostname: 192.168.148.131    #本地地址
#注释 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
  # enable strong ssl ciphers (default: false)
  # strong_ssl_ciphers: false
harbor_admin_password: Harbor12345  #登录密码
data_volume: /data/harbor			# 设置存储路径
# 数据库配置默认使用内置PostgreSQL
database:
启动Harbor
bash
./install.sh

# 开机自启(可选)
echo "/usr/local/harbor/install.sh" >> /etc/rc.local
chmod +x /etc/rc.local

# 通过Web界面(默认http://your-server-ip)访问
username:admin
password:Harbor12345

部署Nginx负载

在Nginx上操作

bash
# 安装依赖
dnf -y install gcc gcc-c++ make cmake pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载安装包
wget -q http://nginx.org/download/nginx-1.26.3.tar.gz
# 解压
tar xf nginx-1.26.3.tar.gz -C /usr/src/

# 预配置
useradd -Ms /sbin/nologin www
cd /usr/src/nginx-1.26.3
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_v2_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-file-aio \
--user=www \
--group=www

# 编译安装
make -j$(nproc) && make install

# 软连接
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

# Nginx 负载均衡配置
cat > /usr/local/nginx/conf/nginx.conf << 'EOF'
worker_processes auto;
user www;
events {
  worker_connections 1024;
}
http {
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout 65;
  client_max_body_size 102400M; #nginx默认不支持传输大文件,增加此行放行大文件
  upstream harbor {
    server 192.168.148.131;
    server 192.168.148.132 backup;
  }
  server {
    listen 80;
    server_name localhost;
    location / {
      proxy_pass http://harbor;
    }
  }
}
EOF
# 启动
nginx
# 开机自启
echo "nginx" >> /etc/rc.local && chmod +x /etc/rc.local

harbor 界面配置

创建新项目

在harbor-01操作

项目 —> 新建项目

  • 项目名称:自定义如:web
  • 访问级别:勾选公开任何人都可访问,否则需要docker login登录
创建备用仓库

如果想push就在harbor-01上操作,如果想pull就在harbor-02上操作

系统管理 —> 仓库管理 —> 新建目标

  • 提供者:选择harbor
  • 目标名:自定义如:harbor-backup
  • 描述:自定义如:主
  • 目标URL:对端IP地址http://192.168.148.132
  • 访问ID:admin
  • 访问密码:Harbor12345
  • 验证远程证书:如果没有证书的话就取消勾选

先点击测试验证通过后保存

创建同步规则
push模式

系统管理 —> 复制管理 —> 新建规则

  • 名称:自定义如:push-backup

  • 描述:自定义如:推送到源端仓库

  • 复制模式:勾选Push-based

    • Push-based:本地Harbor推送到源端仓库
    • Pull-based:远端仓库拉取到本地
  • 源仓库:harbor-backup

  • 源资源过滤器:

  • 目标:

    • 名称空间:如果为空,资源会同步到和源相同名称空间下
    • 仓库扁平化:默认即可
  • 触发模式:选择时间驱动并勾选删除本地资源时同时也删除远程的资源

  • 带宽:这里是带宽限制

  • 选项:勾选覆盖,勾选分块复制

pull模式

在harbor-02操作

系统管理 —> 复制管理 —> 新建规则

  • 名称:自定义如:pull-master

  • 描述:自定义如:从远端仓库拉取

  • 复制模式:勾选Pull-based

    • Push-based:本地Harbor推送到源端仓库
    • Pull-based:远端仓库拉取到本地
  • 源仓库:harbor-master

  • 源资源过滤器:

  • 目标:

    • 名称空间:如果为空,资源会同步到和源相同名称空间下
    • 仓库扁平化:默认即可
  • 触发模式:选择定时

    • Cron:0 * * * * *第一个0不能修改
  • 带宽:这里是带宽限制

  • 选项:勾选覆盖,勾选分块复制

部署客户端

安装Docker
bash
# 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 替换centos识别版本号
sed -i 's+$releasever+9+' /etc/yum.repos.d/docker-ce.repo

# 安装Docker
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 设置配置文件
cat > /etc/docker/daemon.json << 'EOF'
{
    "data-root":"/data/docker",
    "bip":"172.18.0.1/16",
    "exec-opts":["native.cgroupdriver=systemd"],
    "insecure-registries": ["192.168.148.130:80"],
    "live-restore":true,
    "ipv6": false
}
EOF
systemctl daemon-reload

# 开启Docker服务
systemctl start docker

验证

bash
docker login http://192.168.148.130:80
Username: admin
Password: Harbor12345 #隐藏密码,输入不显示,但已经输入

# 适合脚本中执行
echo "your_password" | docker login -u your_username --password-stdin

# 下载镜像测试
docker pull nginx:latest
docker tag nginx:latest 192.168.148.130:80/web/nginx:latest
docker push 192.168.148.130:80/web/nginx:latest

配置镜像清理策略

一般在开发、测试环境中建议一定要配置镜像清理,否则由于构建频繁很快磁盘就会被撑爆。

通过 Web 登录进入Habor,选择需要清理的项目 → 策略 → 添加规则:

  • 以 artifact 数量或天数为条件:根据实际情况进行选择如:保留最近推送的#个,个数自定义

配置完该规则后还没完,还需要配置垃圾回收(GC),否则磁盘空间不会释放

进入系统管理 → 清理服务 → 垃圾清理,配置定时任务执行时间,如我这里配置的是每周,如果构建更为频繁也可以配置为每天