4.远程仓库和私有仓库 2020-11-03

4.远程仓库和私有仓库

仓库位于注册服务器中,一个注册服务器可以创建多个仓库,一个仓库中可以存放多个tag不同的镜像

1.在Docker Hub上创建镜像

打开

登录账号(如果你还没有账号时,先创建一个)

image-20201103000040238.png

点击创建仓库

image-20201103000114543.png

输入一个很棒的名字,比如我这里的Tony Stark,创建好之后,点击 create 按钮,开始创建一个名字为tonystark的仓库。

准备工作: 先准备一个镜像,这里以nginx镜像为例子

➜  ~ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
111447d5894d: Pull complete
a95689b8e6cb: Pull complete
1a0022e444c2: Pull complete
32b7488a3833: Pull complete
Digest: sha256:ed7f815851b5299f616220a63edac69a4cc200e7f536a56e421988da82e44ed8
Status: Downloaded newer image for nginx:latest

还记得前面的内容,怎么“重命名”一个镜像吗?

➜  ~ docker tag nginx 1020952183/tonystark:v7

查看一下当前列表中的镜像

image-20201103001439748.png

登入Docker Hub

要将这个自定义的镜像推入到DockerHub,在创建好仓库之后,还需要在docker客户端登入dockerhub,docker客户端默认连接的就是dockerhub,因此,这里也不用重新制定登录源。

➜  ~ docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /home/frend/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

如果你没有登陆过的话,会要求输入账号密码,我这里登陆过了(账号密码就是dockerhub那边注册的账号密码)

开始推送镜像到仓库

➜  ~ docker push 1020952183/tonystark:v7
The push refers to repository [docker.io/1020952183/tonystark]
cdd1d8ebeb06: Pushed
fe08d9d9f185: Pushed
280ddd108a0a: Pushed
f14cffae5c1a: Pushed
d0fe97fa8b8c: Pushed
v7: digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43 size: 1362

t提示推送完成之后,去Docker Hub查看一下推送是否成功

image-20201103002707957.png

这里可以看到,刚刚创建的v7的tag已经被推上来了。

搭建本地仓库

使用Docker官方提供的Distribution, 这个镜像也在DockerHub上,因此我们可以直接使用。

➜  ~ docker run -d -p 5000:5000 --name registry registry:2.7
Unable to find image 'registry:2.7' locally
2.7: Pulling from library/registry
cbdbe7a5bc2a: Pull complete
47112e65547d: Pull complete
46bcb632e506: Pull complete
c1cc712bcecd: Pull complete
3db6272dcbfa: Pull complete
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:2.7
285b13894f298f00e2934892c32d893ea3b76860aa658c615da8409b819e3cf9

和上面的步骤一样,重命名一个要推送到私服的镜像 nginx

➜  ~ docker tag nginx localhost:5000/nginx:v7

推送到本地仓库

➜  ~ docker push localhost:5000/nginx:v7
The push refers to repository [localhost:5000/nginx]
cdd1d8ebeb06: Pushed
fe08d9d9f185: Pushed
280ddd108a0a: Pushed
f14cffae5c1a: Pushed
d0fe97fa8b8c: Pushed
v7: digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43 size: 1362

验证一下从本地仓库下载,首先删除本机的localhost:5000/nginx:v7的镜像

➜  ~ docker rmi localhost:5000/nginx:v7
Untagged: localhost:5000/nginx:v7
Untagged: localhost:5000/nginx@sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43

删除成功

从本地仓库下载

➜  ~ docker pull localhost:5000/nginx:v7
v7: Pulling from nginx
Digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
Status: Downloaded newer image for localhost:5000/nginx:v7

查看本机镜像

image-20201103003559651.png

这里很显然,已经下载好了

到这里,表示我们简单的私服已经搭建好了,但是还存在一个问题,我们push上去的镜像文件是存在docker运行时的容器中的,一旦这个容器损毁,那么在生产服的话,就会造成不可逆的损失。

docker运行时是允许将本机磁盘挂在到容器中的,我们可以看一下

先删除,上一步的registry容器,(这里记得把localhost:5000/nginx:v7的镜像先下载下来,一会儿还要用)

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
285b13894f29        registry:2.7        "/entrypoint.sh /etc…"   9 minutes ago       Up 9 minutes        0.0.0.0:5000->5000/tcp   registry
➜  ~ docker rm 285b13894f29
Error response from daemon: You cannot remove a running container 285b13894f298f00e2934892c32d893ea3b76860aa658c615da8409b819e3cf9. Stop the container before attempting removal or force remove
➜  ~ docker rm -f 285b13894f29
285b13894f29

这里我使用了容器 container 的containerid删除(其实用id和image是都可以删除的,id相对来说比较精准imagename比较便捷)

创建一个将镜像存储挂在到本机的私服

➜  data docker run -v /home/frend/dev/docker/study/data:/var/lib/registry -d -p 5000:5000 --name registry registry:2.7

