第19章 Docker 镜像私有仓库安装与配置及使用

第19章 Docker 镜像私有仓库安装与配置及使用


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXIJRnPk-1599612182233)(assets/v2-ad0613da551f0819983ebb3715311033_1200x500.jpg)]

基于 Harbor 搭建 Docker 私有镜像仓库

极乐小程序商店(http://store.dreawer.com/)

什么是 Harbor?

第一次使用这个的时候是刚进公司处理的第一个任务的时候,发现 Harbor 就是一个用于存储和分发 Docker 镜像的企业级Registry 服务器。

网上找到一个 Harbor 的架构图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KUyghPTo-1599612182238)(assets/v2-119e23a21244d919d98e5384d95921d8_hd.jpg)]

Harbor 是 VMware 公司开源的企业级 DockerRegistry 项目,项目地址为 https://github.com/vmware/harbor。其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。

安装 Docker

因为系统是 CentOS 7.3 ,内核啥的都已经是 3.10,所以不用担心内核升级的问题,一些操作啥的在 7.x 上操作也很方便。

yum  update                             //系统版本更新
vim /etc/yum.repos.d/docker.repo        //添加以下内容
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
//下面安装 Docker 引擎
yum install docker-engine  -y
//安装docker引擎,此步也可作为更新docker版本的操作:先#systemctl stop docker 停止docker服务,再#yum install docker-engine 更新docker版本
systemctl  enable  docker.service
systemctl  start   docker              //启动docker守护进程
docker info                            //查看docker运行情况
docker -v							//查看版本信息

修改 Docker 配置文件 /etc/default/docker 如下:

DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"	//换成国内的镜像加速源,不然拉取镜像简直龟速,不想在吐槽了

使用 service docker restart 重启 Docker 服务即可。

或者用官方提供的方式:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://ef017c13.m.daocloud.io

安装 Docker-compose

如果是想直接命令安装也行,

下载指定版本的docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
对二进制文件赋可执行权限
chmod +x /usr/local/bin/docker-compose
测试下docker-compose是否安装成功
docker-compose --version
出现如下
docker-compose version 1.17.1, build 6d101fb

但是,这种方法简直龟速,幸好还有种方法,

见这里:https://docs.docker.com/compose/install/#install-compose

这种需要通过 Python 的 pip 安装

安装 PIP

wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz
tar -vxf setuptools-1.4.2.tar.gz
cd setuptools-1.4.2
python2.7 setup.py install		//因为服务器自带 Python 2.7
easy_install-2.7 pip

安装 DOCKER COMPOSE

pip install docker-compose
docker-compose --version	//测试安装是否成功

安装 Harbor

wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.1.2.tgz
离线安装包,也是龟速,把这个下载链接用迅雷下载,速度却贼快,嘿嘿,然后再传到服务器上去,整个过程快很多!
tar -zxvf harbor-offline-installer-v1.1.2.tgz

解压缩之后,进入目录下会看到 harbor.cfg 文件,该文件就是 Harbor 的配置文件。

## Configuration file of Harbor
# hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = 115.159.227.249   #这里我先配置我的服务器IP地址
# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
# mysql数据库root用户默认密码root123,实际使用时修改下
db_password = root123
#Maximum number of job workers in job service
max_job_workers = 3
#Determine whether or not to generate certificate for the registry's token.
#If the value is on, the prepare script creates new root cert and private key
#for generating token to access the registry. If the value is off the default key/cert will be used.
#This flag also controls the creation of the notary signer's cert.
customize_crt = on
#The path of cert and key files for nginx, they are applied only the protocol is set to https
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
#The path of secretkey storage
secretkey_path = /data
#Admiral's url, comment this attribute, or set its value to NA when Harbor is standalone
admiral_url = NA
#NOTES: The properties between BEGIN INITIAL PROPERTIES and END INITIAL PROPERTIES
#only take effect in the first boot, the subsequent changes of these properties
#should be performed on web ui
#************************BEGIN INITIAL PROPERTIES************************
#Email account settings for sending out password resetting emails.
#Email server uses the given username and password to authenticate on TLS connections to host and act as identity.
#Identity left blank to act as username.
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
##The initial password of Harbor admin, only works for the first time when Harbor starts.
#It has no effect after the first launch of Harbor.
# 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
# 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
auth_mode = db_auth
#The url for an ldap endpoint.
ldap_url = ldaps://ldap.mydomain.com
#A user's DN who has the permission to search the LDAP/AD server.
#If your LDAP/AD server does not support anonymous search, you should configure this DN and ldap_search_pwd.
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#the password of the ldap_searchdn
#ldap_search_pwd = password
#The base DN from which to look up a user in LDAP/AD
ldap_basedn = ou=people,dc=mydomain,dc=com
#Search filter for LDAP/AD, make sure the syntax of the filter is correct.
#ldap_filter = (objectClass=person)
# The attribute used in a search to match a user, it could be uid, cn, email, sAMAccountName or other attributes de
pending on your LDAP/AD  ldap_uid = uid
#the scope to search for users, 1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_ONELEVEL, 3-LDAP_SCOPE_SUBTREE
ldap_scope = 3
#Timeout (in seconds)  when connecting to an LDAP Server. The default value (and most reasonable) is 5 seconds.
ldap_timeout = 5
# 是否开启自注册
self_registration = on
# Token有效时间,默认30分钟
token_expiration = 30
# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
#Determine whether the job service should verify the ssl cert when it connects to a remote registry.
#Set this flag to off when the remote registry uses a self-signed or untrusted certificate.
verify_remote_cert = on
#************************END INITIAL PROPERTIES************************

