Docker-仓库
Docker镜像仓库概述
Docker镜像仓库(Docker Registry)是负责存储、管理和分发Docker镜像的服务,类似于其他编程语言中的包管理系统。它允许开发者上传、下载和管理Docker镜像,是整个Docker容器化流程中的关键环节。
核心概念解析:
- Registry(注册服务器):镜像存储和分发的服务端应用,如Docker Hub、Harbor或官方registry。
- Repository(仓库/镜像仓库):同一类镜像的集合,例如nginx是一个repository,可以包含多个版本。
- Image(镜像):构建和运行容器的基础文件,是仓库中的具体对象,可以有多个标签。
- Tag(标签):同一仓库下镜像的不同版本标识,如nginx:1.25或nginx:latest
仓库组成
[registry:仓库地址]/[namespace:命令空间(作者名)]/[image:镜像名]:[tag:标签(版本号)]
docker.io/library/nginx:latest- docker.io:仓库地址。
- docker.io/library/nginx:镜像仓库。存放一个镜像的不同版本。
公共仓库
官方地址:
开放给所有人使用的镜像仓库,公有仓库的特点是任何人都可以拉取(pull)镜像,适合开源项目、公开分发和学习交流。
阿里云ACR
操作步骤
- 登录阿里云控制台搜索
ACR。 - 创建个人版(镜像工具里有镜像加速器)
- 创建
命令空间 - 创建
镜像仓库
操作命令
登录阿里云 Container Registry
docker login --username=阿里云用户名 阿里云加速域名.cn-beijing.personal.cr.aliyuncs.com从Registry中拉取镜像
docker pull crpi-vseztbia2u1dmfxq.cn-beijing.personal.cr.aliyuncs.com/linuxjs/linuxjs:[镜像版本号]将镜像推送到Registry
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 | 说明 | 操作系统 | 预装软件 |
|---|---|---|---|---|
| nginx | 192.168.148.130 | Nginx负载均衡 | openEuler-24.03(LTS) | Nginx |
| harbor-01 | 192.168.148.131 | Harbor节点 | openEuler-24.03(LTS) | Docker、docker-compose、Harbor |
| harbor-02 | 192.168.148.132 | Harbor节点 | openEuler-24.03(LTS) | Docker、docker-compose、Harbor |
| nfs | 192.168.148.133 | 共享存储 | openEuler-24.03(LTS) | NFS |
| client | 192.168.148.134 | Docker客户端 | openEuler-24.03(LTS) | Docker |
NFS 部署
在NFS上操作
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
# 安装客户端
dnf install -y nfs-utils
# 开的机自动挂载
echo "192.168.148.133:/data/harbor /data/harbor nfs defaults,_netdev 0 0" >> /etc/fstab
mount -aDocker 安装
# 添加软件源信息
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 安装
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
./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上操作
# 安装依赖
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.localharbor 界面配置
创建新项目
在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不能修改
- Cron:
带宽:这里是带宽限制
选项:勾选
覆盖,勾选分块复制
部署客户端
安装Docker
# 添加软件源信息
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验证
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),否则磁盘空间不会释放。
进入系统管理 → 清理服务 → 垃圾清理,配置定时任务执行时间,如我这里配置的是每周,如果构建更为频繁也可以配置为每天