这里比较上一个创建私服的容器命令中多了 -v以及后面的路径映射

-v的意思是把Docker容器的某个目录或文件挂在到主机上,以防止容器出错或损毁时,数据不丢失的问题,比如redis的持久化mysql的data文件夹等 -v参数冒号前面的为主机的目录, 冒号后面的为容器内目录

-v [主机目录地址]:[容器内目录地址]

在将上面创建的nginx镜像推送到这个挂在到主机磁盘目录的私服中

查看一下上面挂在的本机磁盘

/home/frend/dev/docker/study/data
➜  data ls
docker

可以到这个data目录下已经有了docker的存储了(里面的内容我还不知道怎么看,暂时先不管)

同样,也拉取一次,看看能否正常拉取下来。

➜  data docker images | grep localhost
localhost:5000/nginx                   v7                  f35646e83998        2 weeks ago         133MB
➜  data docker rmi -f localhost:5000/nginx:v7
Untagged: localhost:5000/nginx:v7
Untagged: localhost:5000/nginx@sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
➜  data docker images | grep localhost
➜  data
➜  data docker pull localhost:5000/nginx:v7
v7: Pulling from nginx
Digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
Status: Downloaded newer image for localhost:5000/nginx:v7
➜  data docker images | grep localhost
localhost:5000/nginx                   v7                  f35646e83998        2 weeks ago         133MB

可以看着,此处也可以通常拉取了,至此,搭建docker本地私服就到此结束了。

不过,通常要构建外部可访问的镜像仓库,并且是公司生产用的私有仓库时,要构建一个支持HTTPS访问的安全镜像仓库,这时,就需要拥有两个先决条件

1.一个合法的域名,并且可以正确解析到镜像服务器

2.从证书颁发机构(CA)获取一个证书。

为了能自己先体验一下,先用openssl自签TLS证书

➜  cert openssl genrsa -out ubuntu.cloudalibaba.com.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...............................................................................................................++++
........................................................................................................................................................................................................................................................................................................................................................................................................................................................++++
e is 65537 (0x010001)
➜  cert sudo openssl req -x509 -new -nodes -sha512 -days 365 -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=ubuntu.cloudalibaba.com" -key ubuntu.cloudalibaba.com.key -out ubuntu.cloudalibaba.com.crt

这里ubuntu.cloudalibaba.com是我的域名

➜  cert docker run -d \
--name registry \
-v "/home/frend/dev/docker/study/data:/var/lib/registry" \
-v "/home/frend/dev/docker/study/cert:/certs" \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ubuntu.cloudalibaba.com.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/ubuntu.cloudalibaba.com.key \
-p 443:443 \
registry:2.7

然后推送一个镜像到私服

#先重命名一个nginx:v8
➜  cert docker tag nginx ubuntu.cloudalibaba.com/nginx:v8
#推送到这个 ubuntu.cloudalibaba.com的域名下
➜  cert docker push ubuntu.cloudalibaba.com/nginx:v8
The push refers to repository [ubuntu.cloudalibaba.com/nginx]
cdd1d8ebeb06: Layer already exists
fe08d9d9f185: Layer already exists
280ddd108a0a: Layer already exists
f14cffae5c1a: Layer already exists
d0fe97fa8b8c: Layer already exists
v8: digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43 size: 1362

至此,使用Distribution创建私服并配置外部可访问的内容已经完成了。

使用企业级的镜像仓库 Harbor

github地址

https://github.com/goharbor/harbor

下载.tgz格式的harbor,将下载的harbor-offline复制到服务器

## 这里是从win电脑通过scp复制到服务器的
scp .\Downloads\harbor-offline-installer-v2.1.1.tgz [email protected]:/home/frend/dev/docker/study/harbor

解压

➜  harbor tar -zxvf harbor-offline-installer-v2.1.1.tgz

修改配置,v2.1.1这个版本的配置是在解压之后的目录中的 harbor.yml.tmpl 较早的版本用的配置文件是harbor.cfg所以,这里用新版本的需要注意一下,复制harbor.yml.tmpl 文件为harbor.yml,然后修改访问的主机名称和TLS证书(这里的证书是我们自己生成的,因此在后面访问时浏览器会提示不安全)

修改配置文件如下

# Configuration file of Harbor
hostname: ubuntu.cloudalibaba.com

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /home/frend/dev/docker/study/cert/ubuntu.cloudalibaba.com.crt
  private_key: /home/frend/dev/docker/study/cert/ubuntu.cloudalibaba.com.key
harbor_admin_password: soft01

# Harbor DB configuration
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: admin123

这里 hostname为主机名称,这里修改的主机名称要和后面改的hosts的主机名称一致

https->certificate就是上面步骤中生成的.crt文件的路径,private_key就是上述步骤中生成的.key文件的路径。

harbor_admin_password为管理界面登录的密码,这里我改的简单一点,其他暂时保持不变。接着,执行安装命令