启动 harbor,修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各个服务。

启动完成后,我们访问刚设置的 hostname 即可,http://115.159.227.249/,默认是80端口,如果端口占用,我们可以去修改docker-compose.yml文件中,对应服务的端口映射。

登录 Web Harbor , 输入用户名 admin,默认密码(或已修改密码)登录系统。

我们可以看到系统各个模块如下:

  • 项目:新增/删除项目,查看镜像仓库,给项目添加成员、查看操作日志、复制项目等

  • 日志:仓库各个镜像create、push、pull等操作日志

  • 系统管理

    • 用户管理:新增/删除用户、设置管理员等
    • 复制管理:新增/删除从库目标、新建/删除/启停复制规则等
    • 配置管理:认证模式、复制、邮箱设置、系统设置等
  • 其他设置

    • 用户设置:修改用户名、邮箱、名称信息
    • 修改密码:修改用户密码

注意:非系统管理员用户登录,只能看到有权限的项目和日志,其他模块不可见。

我们要尝试下能不能把自己 Docker 里面的镜像 push 到 Harbor 的 library 里来(默认这个 library 项目是公开的,所有人都可以有读的权限,都不需要 docker login 进来,就可以拉取里面的镜像)。

注意:

为了后面留坑,我这里先 在自己的 docker.service 中添加仓库:(这是个坑,建议你先按照我说的做,不然下面可能会一直登录不上)

vim /usr/lib/systemd/system/docker.service
里面的这行修改为:(其实就是添加 --insecure-registry 115.159.227.249 )
ExecStart=/usr/bin/dockerd --insecure-registry 115.159.227.249

添加完了后重新启动 docker:

systemctl daemon-reload && systemctl enable docker && systemctl start docker

启动 docker 服务:

service docker start

登录:(为了测试下能否登录成功)

admin登录
$ docker login 115.159.227.249
Username: admin
Password:
Login Succeeded

打 tag 并 push

docker tag ubuntu:15.10  115.159.227.249/library/ubuntu:15.10		//给我的镜像打个 tag
docker push  115.159.227.249/library/ubuntu
The push refers to a repository [115.159.227.249/library/ubuntu]
98d59071f692: Pushed
af288f00b8a7: Pushed
4b955941a4d0: Pushed
f121afdbbd5d: Pushed
15.10: digest: sha256:ec89c4a90f45f5e103860191890f48d8379e0504a2881ff706aef0768dc0321b size: 1150

上传完毕后,登录Web Harbor,选择项目 library,就可以看到我刚 push 的镜像了。

同理,你也可以测试下从 Harbor pull 镜像到你的 Docker 中去,这里就不继续演示了。

原文作者:zhisheng
原文地址:基于 Harbor 搭建 Docker 私有镜像仓库
版权说明:本文由极乐科技合作博主原创,转载请注明作者与出处,谢谢!
一元抢购微信小程序>>>链接地址

使用docker Registry快速搭建私有镜像仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ReEL2ZPO-1599612182241)(assets/1665641dcbbced69)]

