一、Docker搭建私有仓库几种方式
搭建Docker私有仓库主要有以下几种方式:
-
使用Docker官方提供的Registry镜像:Docker官方提供了一个用于构建私有镜像仓库的Registry镜像,只需将镜像下载并运行容器,然后暴露5000端口即可使用。可以通过修改Docker的配置文件daemon.json,在其中添加私有镜像仓库地址来实现。
-
在Docker官方网站中直接创建:在Docker的官方网站(https://hub.docker.com/)中,可以创建属于自己的账户,然后在Repository中创建自己的仓库。这种方式比较简单,但需要网络连接,且对于大规模使用可能存在一些限制。
-
使用第三方工具Harbor:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,提供了丰富的功能,如用户管理、镜像复制、访问控制等。此外,它还提供了图形化界面,方便用户进行操作和管理。使用Harbor需要下载并安装,同时需要Docker Compose的支持。
-
自行搭建本地仓库:除了使用官方或第三方的工具外,还可以自行搭建本地仓库。这种方式需要一定的技术能力和资源投入,但可以根据实际需求进行定制和优化。自行搭建本地仓库时,可以考虑使用开源的镜像仓库软件,如Nexus Repository等。
需要注意的是,在搭建Docker私有仓库时,需要考虑到安全性、可用性和扩展性等方面的问题。例如,可以添加证书加密功能和用户登录认证来提高安全性;通过负载均衡和容错机制来提高可用性;根据实际需求进行扩展和优化等。
总的来说,选择哪种方式搭建Docker私有仓库取决于具体需求和实际情况。如果只需要简单地存储和管理镜像,可以考虑使用Docker官方提供的Registry镜像或第三方工具Harbor;如果需要更多的定制和优化,可以考虑自行搭建本地仓库或使用其他开源的镜像仓库软件。
二、使用registry搭建私有仓库
使用registry搭搭建Docker私有仓库的步骤如下:
1)拉取私有仓库镜像:使用命令docker pull registry
来拉取私有仓库的镜像。私有仓库本身就是一个镜像,通过该命令可以从Docker Hub或其他镜像仓库中获取。
2)启动私有仓库容器:使用命令docker run -d -p 5000:5000 --restart=always --name registry registry
来启动私有仓库容器。这将创建一个名为registry的容器,将容器内的5000端口映射到主机的5000端口,并设置为总是重启。
另外,如果你希望将上传的镜像存放到本地的指定路径,可以使用-v参数来指定本地路径,例如:docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
。
启动成功后,可以使用
docker ps
查看
3)测试私有仓库:在浏览器中输入http://<your-server-ip>:5000/v2/_catalog
,将替换为你的服务器IP地址,如果能够正常访问,说明私有仓库搭建成功。
注意:如果你的私有仓库没有使用https,需要在Docker客户端上修改/etc/docker/daemon.json
文件(如果文件不存在则新建),添加私有仓库地址到"insecure-registries"列表中,然后重启Docker服务。例如,在daemon.json文件中添加以下内容:
{
"insecure-registries": ["<your-server-ip>:5000"]
}
然后,使用命令systemctl restart docker
重启Docker服务。
当配置了这个选项后,Docker 在与这些指定的镜像仓库通信时,将不再验证 TLS 证书,从而绕过了 Docker 的安全机制。
4)上传镜像到私有仓库:首先,使用docker tag
命令将本地镜像标记为私有仓库的镜像,然后使用docker push
命令将镜像上传到私有仓库。例如:
docker tag <image-id> <your-server-ip>:5000/<image-name>:<image-version>
docker push <your-server-ip>:5000/<image-name>:<image-version>
# 例如
docker tag e8f7073d1aa1 192.168.119.133:5000/mynginx:1.0
docker push 192.168.119.133:5000/mynginx:1.0
将<image-id>
替换为你要上传的镜像的ID,<your-server-ip>
替换为你的服务器IP地址,<image-name>
和分别替换为镜像的名称和版本号。
5)已上传到私有仓库中的镜像,可以使用docker pull
拉取
以上步骤完成后,你就成功搭建了一个Docker私有仓库,并可以将镜像上传到该仓库中。其他机器可以通过拉取私有仓库中的镜像来使用该镜像。
三、使用registry搭建私有仓库
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。以下是使用Harbor搭建私有仓库的一般步骤:
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。以下是使用Harbor搭建私有仓库的一般步骤:
1、安装Harbor
1.1、环境准备
准备一台具有足够磁盘空间的虚拟机或物理机,建议关闭防火墙和SELinux,并确保时间同步服务已配置。
-
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
-
关闭内核安全机制
sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0
1.2、安装Docker和Docker Compose:
在目标机器上安装Docker和Docker Compose。可以从Docker官网下载并安装Docker,然后使用pip或下载二进制文件来安装Docker Compose。
-
部署Docker
-
卸载系统之前的 docker
# 安装前先更新yum,不然有可能出现本机无法连接虚拟机的mysql、redis等 sudo yum update # 卸载系统之前的docker,以及 docker-cli sudo yum remove docker-ce docker-ce-cli containerd.io # 卸载系统之前的docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装 Docker-CE
(1)、安装必须的依赖sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
(2)、设置 docker repo 的 yum 位置
# 配置镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)、安装 docker,以及 docker-cli
该命令安装docker以后,kubeadm初始化时会报错,提示版本不兼容sudo yum install -y docker-ce docker-ce-cli containerd.io
-
配置 docker 加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://chqac97z.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
启动 docker & 设置 docker 开机自启
systemctl enable docker
-
查看docker版本
[root@localhost harbor]# docker -v Docker version 26.1.4, build 5650f9b
-
-
部署Docker-Compose服务
部署Harbor是需要Docker-Compose服务做支撑的,所以先部署该服务
-
下载最新Docker-Compose
# 下载阿里云docker-compose二进制文件 [root@localhost ~]# curl -L https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose # 添加可执行权限 [root@localhost ~]# chmod +x /usr/local/bin/docker-compose
-
查看Docker-Compose版本
[root@localhost ~]# docker-compose -v docker-compose version 1.21.2, build a133471
-
1.3、部署Harbor服务
-
下载并解压Harbor安装包
从Harbor的GitHub仓库下载最新版本的离线安装包。使用wget命令下载,并使用tar命令解压。wget https://github.com/goharbor/harbor/releases/download/vX.X.X/harbor-offline-installer-vX.X.X.tgz tar xvf harbor-offline-installer-vX.X.X.tgz
其中,vX.X.X应替换为实际的版本号。
官网地址:https://github.com/goharbor/harbor/releases
例如,安装版本v2.10.0
[root@localhost ~]# yum -y install wget [root@localhost ~]# wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz [root@localhost ~]# tar xvf harbor-offline-installer-v2.10.0.tgz
-
配置Harbor参数文件
解压后,在目录下会生成一个harbor.yml.tmpl文件(复制harbor.yml.tmpl并重命名为harbor.yml)。修改此harbor.yml以满足你的需求,例如设置hostname、端口、数据库密码等。# 拷贝一份Harbor的配置文件 [root@localhost ~]# cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml [root@localhost ~]# vim /usr/local/harbor/harbor.yml # 修改hostname,修改为自己的IP地址 hostname: 192.168.119.133 # 将https段的内容全部注释,这里不使用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 ################################################################ # 对配置文件进行语法检查,将会自动拉取必要的镜像 [root@localhost ~]# /usr/local/harbor/prepare
- hostname一定要设置,如果没有域名,先设置为本机ip地址
- 默认文件配置了https,如果没有请先注释
-
所需参数和可选参数
3.1. 所需参数
这些参数需要在配置文件Harbor.yml中设置。如果用户更新他们并运行install.sh脚本重新安装Harbor,参数将生效1、hostname:用于访问用户界面和register服务。他应该是目标机器的IP地址或完全限定域名(FQDN),例如192.168.119.133或hun.kgc.cn。不要使用localhost或172.0.0.1 2.ui_rul_protocol:(http或httpds,默认为http)用于访问UI和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为https 3.max_job_workers:镜像复制作业线程 4.db_password:用于db_auth的MySQL数据库root用户的密码 5.customize_crt:该属性可设置为打开或关闭,默认打开,打开此属性时,准备脚本创建私钥和根整数,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为off 6.ssl_cert:SSL证书的路路径,仅当协议设置为https时采应用 7.ssl_cert_key:SSL密钥的路径,仅当协议设置为https时才应用 8.secretkey_path:用于在复制策略中加密或解密远程register密码的的密钥路径
3.2. 可选参数
这些参数对于更新是可选的,即用户可以将其保留位默认值,并在启动Harbor后在Web UI上进行更新。如果进入Harbor.yml,只会在第一次启动Harbor时生效,随后对这些参数的更新,Harbor.yml将被忽略
注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来说,必须在测试或在Harbor中创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除了默认的admin用户),auth_mode不能被修改
另外,默认情况下,Harbour将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如S3、Openstack Swif、Ceph等。但需要更新common/templates/registry/config.yml文件1.Email:Harbor需要该参数才能向用户发送“密码重置”,并且只有在需要该功能时才需要。请注意,在默认情况下SSL连接时没有启动。如果SMTP服务器需要SSL,但不支持StartLS,那么应该通过设置启动SSL email_ssl = TRUE 2.harbour_admin_password:管理员的处理密码,只在Harbour第一次启动时生效。之后,此设置将被忽略,并且应在UI设置管理员的密码。请注意,默认的用户名/密码时admin/Harbor12345 3.auth_mode:使用的认证类型,默认情况下,它时db_auth,即凭据存储在数据库中对于LADP身份验证,请将其设置位ldap_auth 4.seif_registration:启动/禁用用户注册功能。禁用时,新用户只能由Admin用户创建只有管理员用户可以在Harbor中创建新用户。注意:当auth_mode设置为ldap_auth时,自动注册功能始终处理禁用状态,并且该标志被忽略 5.Token_enpiration:由令牌服务创建的令牌的到期时间(分钟),默认位30分钟 6.project_creation_restriction:用于控制哪些用户的权限项目的标志。默认情况下,每个人都可以创建项目。如果将其设置位"adminonly",那么只有admin可以创建项目 7.verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbour与远程register实例通信时是否验证SSL/TLS证书。将此属性设置为off将绕过SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。
-
启动Harbor
在解压的目录下运行./install.sh脚本开始安装。安装过程中会检查环境、配置文件等,并下载所需的Docker镜像。# 需要一点时间,等待安装回显结束即可 [root@localhost ~]# sh /usr/local/harbor/install.sh
-
查看Harbor启动镜像
[root@localhost ~]# cd /usr/local/harbor/ [root@localhost harbor]# docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------------------- harbor-core /harbor/entrypoint.sh Up (healthy) harbor-db /docker-entrypoint.sh 13 14 Up (healthy) harbor-jobservice /harbor/entrypoint.sh Up (healthy) harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->8080/tcp,:::80->8080/tcp redis redis-server /etc/redis.conf Up (healthy) registry /home/harbor/entrypoint.sh Up (healthy) registryctl /home/harbor/start.sh Up (healthy)
2、访问私有仓库
安装完成后,使用配置的IP地址和端口(或域名)访问Harbor。默认用户名是admin,密码是Harbor12345。登录后可以创建项目、上传和下载镜像等。
- 访问地址:http://192.168.119.133
- 用户名:admin
- 密 码:Harbor12345
进入默认项目library,点击右上角的推送命令,可以看见各种方式的推送命令
2.1、Docker 推送命令
在项目中标记镜像:
推送镜像到当前项目:docker tag SOURCE_IMAGE[:TAG] 192.168.119.133/library/REPOSITORY[:TAG]
Podman 推送命令docker push 192.168.119.133/library/REPOSITORY[:TAG]
推送镜像到当前项目:
Helm 推送命令podman push IMAGE_ID 192.168.119.133/library/REPOSITORY[:TAG]
在项目中打包 chart
推送 chart 到当前项目helm package CHART_PATH
CNAB 推送命令helm push CHART_PACKAGE oci://192.168.119.133/library
推送 CNAB 到当前项目cnab-to-oci push CNAB_PATH --target 192.168.119.133/library/REPOSITORY[:TAG] --auto-update-bundle
2.2、创建一个新项目
在WEB UI界面创建新项目的操作步骤如下。
- 输入用户名和面膜登录界面后可以创建一个新项目。点击“+新建项目”按钮
- 点击“确定”按钮,成功创建新项目后,页面效果如下
- 此时可使用Docker命令在本地通过127.0.0.1来登录和推送镜像。默认情况下Register服务器在端口80上侦听
3、使用docker上传镜像到Harbor
3.1、登录Harbor推送镜像
-
使用 docker 进行登录和推送
在推送镜像之前要做一次登录
[root@localhost ~]# docker login -u admin -p Harbor12345 http://127.0.0.1 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
下载镜像进行测试
[root@localhost ~]# docker pull mysql:5.6
-
将镜像打标签
# push上传镜像必须要以,以下格式进行打标签 # 格式:私有仓库IP地址/项目名称/镜像标签 [root@localhost ~]# docker tag mysql:5.6 127.0.0.1/gulimall/mysql:v1
-
上传镜像到Harbor
[root@localhost ~]# docker push 127.0.0.1/gulimall/mysql:v1 The push refers to repository [127.0.0.1/gulimall/mysql] 7137327a7221: Pushed 49a1ca1cd2b8: Pushed 7c5a5c1986b1: Pushed eba393347f89: Pushed 2612088e90f6: Pushed e3dce1c82d4e: Pushed 7ea96a4e341b: Pushed 4085e588967d: Pushed d414fdead0b9: Pushed 2e1029557391: Pushed 2b83e5699838: Pushed v1: digest: sha256:897086d07d1efa876224b147397ea8d3147e61dd84dce963aace1d5e9dc2802d size: 2621
-
Web-Harbor界面查看
- 在harbor界面gulimall目录下可看见此镜像及相关信息
- 点击项目名称超链接,即可看到如下信息
3.2、客户端上传镜像
以上操作都是在Harbor服务器本地操作。如果其他客户端上传镜像到Harbor,就会报错误。出现这问题的原因Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP。所以与私有镜像交互时就会报错如下内容
[root@k8s-node1 ~]# docker login -u admin -p Harbor12345 http://192.168.119.133
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.119.133/v2/: dial tcp 192.168.119.133:443: connect: connection refused
-
解决办法
在Docker客户端配置操作
解决办法是:在Docker server启动的时候,增加启动参数,默认使用HTTP访问# 解决办法1 [root@k8s-node1 ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry 192.168.119.133 [root@k8s-node1 ~]# systemctl daemon-reload [root@k8s-node1 ~]# systemctl restart docker # 解决办法2 cat > /etc/docker/daemon.json << EOF { # 这个是修改为国内的镜像源,使用国内的源访问速度会快一点 "registry-mirrors": ["https://r9xxm8z8.mirror.aliyuncs.com"], # 指定私有仓库IP地址 "insecure-registries":["192.168.119.133"] } EOF [root@k8s-node1 ~]# systemctl daemon-reload [root@k8s-node1 ~]# systemctl restart docker.service
-
再次登录Harbor
[root@k8s-node1 ~]# docker login -u admin -p Harbor12345 http://192.168.119.133 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
下载镜像进行测试
[root@k8s-node1 ~]# docker pull mysql:5.7
-
将镜像打标签
将镜像打标签上传到gulimall项目里面[root@k8s-node1 ~]# docker tag mysql:5.7 192.168.119.133/gulimall/mysql:v2 [root@k8s-node1 ~]# docker push 192.168.119.133/gulimall/mysql:v2
-
查看Harbor的Web管理界面
gulimall项目里面有两个镜像
四、Harbor日常操作管理
在Harbor仓库中,任何镜像在被push到registry之前都必须有一个自己所属的项目
1、通过Harbor Web创建项目
单击“+新建项目”,填写项目名称。本案例中项目级别为“公有”,则所有对此项目下的镜像拥有读权限,命令行中不需要执行“Docker login”即可下载镜像,镜像操作与Docker Hub一致
2、创建Harbor用户
2.1、创建用户并分配权限
- 在Web管理界面中单击系统管理-》用户管理-》+创建用户,填写用户名为“gulimall-user01”,邮箱为gulimall-user01@gulimall.cn,全名为“用户01”,密码为“Wts123456”,注释为“管理员”
- 用户创建成功后,单击左侧 操作-》删除 按钮可将上述创建的用户设置为管理员角色或进行删除操作。本案例不做任何设置
2.2、添加项目成员
- 单击项目-》gulimall-》成员-》+成员,填写上述创建的用户并分配角色为“开发人员”
- 此时单击左侧“其他操作”按钮仍然可以对成员角色进行变更或者删除操作
2.3、在客户端上使用普通账号操作镜像
-
删除上述打标签的本地镜像
[root@k8s-node1 ~]# docker rmi 192.168.119.133/gulimall/mysql:v2
-
先退出当前用户,然后使用上述创建的用户kgc-user01登录
# 退出账号 [root@k8s-node1 ~]# docker logout 192.168.119.133 Removing login credentials for 192.168.119.133 # 登录账号 [root@k8s-node1 ~]# docker login -u gulimall-user01 -p Wts123456 http://192.168.119.133 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
下载服务器192.168.119.133/gulimall/mysql标签为v1的镜像
[root@k8s-node1 ~]# docker pull 192.168.119.133/gulimall/mysql:v1 v1: Pulling from gulimall/mysql 09f376ebb190: Pull complete 5529e0792248: Pull complete 9b3addd3eb3d: Pull complete 57910a8c4316: Pull complete 7b5f78f21449: Pull complete b7923aa4e8a6: Pull complete 785625911f12: Pull complete Digest: sha256:0db204f933b6d1def0c0c15578f61a80091f8316b04150918413fc4d5c87be69 Status: Downloaded newer image for 192.168.119.133/gulimall/mysql:v1 192.168.119.133/gulimall/mysql:v1
3.3、查看日志
- Web界面日志,操作日志按时间顺序记录用户相关操作
- 点击“myproject-kgc”超链接即可进入此页面
五、维护管理Harbor
可以使用docker-compose管理Harbor。一些有用的命令如下所示,必须在与docker-compose.yml相同的目录中运行
1、停止/启动/重启 Harbor
[root@k8s-node1 ~]# cd /usr/local/harbor/
[root@k8s-node1 harbor]# docker-compose stop | start | restart
2、修改Harbor.yml配置文件
要更改Harbour的配置文件时,请先停止现有的Harbour实例并更新harbor.yml;然后运行prepare脚本来填充配置;最后重新创建并启动Harbour的实例
如上文所说,如修改所需参数,需要重新运行install.sh,如修改可选参数,则需运行脚本 ./prepare 将配置文件内容进行重新生效
[root@k8s-node1 ~]# docker-compose down -v
Stopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-core ... done
Stopping harbor-portal ... done
Stopping redis ... done
Stopping registryctl ... done
Stopping registry ... done
Stopping harbor-db ... done
Stopping harbor-log ... done
Removing harbor-jobservice ... done
Removing nginx ... done
Removing harbor-core ... done
Removing harbor-portal ... done
Removing redis ... done
Removing registryctl ... done
Removing registry ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@k8s-node1 ~]# ./prepare
[root@k8s-node1 ~]# docker-compose up -d
3、移除Harbor服务容器同时保留镜像数据/数据库
# 这条命令将停止和移除Docker Compose中定义的所有容器,并且会同时删除关联的所有卷。 `-v`选项表示同时删除所有卷。
[root@k8s-node1 ~]# docker-compose up -d
4、如须重新部署,需要移除Harbor服务容器全部数据
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下
[root@k8s-node1 ~]# rm -rf /data/database/
[root@k8s-node1 ~]# rm -rf /data/registry/