特别的温馨提醒:harbor的运行是基于docker-compose运行的,win版本的docker-compose是随着docker主程序一起安装的,Linux下要单独安装,docker-compose的安装也非常简单,后边会在安装docker的栏目中说明,或者你可以直接去docker hub上查看安装方法,相信我,很简单的~@

➜  harbor sudo ./install.sh

注意,这里执行安装命令的时候,一定要加上sudo,否则会导致后续创建容器时产生错误。

安装完成之后,我们查看一下(安装成功之后容器会直接运行)

➜  harbor sudo docker-compose ps
[sudo] password for frend:
      Name                     Command                  State                          Ports
---------------------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)
harbor-db           /docker-entrypoint.sh            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, 0.0.0.0:443->8443/tcp
redis               redis-server /etc/redis.conf     Up (healthy)
registry            /home/harbor/entrypoint.sh       Up (healthy)
registryctl         /home/harbor/start.sh            Up (healthy)

这里还需要说明一下,因为我们上面用到的域名不是真实的域名(如果你的服务器是真实域名的话,这一步可以忽略)所以,需要在hosts文件中映射一下,Linux下

➜  harbor vim /etc/hosts
#添加一个这样的映射
127.0.0.1 ubuntu.cloudalibaba.com

意思是将ubuntu.cloudalibaba.com这个域名映射到本机上

然后重启本地网络就可以访问了

image-20201103230138852.png

在浏览器输入https://ubuntu.cloudalibaba.com就可以访问harbor的界面了,这里账号时admin,密码就是我们上面在yml中配置的soft01,登录,。

在用户管理这里创建一个用户,因为后续要推镜像上来,所以这里将其设定为管理员(如果用户只能查看镜像时,设定为普通人员就可以

image-20201103230300778.png

然后创建一个仓库,在项目这里,点击新建项目

image-20201103230541109.png

接下来,就可以在docker上登录这个私服。

➜  harbor docker login ubuntu.cloudalibaba.com
Username: frend
Password:
WARNING! Your password will be stored unencrypted in /home/frend/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

输入账号密码,登录之后返回Login Succeeded时,表示登录成功。

接下来,重命名一个tag,然后推送到这个仓库, 来个问题~~!还记得怎么重命名镜像吗

➜  mynginx docker tag nginx ubuntu.cloudalibaba.com/tonymark/mynginx:v7

推送到私服

➜  mynginx docker push ubuntu.cloudalibaba.com/tonymark/mynginx:v7
The push refers to repository [ubuntu.cloudalibaba.com/tonymark/mynginx]
cdd1d8ebeb06: Pushed
fe08d9d9f185: Pushed
280ddd108a0a: Pushed
f14cffae5c1a: Pushed
d0fe97fa8b8c: Pushed
v7: digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43 size: 1362

推送完成之后,就可以在管理面板上看到我们推上来的镜像了

image-20201103231029735.png

同样,用验证的方式,pull一下,步骤是这样的

首先,删除本地镜像,然后在去pull这个镜像

➜  harbor docker images | grep mynginx
ubuntu.cloudalibaba.com/tonymark/mynginx   v7                  f35646e83998        3 weeks ago         133MB
#删除
➜  harbor docker rmi ubuntu.cloudalibaba.com/tonymark/mynginx:v7
Untagged: ubuntu.cloudalibaba.com/tonymark/mynginx:v7
Untagged: ubuntu.cloudalibaba.com/tonymark/mynginx@sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
#从私服上下载
➜  harbor docker pull ubuntu.cloudalibaba.com/tonymark/mynginx:v7
v7: Pulling from tonymark/mynginx
Digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
Status: Downloaded newer image for ubuntu.cloudalibaba.com/tonymark/mynginx:v7
#查看是否下载下来了
➜  harbor docker pull ubuntu.cloudalibaba.com/tonymark/mynginx:v7
v7: Pulling from tonymark/mynginx
Digest: sha256:4949aa7259aa6f827450207db5ad94cabaa9248277c6d736d5e1975d200c7e43
Status: Downloaded newer image for ubuntu.cloudalibaba.com/tonymark/mynginx:v7

通过以上步骤,了解了两种搭建私服的方式,接下来,还有一些补充的。 harbor在docker下是一个容器,因此它也会有生命周期中应该有的运行和停止状态

#停止harbor
➜  harbor sudo docker-compose stop
[sudo] password for frend:
..省略了一些日志
#启动harbor
➜  harbor sudo docker-compose start
..省略了一些日志

至此,创建简单的私有仓库和 带有操作面板和授权的私有仓库就已经结束了。

本文参考链接:

[https://www.cnblogs.com/ServerChen/p/13792939.html]

[https://www.cnblogs.com/edisonchou/p/docker_registry_repository_setup_introduction.html]

转载请注明出处。祝大家变得更强~!

你可能感兴趣的:(4.远程仓库和私有仓库 2020-11-03)