当我们执行docker pull xxx的时候,docker默认是从registry.docker.com这个地址上去查找我们所需要的镜像文件,然后执行下载操作。这类的镜像仓库就是docker默认的公共仓库,所有人都可以直接查看或下载、使用,但是呢,基于网络原因,下载速度有限制比较慢。因此,我们在公司内部内网环境中使用dokcer,一般不会将镜像文件上传到公网公共库中。但内部共享使用就是个问题,所以,私有仓库就由此产生了。

什么是私有仓库?

私有仓库,就是本地(内网环境)组建的一个与公网公共库功能相似的镜像仓库。组建好之后,我们就可以将打包好的镜像提交到私有仓库中,这样内网其它用户也可以使用这个镜像文件。
本文使用官方提供的registry镜像来组建企业内网的私有镜像仓库

环境介绍

两台安装好docker环境的主机

  • 服务端:192.168.56.76 私有仓库服务器在,运行registry容器
  • 客户端:192.168.3.83 测试客户端,用于上传、下载镜像文件

安装布署过程

下载官方registry镜像文件
[root@master ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
81033e7c1d6a: Pull complete 
b235084c2315: Pull complete 
c692f3a6894b: Pull complete 
ba2177f3a70e: Pull complete 
a8d793620947: Pull complete 
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for docker.io/registry:latest
[root@master ~]# docker images |grep registry
docker.io/registry   latest  d1fd7d86a825   5 months ago  33.3 MB
运行registry容器
[root@master ~]# mkdir /docker/registry -p
[root@master ~]# docker run -itd -v /docker/registry/:/docker/registry -p 5000:5000 --restart=always --name registry registry:latest
26d0b91a267f684f9da68f01d869b31dbc037ee6e7bf255d8fb435a22b857a0e
[root@master ~]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS        PORTS                    NAMES
26d0b91a267f   registry:latest  "/entrypoint.sh /e..."   4 seconds ago  Up 3 seconds  0.0.0.0:5000->5000/tcp   registry

参数说明
1)-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
2)-v:把宿主机的/docker/registry目录绑定到容器/docker/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
3)-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
4)–restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
5)–name registry:创建容器命名为registry,可自定义任何名称;
6)registry:latest:这个是刚才pull下来的镜像;

查看远程仓库镜像文件
[root@master ~]# curl http://localhost:5000/v2/_catalog
{"repositories":[]}

同样也可以使用浏览器访问http://server-ip:5000/v2/_catalog, 结果相同,都是空的没有任何文件。

客户端操作

修改下载的镜像源,两个选其一
[root@slave1 ~]# vim /etc/docker/daemon.json
#docker官方的
{
	"registry-mirrors":["https://registry.docker-cn.com"]
}

#阿里云的
{
	"registry-mirrors": ["https://k88tl1nc.mirror.aliyuncs.com"]
}

