4.远程仓库和私有仓库
仓库位于注册服务器中,一个注册服务器可以创建多个仓库,一个仓库中可以存放多个tag不同的镜像
1.在Docker Hub上创建镜像
打开
登录账号(如果你还没有账号时,先创建一个)
点击创建仓库
输入一个很棒的名字,比如我这里的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
查看一下当前列表中的镜像
登入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查看一下推送是否成功
这里可以看到,刚刚创建的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
查看本机镜像
这里很显然,已经下载好了
到这里,表示我们简单的私服已经搭建好了,但是还存在一个问题,我们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这个域名映射到本机上
然后重启本地网络就可以访问了
在浏览器输入https://ubuntu.cloudalibaba.com就可以访问harbor的界面了,这里账号时admin,密码就是我们上面在yml中配置的soft01,登录,。
在用户管理这里创建一个用户,因为后续要推镜像上来,所以这里将其设定为管理员(如果用户只能查看镜像时,设定为普通人员就可以
然后创建一个仓库,在项目这里,点击新建项目
接下来,就可以在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
推送完成之后,就可以在管理面板上看到我们推上来的镜像了
同样,用验证的方式,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]
转载请注明出处。祝大家变得更强~!