本文首发于我的个人网站: https://hewanyue.com/
本文作者: Hechao
本文链接: https://hewanyue.com/blog/6187894.html

  比较常见的docker镜像仓库,有docker官方仓库https://hub.docker.com/,和阿里云镜像仓库https://cr.console.aliyun.com/cn-hangzhou/instances/images,可以比较方便的拉取镜像或储存容器镜像。而在企业生产中,绝对部分情况我们都是使用企业内部的镜像仓库,来分发部署我们的代码。本文将详细介绍阿里云仓库还有私有云仓库Registry、Harbor的搭建和使用的详细步骤方法。

阿里云仓库

  docker官方仓库配置比较简单,而且大部分是默认配置,且速度不如阿里云镜像仓库速度快,所以我这里就不介绍了,使用方式和阿里云容器镜像仓库差不多类似。

注册账号

  使用阿里云仓库服务首先要注册阿里云账号,支付宝也可以登陆,比较快捷。点击上面的网址登陆即可。

创建仓库

  先创建一个命名空间,这相当于每个人独立的url,可以以代码类别或者性质命名创建(也可以凭个人喜好),每个账号只能创建5个命名空间,不过也够用了。
  然后创建镜像仓库。

  地域选择离自己比较近的地域,这样延迟会稍微低一些,选择已创建的命名空间,仓库名的命名一般是服务名或者软件名。公开或者私有看个人请款选择。

上传镜像

  有了仓库之后,我们就可以上传镜像了。

打标签

  要上传镜像,第一步,要先重新打标签,将阿里云的仓库源的地址,仓库名,以及版本号重新打标签,生成新镜像。例如对已有的haproxy镜像重新打标签,因为我选择的是北京节点,所以打标命令如下:

docker tag haproxy-base:v1 registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】

登陆

  想上传或者下载镜像一般都需要授权才可以,这就要求我们要用有权限的帐号登陆,才可以上传镜像或者下载镜像。

root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5# docker login --username=【账号名】 registry.cn-beijing.aliyuncs.com
Password:
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-storeLogin Succeeded
root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5#

上传

  用docker images可以查看所有的镜像,选择已经打了阿里云网址的标签的镜像上传就可以了

root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5# docker push registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】
The push refers to repository [registry.cn-beijing.aliyuncs.com/命名空间名/仓库名]
0ec88a00d427: Pushed
6a6e6f03a1a5: Pushed
965bdb9c5299: Pushed
a1d450e33837: Pushed
837dac687863: Pushed
b39d6a9ec3e2: Pushed
1e7fbf47b8df: Pushed
dc298319f184: Pushed
e4809dffd3aa: Pushed
b3cdf76b6336: Pushed
2fc5c4732662: Pushed
2d03b9db6c3f: Pushed
89169d87dbe2: Pushed
haproxy: digest: sha256:f0b4157cd18498e4bc373e333e4fb0b85a65d00e03de2d65015b0d0da9099af6 size: 3049

  这时就上传成功了

拉取镜像

  其他主机登陆成功之后,通过拉取命令就可以从阿里云端下载镜像了。

[root@DockerCentOS ~]# docker pull registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】
haproxy: Pulling from xxxxxxxxxx/web
ac9208207ada: Already exists
75c124fe932b: Pull complete
9ef7eb04bb69: Pull complete
c5f97c472240: Pull complete
9dc49af65399: Pull complete
a745615abdba: Pull complete
ddcf37c0f462: Pull complete
0c406d186167: Pull complete
246fafa1cb32: Pull complete
057e62247ad8: Pull complete
770d7edff222: Pull complete
b4064e1ed3ec: Pull complete
d0a103ae1f19: Pull complete
Digest: sha256:f0b4157cd18498e4bc373e333e4fb0b85a65d00e03de2d65015b0d0da9099af6
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/xxxxxxxxxx/web:haproxy
registry.cn-beijing.aliyuncs.com/xxxxxxxxxx/web:haproxy

  这时就可以在docker images的镜像列表中看到刚刚拉取的镜像了。