[root@slave1 ~]# systemctl restart docker
下载测试镜像
[root@slave1 ~]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ... 
latest: Pulling from docker.io/library/nginx
683abbb4ea60: Pull complete 
6ff57cbc007a: Pull complete 
162f7aebbf40: Pull complete 
Digest: sha256:636dd2749d9a363e5b57557672a9ebc7c6d041c88d9aef184308d7434296feea
Status: Downloaded newer image for docker.io/nginx:latest
给镜像打TAG
[root@slave1 ~]# docker tag nginx:latest 192.168.56.76:5000/nginx:v1
[root@slave1 ~]# docker images
REPOSITORY                TAG       IMAGE ID        CREATED       SIZE
192.168.56.76:5000/nginx   v1        649dcb69b782    8 hours ago   109 MB
docker.io/nginx           latest    649dcb69b782    8 hours ago   109 MB
上传镜像
[root@slave1 ~]# docker push 192.168.56.76:5000/nginx:v1
The push refers to a repository [192.168.56.76:5000/nginx]
Get https://192.168.56.76:5000/v1/_ping: http: server gave HTTP response to HTTPS client
#注意这里出现报错提示,从提示信息可以看出需要使用https的方式才能上传,解决方案如下:
[root@slave1 ~]# vim /etc/docker/daemon.json
{
	"registry-mirrors":["https://registry.docker-cn.com"],
 	"insecure-registries":["192.168.56.20:5000"]
}
#添加私有镜像服务器的地址,注意书写格式为json,有严格的书写要求,需要重启docker服务生效配置
[root@slave1 ~]# systemctl restart docker
[root@slave1 ~]# docker push 192.168.56.76:5000/nginx:v1
The push refers to a repository [192.168.56.76:5000/nginx]
6ee5b085558c: Pushed 
78f25536dafc: Pushed 
9c46f426bcb7: Pushed 
v1: digest: sha256:edad5e71815c79108ddbd1d42123ee13ba2d8050ad27cfa72c531986d03ee4e7 size: 948
重新查看镜像仓库
[root@master ~]# curl http://localhost:5000/v2/_catalog
{"repositories":["nginx"]}
[root@master ~]# curl http://localhost:5000/v2/nginx/tags/list
{"name":"nginx","tags":["v1"]}
#查看有哪些版本
测试下载镜像
#首先删除客户端主机之前从公共库下载下来的镜像文件
[root@slave1 ~]# docker images
REPOSITORY                TAG      IMAGE ID        CREATED        SIZE
192.168.56.76:5000/nginx   v1       649dcb69b782    10 hours ago   109 MB
docker.io/nginx           latest   649dcb69b782    10 hours ago   109 MB
[root@slave1 ~]# docker image rmi -f 649dcb69b782
Untagged: 192.168.56.76:5000/nginx:v1
Untagged: 192.168.56.76:5000/nginx@sha256:edad5e71815c79108ddbd1d42123ee13ba2d8050ad27cfa72c531986d03ee4e7
Untagged: docker.io/nginx:latest
Untagged: docker.io/nginx@sha256:636dd2749d9a363e5b57557672a9ebc7c6d041c88d9aef184308d7434296feea
Deleted: sha256:649dcb69b782d4e281c92ed2918a21fa63322a6605017e295ea75907c84f4d1e
Deleted: sha256:bf7cb208a5a1da265666ad5ab3cf10f0bec1f4bcb0ba8d957e2e485e3ac2b463
Deleted: sha256:55d02c20aa07136ab07ab47f4b20b97be7a0f34e01a88b3e046a728863b5621c
Deleted: sha256:9c46f426bcb704beffafc951290ee7fe05efddbc7406500e7d0a3785538b8735
[root@slave1 ~]# docker images
REPOSITORY       TAG             IMAGE ID        CREATED         SIZE
#此时客户端所有的镜像文件全部删除
[root@slave1 ~]# docker pull 192.168.56.76:5000/nginx:v1
Trying to pull repository 192.168.56.76:5000/nginx ... 
v1: Pulling from 192.168.56.76:5000/nginx
683abbb4ea60: Pull complete 
6ff57cbc007a: Pull complete 
162f7aebbf40: Pull complete 
Digest: sha256:edad5e71815c79108ddbd1d42123ee13ba2d8050ad27cfa72c531986d03ee4e7
Status: Downloaded newer image for 192.168.56.76:5000/nginx:v1
[root@slave1 ~]# docker images
REPOSITORY                TAG     IMAGE ID       CREATED         SIZE
192.168.56.76:5000/nginx   v1      649dcb69b782   11 hours ago    109 MB
#可以看出,客户端已正常从远端服务器拉取到所需要的镜像文件,其它内网服务器也可以正常共享这台镜像服务器上的镜像文件,不用去公网拉取。

注:之前分享的几篇资源文章,由于一些原因(链接失效或版权原因)很多资源被取消了,故民工哥重新整理了一份(包括JAVA开发、大数据、Hadoop、zookeeper、移动端开发、系统运维、数据库、Python、微服务、架构师、Docker容器、K8S等众多视频资源),公众号后台回复:“干货” 即可获得全部高达800GB的视频资源。

作者:民工哥技术之路

链接:https://juejin.im/post/5bbbf72c5188255c554710ca

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.创建一个 docker 用户组

docker 守护进程绑定到一个 unix socket 而不是 tcp 端口。默认情况下,这个 unix socket 的所有者是 root,其他用户需要通过 sudo 的方式访问。因为 docker 守护进程总是以 root 用户运行。
为避免使用 docker 命令的时候必须使用 sudo,我们可以创建一个 docker 用户组,然后将你的用户添加到这个组里面。当 docker 守护进程启动时,它会让 docker 用户组对该 unix socket 有可读可写的权限。
当然如果你只会使用 root 账号登录使用 docker 命令,也可略过这个步骤,对后续进程不会有影响。

创建用户组并添加用户的步骤如下:

2.1,使用 sudo 权限登录进系统

2.2,创建 docker 用户组

$ sudo groupadd docker

