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

阿里云仓库

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

注册账号

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

创建仓库

  先创建一个命名空间,这相当于每个人独立的url,可以以代码类别或者性质命名创建(也可以凭个人喜好),每个账号只能创建5个命名空间,不过也够用了。
  然后创建镜像仓库。
在这里插入图片描述
  地域选择离自己比较近的地域,这样延迟会稍微低一些,选择已创建的命名空间,仓库名的命名一般是服务名或者软件名。公开或者私有看个人请款选择。

上传镜像

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

打标签

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

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

登陆

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

1
2
3
4
5
6
7
8
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-store

Login Succeeded
root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5#

上传

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

  这时就上传成功了

拉取镜像

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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 镜像

1
2
3
4
5
6
7
8
9
10
11
[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

搭建单机仓库

  先创建授权使用目录

1
mkdir -p /docker/auth

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

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

  验证用户名密码

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

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

1
2
3
4
5
6
7
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错误。

1
2
3
4
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≦)〃嗷~

1
2
3
4
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文件。

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

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

1
2
3
4
5
6
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的安装过程。
  下载离线包,并解压。

1
2
3
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版本是有要求的,可以查看上面的官方文档链接查看确切版本。
Harbor要求
  而如果使用包管理工具yum或者apt直接安装的docker-compose可能版本会比较低,我们这里采用python包管理工具python-pip来安装docker-compose

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

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

1
2
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命令,也可以通过软链接方式实现

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

  然后修改配置文件harbor.cfg

1
2
cd /usr/local/harbor
vim harbor.cfg

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

1
2
3
4
5
6
7
8
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

1
./prepare

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

1
docker-compose up -d

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

1
./install.sh

  这时候就可以通过浏览器访问我们刚刚搭建的harbor仓库了,至此企业私有仓库就算是搭建好了。
在这里插入图片描述
  管理员用户名为admin,密码为我们之前在配置文件中修改的harbor_admin_password
  后期如果需要修改配置文件信息,需要先停止harbor,然后修改信息后,更新配置文件信息至harbor服务,之后再试用docker-compose up -d启动harbor服务即可,流程如下。

1
2
3
4
5
cd /usr/local/harbor
docker-compose stop
vim harbor.cfg
./prepare
docker-compose up -d

在这里插入图片描述  推送流程与使用其他云镜像仓库相同,先打标签,开头加上ip/仓库名,然后直接推送即可。


一个低调的男人