搭建私有仓库

  阿里云镜像仓库虽然很方便,但是在生产环境中,每次都从云端拉取或者上传至云端仓库,太消耗企业带宽,有时候数据繁忙的时候,很有可能会堵塞业务,而且速度也较慢。所以企业中都会基于内部局域网搭建企业内部使用的私有仓库。一般搭建私有仓库有两种解决方案,一个是docker自带的Docker Registry,还有就是由vmware公司开源的harbor。

Docker Registry

  Docker Registry 作为 Docker 的核心组件之一负责镜像内容的存储与分发, 客户端的 docker pull 以及 push 命令都将直接与 registry 进行交互,最初版本的 registry由Python实现,由于设计初期在安全性, 性能以及API的设计上有着诸多的缺陷,该版本在 0.9 之后停止了开发,由新的项目 distribution(新的 docker register 被称为 Distribution)来重新设计并开发下一代 registry,新的项目由 go 语言开发,所有的 API, 底层存储方式, 系统架构都进行了全面的重新设计已解决上一代registry 中存在的问题, 2016 年 4 月份 rgistry 2.0 正式发布, docker 1.6 版本开始支持 registry 2.0,而八月份随着 docker 1.8 发布, docker hub 正式启用 2.1 版本registry 全面替代之前版本 registry,新版 registry 对镜像存储格式进行了重新设计并和旧版不兼容, docker 1.5 和之前的版本无法读取 2.0 的镜像, 另外, Registry2.4 版本之后支持了回收站机制,也就是可以删除镜像了,在 2.4 版本之前是无法支持删除镜像的,所以如果你要使用最好是大于 Registry 2.4 版本的。
  Docker Registry的优势就是比较小(25M),但是功能表比较简单。

下载 docker registry 镜像