2.3,将你的用户添加到 docker 组

$ sudo usermod -aG docker your_username

2.4,退出登录然后再登录进来

这确保你的账号有正确的权限

2.5,不使用 sudo 来执行 docker 命令,验证是否正确

$ docker run hello-world

2.6 让 docker 守护进程开机自启动

为了确保当你重启系统的时候,docker 可以自动启动,执行如下指令:
$ sudo chkconfig docker on

关于 docker 守护进程的更多定制化配置,可以参阅:https://docs.docker.com/engine/admin/systemd/

完成了上面的步骤,就可以使用 docker 命令行工具对我们搭建的 registry 做各种操作了,如 push / pull。然而还是不够方便,比如不能直观的查看 registry 中的资源情况,如果有一个 ui 工具,能够看到仓库中有哪些镜像、每个镜像的版本是多少,就好了,下面就介绍 ui 的搭建过程。

部署WebUI

目前找到了两个 web ui,一个是 docker-registry-frontend,另一个是 hyper/docker-registry-web。
这两个 ui 功能差不多,只需任选其一就可以了。截止到我安装的时候,docker-registry-frontend 的功能还不完善,没有删除镜像的功能,只能浏览。后一个同时具备 删除和浏览 的功能。这两个 ui 的搭建过程下面都会讲。

docker-registry-frontend 安装与配置

1、先安装 docker-compose
这是一个脚本,直接从 https://github.com/docker/compose/releases 下载一个合适的版本,然后拷贝到 /usr/local/bin 目录中,再改下执行权限就可以了。

2、从 github 中下载 docker-registry-frontend 源码

$ git clone https://github.com/kwk/docker-registry-frontend.git

3、修改配置,默认情况下 docker registry 监听你主机的 5000 端口,ui 监听你主机的 8443 端口。而我的主机这两个端口从外部都不能访问,所以要分别修改这两个端口到 10050 和 10080。除了端口,还需要根据你的需要修改仓库中的镜像文件保存的位置,我的镜像要保存到 /var/lib/registry。

frontend:
  image: konradkleine/docker-registry-frontend:v2
  #build: ../
  links:
    - registry:registry
  ports:
    # Publish the frontend's port 443 on the IP 0.0.0.0 on port 8443
   * - "0.0.0.0:10080:443"*
  volumes:
    - ./frontend/certs/frontend.crt:/etc/apache2/server.crt:ro
    - ./frontend/certs/frontend.key:/etc/apache2/server.key:ro
  environment:
    # The front-end is SSL protected
    - ENV_USE_SSL=yes
    - ENV_DOCKER_REGISTRY_HOST=registry
    - ENV_DOCKER_REGISTRY_PORT=5000
    # The registry is SSL protected as well
    - ENV_DOCKER_REGISTRY_USE_SSL=1

启动

$ docker-compose up -d

ps:上面这个指令其实是根据 docker-compose.yml 中的配置启动两个容器(fronted 和 registry,这两个容器是独立的,通过 REST API 交互信息),如果在安装 web ui 前,你的 private docker registry 已经在运行了,也可以去掉上面文件中的 registry 字段,但注意要指定对应的ip和端口信息。
然后就能够访问 https://localhost:10080

hyper/docker-registry-web 安装与配置

目标是: registry 监听主机的 10050 端口,ui 监听主机的 10080 端口。
1、创建工作目录

$ mkdir -p hyper-docker-registry-web-config/frontend hyper-docker-registry-web-config/registry

$ cd hyper-docker-registry-web-config

2、建一个用于 registry 的配置文件

$ vim registry/config.yml
version: 0.1
log:
  level: info
  formatter: text
  fields:
    service: registry-srv
    environment: production
storage:
  cache:
    layerinfo: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    # 要在 ui 上能够删除镜像,enable 的值必须是 true
    enabled: true
http:
  addr: :5000
  debug:
    addr: :5001

3、新建一个用于 ui 的配置文件

$ vim frontend/config.yml
registry:
  # Docker registry url
  url: http://registry-srv:5000/v2
  # Docker registry fqdn
  name: localhost:10050
  # To allow image delete, should be false
  readonly: false
  auth:
    # Disable authentication
    enabled: false

4、新建一个启动脚本

$ vim startup.sh
#! /bin/bash
 
# registry 监听主机的 10050 端口,并将镜像文件存储在主机的 /var/lib/registry/storage 中。
docker run -d -p 10050:5000 --restart=always --name registry-srv -v $(pwd)/registry/:/etc/docker/registry:ro -v /var/lib/registry/storage:/var/lib/registry registry:2
 
# ui 监听主机的 10080 端口
docker run -d -p 10080:8080  --name registry-web --link registry-srv -v $(pwd)/frontend/:/conf/:ro hyper/docker-registry-web

5、启动

$ chmod +x startup.sh
$ ./startup.sh

除了使用 shell 脚本启动,这里其实也可以写一个 docker-compose.yml 配置文件,然后使用 docker-compose 工具启动这两个容器。
等启动完成,就可以通过 http://localhost:10080 访问 ui,且可以在 ui 上浏览/删除镜像了。

OK,到这里,仓库和 ui

使用方法

假设上述的部署在 172.20.30.35 这台机器上进行的。
需要修改【你的机器】上的2个文件:
1、在 /etc/hosts 中加入:172.20.30.35 docker.midea.registry.hub

2、修改 /etc/sysconfig/docker,添加或修改下面3个字段的值:

ADD_REGISTRY='--add-registry docker.midea.registry.hub:10050'
DOCKER_OPTS="--insecure-registry docker.midea.registry.hub:10050"
INSECURE_REGISTRY='--insecure-registry docker.midea.registry.hub:10050'

3、然后重启你的 docker daemon:

$ service docker restart 或 $ systemctl restart docker.service

4、push 镜像

$ docker tag your-image docker.midea.registry.hub:10050/your-image
$ docker push docker.midea.registry.hub:10050/your-image

然后就可以使用这个私有registry了。

OVER~~

konradkleine/docker-registry-frontend镜像安装与配置

拉取镜像并启动运行容器

$ docker run \
  -d -v /docker/registry/:/docker/registry --name registry \
  -e ENV_DOCKER_REGISTRY_HOST=192.168.56.76 \
  -e ENV_DOCKER_REGISTRY_PORT=5000 \
  -p 5000:80 \
  konradkleine/docker-registry-frontend:v2

此命令启动容器并将容器的专用端口转发80到主机的端口5000。确保为注册表指定了正确的URL。

应用程序运行时,您可以打开浏览器并导航到[http://localhost:5000]。

docker管理工具protainer

Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。

介绍

Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm 集群。

Portainer 的使用意图是简单部署。 它包含可以在任何 Docker 引擎上运行的单个容器(Docker for Linux 和 Docker for Windows)。

Portainer 允许您管理 Docker 容器、image、volume、network 等。 它与独立的 Docker 引擎和 Docker Swarm 兼容。

官网 https://portainer.io/)
GitHub https://github.com/portainer/portainer
Doc https://portainer.readthedocs.io/en/stable/

部署

  1. 方法一

    $ docker volume create portainer_data
    $ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
    
  2. 方法二
    使用Portainer管理Swarm集群,在swarm中部署

    $ docker volume create portainer_data
    $ docker service create \
    --name portainer \
    --publish 9000:9000 \
    --replicas=1 \
    --constraint 'node.role == manager' \
    --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
    --mount type=volume,src=portainer_data,dst=/data \
    portainer/portainer \
    -H unix:///var/run/docker.sock
    
  3. 方法三
    通过docker compose部署
    docker-composer.yml内容

    version: '3'
    
    services:
      portainer:
        image: portainer/portainer
        ports:
          - "9000:9000"
        command: -H unix:///var/run/docker.sock
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - portainer_data:/data
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure  
            
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
            
    volumes:
      portainer_data:
    

测试

浏览器访问localhost:9000测试

参考

https://hub.docker.com/_/registry/

https://hub.docker.com/r/konradkleine/docker-registry-frontend/

https://blog.csdn.net/mideagroup/article/details/52052618

r_data:/data
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure

 visualizer:
   image: dockersamples/visualizer:stable
   ports:
     - "8080:8080"
   stop_grace_period: 1m30s
   volumes:
     - "/var/run/docker.sock:/var/run/docker.sock"
   deploy:
     placement:
       constraints: [node.role == manager]

volumes:
portainer_data:


### 测试

浏览器访问`localhost:9000`测试





## 参考

https://hub.docker.com/_/registry/

https://hub.docker.com/r/konradkleine/docker-registry-frontend/

https://blog.csdn.net/mideagroup/article/details/52052618






版权声明:本文为pointdew原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。