[root@DockerCentOS ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

搭建单机仓库

  先创建授权使用目录

mkdir -p /docker/auth

  创建一个用户并创建密码文件

cd /docker
docker run --entrypoint htpasswd registry -Bbn Mice 123456 > auth/htpasswd #创建一个用户并生成密码

  验证用户名密码

[root@DockerCentOS docker]# cat auth/htpasswd
Mice:$2y$05$XqNS4BH3gkxodR9MQyhnIuL19uT4wfa6MjUgXvJUYuo0T0o0J8Tzy

  从registry镜像中启动 docker registry,指定容器名称为registry1,挂载本地/docker/auth目录至容器的/auth目录,传递账号密码变量至容器。

docker run -d -p 5000:5000 --restart=always \
--name registry1 \
-v /docker/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd\registry

  此时如果用我们创建的用户名密码尝试登陆了,记得IP或者域名后面要加5000端口,否则会报502错误。

root@DockerUbuntu19:~# docker login 192.168.32.20
Username: Mice
Password:
Error response from daemon: login attempt to http://192.168.32.20/v2/ failed with status: 502 Bad Gateway

  不过很有可能当你加上5000端口,可能还会有报错。ヾ(≧O≦)〃嗷~

root@DockerUbuntu19:~# docker login 192.168.32.20:5000
Username: Mice
Password:
Error response from daemon: Get https://192.168.32.20:5000/v2/: http: server gave HTTP response to HTTPS client

  这是因为我们每一个docker主机要设置允许insecure-registries,加上我们registry仓库的IP或者域名。
  同样,可以修改/lib/systemd/system/docker.service启动脚本文件,或者/etc/docker/daemon.json文件,推荐修改/etc/docker/daemon.json文件。

{"registry-mirrors": ["https://360k4x9i.mirror.aliyuncs.com"],"insecure-registries": ["192.168.32.19","DockerCentOS20:5000"],"bip": "10.20.0.1/24"
}

  然后重启docker服务,此时再尝试登陆,就回提示登陆成功。

root@DockerUbuntu19:~# docker login DockerCentOS20:5000
Username: Mice
Password:
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

  之后就与阿里云的镜像仓库使用方法相同了,不过速度上会快很多(毕竟内网),可以如果要上传镜像至regist仓库,先打好标签就可以了,下载写明下载仓库源,也就可以正常下载了。ヾ(=゚・゚=)ノ喵♪

Harbor

  Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器, 由vmware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等, 扩展了开源 Docker Distribution。作为一个企业级私有Registry服务器,Harbor 提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制, 镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控, 另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等 ,所以企业生产中,我们更多会选择Harbor。

下载harbor安装包

  下载地址: https://github.com/vmware/harbor/releases
  安装文档:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
  本次以harbor的1.75版本为例,演示harbor的安装过程。
  下载离线包,并解压。

cd /usr/local/src
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz
tar xvf harbor-offline-installer-v1.7.5.tgz

  也可以下载在线安装包,但里面没有镜像,之后还要去拉取镜像,不适合生产环境。

安装docker-compose

  Harbor是需要使用docker编排工具docker-compose安装,docker-compose我们之后会专门介绍。而且对docker-compose版本是有要求的,可以查看上面的官方文档链接查看确切版本。

  而如果使用包管理工具yum或者apt直接安装的docker-compose可能版本会比较低,我们这里采用python包管理工具python-pip来安装docker-compose

apt install python-pip -y
pip install docker-compose

  然后可以通过命令docker compose -v看到docker-compose版本已经是最新稳定版1.25版本了。

root@DockerUbuntu19:/usr/local/src# docker-compose -v
docker-compose version 1.25.0, build b42d419

安装Harbor

  我们习惯于将源码包放在/usr/local/src下,而将主程序放在/usr/local/目录中,所以我们可以将harbor目录的的路径改为/usr/local/harbor,可以通过mv命令,也可以通过软链接方式实现

ln -sv /usr/local/src/harbor /usr/local/

  然后修改配置文件harbor.cfg

cd /usr/local/harbor
vim harbor.cfg

  修改其中主机名(改为IP或者域名),管理员登录密码,及邮箱即可。

hostname = 192.168.32.19
email_identity = harbor
email_server = smtp.163.com
email_server_port = 25
email_username = XXXXXXXXX@163.com
email_password = XXXXXXXXXX
email_from = admin <XXXXXXXX@163.com>
harbor_admin_password = XXXXXXXXXXXXX

  然后更新配置文件中的环境变量到安装文件中,忘记更新环境变量会提示找不到环境变量文件ERROR: Couldn't find env file: /usr/local/src/harbor/common/config/core/env

./prepare

  此时就可以执行命令,来创建并安装Harbor了。

docker-compose up -d

  或者执行官方脚本(两个都可以)

./install.sh

  这时候就可以通过浏览器访问我们刚刚搭建的harbor仓库了,至此企业私有仓库就算是搭建好了。

  管理员用户名为admin,密码为我们之前在配置文件中修改的harbor_admin_password
  后期如果需要修改配置文件信息,需要先停止harbor,然后修改信息后,更新配置文件信息至harbor服务,之后再试用docker-compose up -d启动harbor服务即可,流程如下。

cd /usr/local/harbor
docker-compose stop
vim harbor.cfg
./prepare
docker-compose up -d

  推送流程与使用其他云镜像仓库相同,先打标签,开头加上ip/仓库名,然后直接推送即可。

启用https

  harbor还支持https加密协议传输,企业内部使用可能对此需求不大,可以不设置,不过当镜像仓库要经过公网环境时,就必须要采用https加密协议了。
  下面就具体演示下,harbor实现https加密的配置。
  想实现https,首先需要证书和秘钥,如果有已经签发好nginx证书等的可以直接拿来使用,或者去专门为harbor域名申请一个证书。我们这里就自签名一个证书作为演示。

mkdir -p /usr/local/src/harbor/certs/
openssl genrsa -out /usr/local/src/harbor/certs/harbor-ca.key 2048 #生成秘钥
touch /root/.rnd  #不做这一步也可以,不过会提示random number generator:RAND_load_file:Cannot open file../crypto/rand/randfile.c:88:Filename=/root/.rnd
openssl req -x509 -new -nodes -key /usr/local/src/harbor/certs/harbor-ca.key -subj "/CN=harbor.local.com" -days 7120 -out /usr/local/src/harbor/certs/harbor-ca.crt  #签发证书

  有了证书我们就可以修改harbor的配置文件了

cd /usr/local/src/harbor/
vim harbor.cfg

  接着前面的操作,这次仅修改hostnameui_url_protocolssl_certssl_cert_key几项就可以了。

hostname = harbor.local.com
ui_url_protocol = https
ssl_cert = /usr/local/src/harbor/certs/harbor-ca.crt
ssl_cert_key = /usr/local/src/harbor/certs/harbor-ca.key

  然后重新加载配置文件并启动harbor服务

./prepare
docker-compose up -d

  配置好host解析,windows修改C:\Windows\System32\drivers\etc\hosts,linux主机修改/etc/hosts文件。
  直接访问https://harbor.local.com就可以进入我们的harbor登陆界面了。
  不过这时,我们的docker主机还是不能上传和拉取镜像。需要将harbor的证书分发到各个主机,如果是各大CA签发的证书,就不需要这一步了。
  我们可以执行下面脚本来完成分发任务。

#!/bin/bash
#目标主机列表
PASSWORD=XXXXXX
IP="
192.168.32.18
192.168.32.19
192.168.32.20
"
which sshpass &> /dev/null || apt update;apt install sshpass -y #适用于Ubuntu
for node in ${IP};dosshpass -p $PASSWORD ssh-copy-id -p22 -o StrictHostKeyChecking=no ${node}if [ $? -eq 0 ];thenecho "${node} 秘钥 copy 完成,准备环境初始化....."ssh -p22 ${node} "mkdir /etc/docker/certs.d/harbor.local.com -p"echo "Harbor 证书目录创建成功!"scp -P22 /usr/local/src/harbor/certs/harbor-ca.crt ${node}:/etc/docker/certs.d/harbor.local.com/harbor-ca.crtecho "Harbor 证书拷贝成功!"
#               scp -P22 /etc/hosts ${node}:/etc/hosts
#               echo "host 文件拷贝完成"scp -r -P22 /root/.docker ${node}:/root/echo "Harbor 认证文件拷贝完成!"
#               scp -r -P22 /etc/resolv.conf ${node}:/etc/elseecho "${node} 秘钥 copy 失败"fi
done

  将三台主机证书都放置进去,并且还做了ssh免密登陆。此时就可以在三个主机上使用命令docker login harbor.local.com登陆我们的harbor仓库了。之后拉取镜像与上传镜像就与之前一样了。

Harbor的高可用

  搭建两个harbor主机,在web界面设置目标仓库为对方IP,每个仓库都分别设置好复制规则之后,确保两个harbor上有相同的数据。
然后在两个harbor主机上都安装keepalived,并设置VIP,并验证VIP漂移成功。
  之后用VIP或者指向VIP的域名就可以访问了。而且可以通过VIP正常拉取镜像,不过在VIP发生漂移的时候,连接会断开,需要重新登陆。如果想实现redis会话共享,就需要单独安装redis集群实现了。

Docker(五)——Docker镜像仓库相关推荐

  1. Docker使用国内镜像仓库

    Docker使用国内镜像仓库 {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"] } 找到 ...

  2. 搭建Docker本地私有镜像仓库

    在使用Docker service create创建容器时,Docker首先默认从Docker Hub官方去下载镜像,这很不方便,很多时候我们的镜像都是使用Dockerfile自定义私有镜像,不对外公 ...

  3. Docker容器之镜像仓库详解

    Docker容器之镜像仓库详解 文章目录 Docker容器之镜像仓库详解 1. 什么是Docker Image? 2. 什么是Docker Registry? 3. 镜像相关的操作 本文将集中对镜像. ...

  4. Docker 使用国内镜像仓库

    Docker 使用国内镜像仓库 1.问题描述 2.总结 1.问题描述 由于某些原因,导致Docker镜像在国内下载速度特别慢.所以为了沉浸式开发.最好切换为国内源.这里以163 的镜像仓库举例.首先修 ...

  5. Docker Hub公共镜像仓库的使用

    创建账号并登陆这里是登陆入口 登陆账号 登陆进入之后里面目前仓库,现在去创建一个 下面我选的是公共仓库,别人也可以访问到 在服务器上登陆进来,进行上传镜像到仓库 [root@docker ~]# do ...

  6. docker介绍说明,docker配置代理加速器、docker使用国内镜像仓库

    文章目录 容器的介绍 了解容器 容器管理 配置docker代理[加速器] 说明 配置阿里云 配置docker加速器 使用国内镜像仓库 网易云 阿里云 容器的介绍 了解容器 下面这篇博客中清晰解释了何为 ...

  7. Docker Registry 私有镜像仓库批量清理镜像

    Docker 私有镜像仓库批量清理镜像 前言 在频繁长期使用镜像仓库后,由于镜像仓库清理镜像比较费劲,业内也没有一个比较好的清理方案,官方提供的镜像仓库清理也比较费劲,导致 Docker 镜像仓库越积 ...

  8. 一文搞定docker创建私有镜像仓库(配置启动http和https方式私有仓库服务,查询、删除私有仓库镜像)

    docker除了使用公共镜像仓库之外,也可以创建私有镜像仓库.对于内部开发.测试.部署环境来说,是很有必要的.        如何创建私有镜像仓库服务呢?当然是以容器的方式啦! 1.拉取官方regis ...

  9. 【dockerregistry】关于docker login的镜像仓库登录凭证

    当我使用docker 对私有存储库执行docker login时,docker 会记住对应 registry的登陆用户名,在$HOME/.docker/config.json文件中创建一个条目,方便下 ...

  10. Docker搭建私有镜像仓库

    一. 常见镜像仓库服务 镜像仓库(Docker Registry)有公共的和私有的两种形式: 公共仓库:例如Docker官方的Docker Hub,国内也有一些云服务商提供类似于Docker Hub的 ...

最新文章

  1. 更换用installshield打包生成exe文件的图标
  2. 浅谈并发与并行(一)
  3. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件
  4. scrapy不抓取重复的网页解决办法
  5. Spring4.x(5)--ApplicationContext接口
  6. 最新版Zookeeper常用命令总结(收藏吃灰系列)
  7. [linux-脚本]shebang(shabang #!)
  8. art template模板中修改时间格式
  9. cmake 交叉编译工具链
  10. 2019年2月10日训练日记
  11. 计算机毕业设计node+vue基于微信小程序的乐团团购系统的设计与实现
  12. python语句分号_你知道分号在各种编程语言中的作用吗?
  13. 将 EBS R12.1.1 升级到 R12.1.3
  14. 【JavaWeb从零到一】↣JDBC连接池JDBCTemplate
  15. Oracle 锁详解(lock)
  16. 安徽省发票认证服务器网站,安徽省增值税发票综合服务平台网址及操作指南
  17. 案例 | 重新定义“一个人的小酒”,RIO如何微醺营销击中00后的心?
  18. 动作游戏(ACT)——棱角战士(基于Unity3D 5.4.2)
  19. ERP系统的开发------(整理)
  20. 『Halcon』基于Halcon的印刷图像质量检测系统

热门文章

  1. 【文献翻译神器推荐】DeepL
  2. 68 个Python内置函数,你用过几个?
  3. 技术总监做技术经理的工作,技术经理做研发的工作是怎么回事?
  4. 【蓝牙开发】低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
  5. JS原生实现照片抽奖
  6. 尘福通:智慧城市建设、运营、演进路径思考
  7. 禁用右键 回车 ESC 和 ALT+F4组合建
  8. 酱香科技不在YYDS了,市盈率50倍的白酒,要回调到25倍的市盈率?泡沫要破灭了
  9. 兔子繁殖问题Java实现
  10. java 随机生成不重复的数字_java中生成不重复随机的数字