7. Docker仓库管理

1 Docker 仓库管理

Docker仓库, 类似于yum仓库, 是用来保存镜像的仓库. 为了方便管理和使用Docker镜像, 可以将镜像集中保存至Docker仓库中, 将制作好的镜像推送(push)到仓库之中保存, 在需要镜像时, 从仓库中拉取(pull)镜像即可.

Docker仓库分为公有云仓库和私有云仓库:

公有云仓库: 由互联网公司对外公开的仓库
     官方Docker hub
     阿里云等第三方仓库
私有云仓库: 在组织内部搭建的仓库, 一般只为组织内部使用, 常使用如下软件搭建仓库
     docker registry
     docker harbor

2 官方Docker仓库

将自制的镜像上传至docker仓库: https://hub.docker.com

2.1 用户登录

上传镜像前, 需要执行docker login命令登录, 登录后生成~/.docker/config.json文件保存验证信息

命令格式:

docker log [OPTIONS] [SERVER]
选项:
-p, --password string Password
     --password-stdin  Take the password from stdin
-u, --username string Username

案例:

root@ubuntu-1804-100:~# docker login -u USERNAME -p PASSWORD docker.io
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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

2.2 给本地镜像打标签

  • 上传镜像前, 要先在本地给镜像打标签
  • 标签格式: docker.io/DockerHub用户名/镜像名:TAG
  • 其中docker.io/前缀可以省略
  • DockerHub用户名/镜像名为标准格式: DockerHub用户名用来指定向哪个用户的DockerHub账号上传镜像.
image.png
image.png
image.png
给拉取的busybox镜像, 重新打标签, 上传到自己的Docker Hub Repo, 仅做演示
分别给busybox打两个tag, 一个上传到本身已经存在的仓库, 一个上传到不存在的仓库, 不存在的仓库在上传过程会自动创建

root@Ubuntu-1804-1:~# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
4c892f00285e: Pull complete 
Digest: sha256:e1488cb900233d035575f0a7787448cb1fa93bed0ccc0d4efc1963d7d72a8f17
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
root@Ubuntu-1804-1:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              22667f53682a        6 days ago          1.23MB
root@Ubuntu-1804-1:~# docker tag busybox:latest docker.io/chickenwinner2020/test-box:v2.0 # 新的repo, chickenwinner2020/test-box, 会自动创建
root@Ubuntu-1804-1:~# docker tag busybox:latest chickenwinner2020/docker-images:v3.0 # 已有仓库, chickenwinner2020/docker-images
root@Ubuntu-1804-1:~# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
busybox                           latest              22667f53682a        6 days ago          1.23MB
chickenwinner2020/docker-images   v3.0                22667f53682a        6 days ago          1.23MB
chickenwinner2020/test-box        v2.0                22667f53682a        6 days ago          1.23MB
这里仅为了演示把本地制作的busybox镜像上传到已经存在和未存在的仓库, 所以才把仓库名称命名为chickenwinner2020/test-box和chickenwinner/docker-images
工作中, 一般把仓库repo命名为用户名/镜像名, 见名知意
比如nginx仓库命名为: 用户名/nginx

2.3 上传镜像到Docker Hub

docker push REPO:TAG
REPO: 用户名/镜像名
如果TAG省略, 那么会把本地属于同一个REPO的所有镜像版本都上传

案例: 推送到已有仓库

root@Ubuntu-1804-1:~# docker push chickenwinner2019/docker-images 
# chickenwinner2020/docker-images是本地镜像的REPO名称, 因为做tag时, REPO格式为用户名/镜像名
The push refers to repository [docker.io/chickenwinner2020/docker-images]
6b245f040973: Pushed 
v3.0: digest: sha256:56853b711255f4a0bc7c44d2158167f03f64ef75a22a0249a9fae4703ec10f61 size: 527
image.png
image.png

案例: 推送到不存在的仓库

root@Ubuntu-1804-1:~# docker push chickenwinner2020/test-box:v2.0
The push refers to repository [docker.io/chickenwinner2020/test-box]
0b16ab2571f4: Mounted from chickenwinner2020/docker-images # 都是用的busybox镜像, 只是打了不同的tag, 所以再次上传镜像时不会真的重新上传一遍
v2.0: digest: sha256:7bd0c945d7e4cc2ce5c21d449ba07eb89c8e6c28085edbcf6f5fa4bf90e7eedc size: 527
image.png
image.png
image.png

案例: 实际工作中的镜像命名和推送

docker pull alpine
docker pull httpd

# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
httpd                             latest              fe8735c23ec5        19 hours ago        145MB
alpine                            latest              9c6f07244728        2 months ago        5.54MB
docker tag alpine:latest chickenwinner2020/alpine:v1.0
docker tag alpine:latest chickenwinner2020/alpine:v2.0
docker tag httpd:latest chickenwinner2020/httpd:v2.0
docker tag httpd:latest chickenwinner2020/httpd:v1.0

docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
httpd                             latest              fe8735c23ec5        19 hours ago        145MB
chickenwinner2020/httpd           v1.0                fe8735c23ec5        19 hours ago        145MB
chickenwinner2020/httpd           v2.0                fe8735c23ec5        19 hours ago        145MB

alpine                            latest              9c6f07244728        2 months ago        5.54MB
chickenwinner2020/alpine          v1.0                9c6f07244728        2 months ago        5.54MB
chickenwinner2020/alpine          v2.0                9c6f07244728        2 months ago        5.54MB
docker push chickenwinner2020/alpine
The push refers to repository [docker.io/chickenwinner2020/alpine]
994393dc58e7: Mounted from library/alpine 
v1.0: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
994393dc58e7: Layer already exists 
v2.0: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528

docker push chickenwinner2020/httpd
The push refers to repository [docker.io/chickenwinner2020/httpd]  # 在本地打tag时, 要加上DockerHub的用户名, 这样上传的时候, 才知道向哪个用户的Hub上传镜像
1617cfaff5dd: Mounted from library/httpd 
36de10a434ef: Mounted from library/httpd 
6437b1170b0b: Mounted from library/httpd 
13fb8799144c: Mounted from library/httpd 
a12586ed027f: Mounted from library/httpd 
v1.0: digest: sha256:8c353fea0ce30e79d03e487d31f3a37eb5aae5127bde9580387e74e77c5952a2 size: 1366
1617cfaff5dd: Layer already exists 
36de10a434ef: Layer already exists 
6437b1170b0b: Layer already exists 
13fb8799144c: Layer already exists 
a12586ed027f: Layer already exists 
v2.0: digest: sha256:8c353fea0ce30e79d03e487d31f3a37eb5aae5127bde9580387e74e77c5952a2 size: 1366
image.png

3 Docker仓库-Harbor

3.1 Harbor功能

基于角色访问的控制: 用户与Docker镜像仓库通过"项目"进行组织管理, 一个用户可以对多个镜像仓库在同一个命名空间(project)里有不同的权限
镜像复制: 镜像可以在多个Registry实例中复制(同步), 尤其适合于负载均衡, 高可用, 混合云和多云的场景
图形化用户界面: 用户可以通过浏览器来浏览, 检索当前Docker镜像仓库, 管理项目和命令空间
AD/LDAP: Harbor可以集成企业内部已有的AD/LDAP, 用于权限认证管理
审计管理: 所有针对镜像仓库的操作都可以被记录追溯, 用于审计管理
RESTful API: 提供给管理员对于Harbor更多的操控, 使得与其他管理软件集成变得更容易

3.2 Harbor组成

Harbor内部由多个容器组成, 基于docker-compose完成内部容器的编排, 因此, 安装Harbor, 还要先部署docker-compose
Harbor内置已经写好了docker-compose的yml文件, 因此, 部署Harbor无需手动编写yml文件, 直接执行即可

3.3 Harbor的安装

Harbor依赖于docker-compose, 而docker-compose又是依赖于docker, 因此, 需要先装docker, 再装docker-compose, 再装harbor

环境准备:

四台主机: 都需要安装Docker
10.0.0.19: Harbor-1
10.0.0.29: Harbor-2
10.0.0.39: 用于上传和下载镜像
10.0.0.49: 用于上传和下载镜像

3.3.1 安装Docker

5:19.03.12~3-0~ubuntu-bionic
#!/bin/bash
apt update && apt -y install ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
VERSION_STRING=5:19.03.12~3-0~ubuntu-bionic
apt -y install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-compose-plugin
docker version && echo "Install Successfully!!!!!!!!!!!!!!!!!" || echo "Install Failure!!!!!!!!!!!!!!!!!"

3.3.2 安装docker-compose

v1.26.2
harbor-1
上传docker-compose程序到/usr/sbin目录下,  因为该文件本身就是个执行程序.
直接改名为docker-compose并且加上执行权限
root@harbor-1:~# cd /usr/sbin
root@harbor-1:/usr/sbin# mv docker-compose-Linux-x86_64 docker-compose
root@harbor-1:/usr/sbin# chmod +x docker-compose 
root@harbor-1:~# docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
harbor-2
同样操作
[root@harbor-2:~]# docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

3.3.3 安装Harbor

v1.7.6

3.3.3.1 解压包

harbor-1
root@harbor-1:~# mkdir /apps
root@harbor-1:~# tar xf harbor-offline-installer-v1.7.6.tgz -C /apps/
root@harbor-1:~# cd /apps
root@harbor-1:/apps# ls
harbor
harbor-2
同样操作
root@harbor-1:/apps/harbor# ls
docker-compose.yml # yml文件定义了harbor内的容器是如何启动的

3.3.3.2 编辑配置文件harbor.cfg

仅修改hostname为harbor服务器的ip地址
harbor-1
root@harbor-1:/apps/harbor# grep '^[a-zA-Z]' harbor.cfg
hostname = 10.0.0.19   # harbor的地址, 支持ip和FQDN
ui_url_protocol = http # 基于http还是https
ssl_cert = /data/cert/server.crt # https服务器证书路径
ssl_cert_key = /data/cert/server.key # https服务私钥
secretkey_path = /data # 存放私钥文件路径
harbor_admin_password = Harbor12345 # harbor的密码. 默认是admin/Harbor12345, 用户名admin是固定的
harbor-2
除了hostname要修改, 其余保持一致即可

3.3.3.3 Python环境安装

docker-compose依赖Python
Note: Docker Compose requires Python 3.6 or later.
两台harbor分别安装 
apt -y install python3
# Ubuntu1804自带了Python3.6.9, 所以无需安装

3.3.3.4 运行harbor安装脚本

两台harbor都要安装
/apps/harbor/install.sh
✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://10.0.0.19 . 
For more details, please visit https://github.com/goharbor/harbor .

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://10.0.0.29 . 
For more details, please visit https://github.com/goharbor/harbor .
安装好后, 会启动大量的容器
# docker ps 
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                   PORTS                                                              NAMES
336de5b13532        goharbor/nginx-photon:v1.7.6             "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
94316ba5a853        goharbor/harbor-portal:v1.7.6            "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes (healthy)   80/tcp                                                             harbor-portal
77ae1f3b7f1a        goharbor/harbor-jobservice:v1.7.6        "/harbor/start.sh"       4 minutes ago       Up 4 minutes                                                                                harbor-jobservice
c203e46882ec        goharbor/harbor-core:v1.7.6              "/harbor/start.sh"       4 minutes ago       Up 4 minutes (healthy)                                                                      harbor-core
9639e05f750e        goharbor/redis-photon:v1.7.6             "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes             6379/tcp                                                           redis
f0f268e6b85a        goharbor/registry-photon:v2.6.2-v1.7.6   "/entrypoint.sh /etc…"   4 minutes ago       Up 4 minutes (healthy)   5000/tcp                                                           registry
0706a3a86528        goharbor/harbor-db:v1.7.6                "/entrypoint.sh post…"   4 minutes ago       Up 4 minutes (healthy)   5432/tcp                                                           harbor-db
30f0c4015882        goharbor/harbor-adminserver:v1.7.6       "/harbor/start.sh"       4 minutes ago       Up 4 minutes (healthy)                                                                      harbor-adminserver
aa02b7a9a26f        goharbor/harbor-registryctl:v1.7.6       "/harbor/start.sh"       4 minutes ago       Up 4 minutes (healthy)                                                                      registryctl
f65e95879132        goharb

3.3.4 登录Harbor

  • 10.0.0.19
图片.png
  • 10.0.0.29
图片.png

3.4 Harbor使用

3.4.1 用户创建

  • 10.0.0.19
image.png
image.png

创建的账号默认没有管理员权限, 可以手动修改为管理员, 不是管理员是无法上传镜像的

图片.png
image.png

3.4.2 创建项目

在Docker Hub中, 镜像是存在Repository中, 根据tag区分
而Harbor中, 镜像是存在Project中, 根据tag区分
DockerHub格式: docker.io/chickenwinner2019/busybox:v1.0
harbor格式: 10.0.0.19/harbor-test(项目名称)/IMAGE[:TAG]
  • 10.0.0.19 上创建一个项目
项目设为公开, 上传镜像需要账号密码, 下载是公开的
image.png
图片.png
注意: 刚搭好的harbor是无法直接从客户端去推送镜像的,  一是因为客户端需要登录harbor, 二是harbor默认基于https, 需要配置https
不过, 由于harbor一般都是内网, 而且https会影响效率, 因此, 如果能确保网络没有安全隐患, 可以不用https

3.4.3 在本地登录Harbor

  • 先修改客户端的docker service文件, 将harbor的ip地址添加到信任站点, 允许以http方式访问harbor
  • 这里的客户端指的是用于上传镜像的设备
10.0.0.39-user1
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.19 --insecure-registry 10.0.0.29
systemctl daemon-reload
systemctl restart docker
10.0.0.49-user2
执行相同操作
  • 客户端登录harbor
root@user1:~# docker login 10.0.0.19
Username: admin19
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
同一个账号可以在多个客户端登录, 需要客户端安装了docker服务, 并且把harbor的ip地址添加到信任站点
root@user2:~# docker login 10.0.0.19
Username: admin19
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

3.4.4 客户端推送镜像

root@user1:~# docker pull busybox
root@user1:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              ff4a8eb070e1        3 weeks ago         1.24MB
root@user1:~# docker tag busybox:latest 10.0.0.19/harbor-test/busybox:v1.0
root@user1:~# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
10.0.0.19/harbor-test/busybox   v1.0                b97242f89c8a        3 weeks ago         1.23MB
busybox                         latest              b97242f89c8a        3 weeks ago         1.23MB
root@user1:~# docker push 10.0.0.19/harbor-test/busybox:v1.0
The push refers to repository [10.0.0.19/harbor-test/busybox]
0064d0478d00: Pushed 
v1.0: digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019 size: 527
图片.png

3.4.5 测试另一台客户端拉取镜像

由于之前已经在10.0.0.49配置了信任harbor站点, 因此, 直接基于http就可拉取
root@user2:~# docker pull 10.0.0.19/harbor-test/busybox:v1.0
v1.0: Pulling from harbor-test/busybox
e5d9363303dd: Pull complete 
Digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019
Status: Downloaded newer image for 10.0.0.19/harbor-test/busybox:v1.0
10.0.0.19/harbor-test/busybox:v1.0

3.4.6 Harbor配置文件的修改

先用docker-compose关闭harbor
cd /apps/harbor
docker-compose stop
stop后所有的容器都会处于Exited状态, 之后修改harbor.cfg文件
修改后, 执行/apps/harbor/prepare来更新配置
最后重新启动harbor即可
docker-compose start

3.5 Harbor的高可用

环境准备

在10.0.0.29上, 创建另一个管理员用户admin29
在10.0.0.29上, 创建项目ha-test 注意: 在docker harbor中, 项目必须是手动在前端创建的
在ha-test中, 上传一个ha-test/busybox:v2.0
root@user2:~# docker tag busybox:latest 10.0.0.29/ha-test/busybox:v2.0
root@user2:~# docker push 10.0.0.29/ha-test/busybox:v2.0
image.png

image.png
image.png

3.5.1 共享存储

  • 利用共享存储, 将共享存储的目录, 挂载到Harbor保存数据的目录, 实现多个Harbor服务器共享资源
需要共享的目录:
/data: Harbor中的镜像都是存在/data目录
/var/log: 存放Harbor日志
Dockerfile文件
k8s的yml文件
...

3.5.2 镜像复制

Harbor支持基于策略的Docker镜像复制功能, 其可以实现不同的数据中心, 不同的运行环境之间同步镜像, 并可以基于界面管理. 
Harbor的复制是双向复制, 多个Harbor之间要把自己的镜像复制到其余Harbor
Harbor的复制是基于项目复制, 把一个Harbor的项目, 复制到其余Harbor上
不同的Harbor用户信息是不会被复制的, 不过一般Harbor的管理员信息在多个Harbor都是相同的

3.5.2.1 当前两个Harbor的镜像情况

10.0.0.19上有项目harbor-test, 放有busybox:v1.0镜像
10.0.0.29上有项目ha-test, 放有busybox:v2.0镜像
  • 10.0.0.19
  • 10.0.0.29
图片.png

3.5.2.2 以10.0.0.29为基准, 向10.0.0.19同步镜像

  1. 登录10.0.0.29, 配置仓库管理

10.0.0.29上有项目ha-test, 因此, 要把ha-test复制到10.0.0.19上

先在10.0.0.29上建立一个复制目标, 表明要往这个目标复制镜像

image.png
图片.png
  1. 在10.0.0.29上, 配置复制管理, 指定将ha-test项目复制到10.0.0.19


    image.png
图片.png
  1. 在10.0.0.19上验证ha-test项目被复制到了本地
图片.png

此时, 如果不小心把刚同步到10.0.0.19上的ha-test项目删除了, 那么就去10.0.0.29上, 选择修改规则, 立刻执行一次同步即可

image.png

每次同步都会产生日志

image.png

一旦镜像被同步到了10.0.0.19, 那么10.0.0.19上的管理员账号就可以管理该项目了
所以, 不同harbor上的管理员用户, 只能上传镜像到自己有权限的harbor

  1. 在10.0.0.49上, 再给busybox打个标签v3.0, 推送到10.0.0.29的ha-test项目, 查看是否会被同步到10.0.0.19
root@user2:~# docker tag busybox:latest 10.0.0.29/ha-test/busybox:v3.0
root@user2:~# docker push 10.0.0.29/ha-test/busybox:v3.0
The push refers to repository [10.0.0.29/ha-test/busybox]
0064d0478d00: Layer already exists 
v3.0: digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019 size: 527
  • 10.0.0.29上v3.0推送成功
图片.png
  • 10.0.0.19也同步了v3.0
图片.png
  1. 在10.0.0.29上, 再创建一个项目alpine-test, 从10.0.0.49给镜像打标签并推送到10.0.0.29, 验证是否会被推送的10.0.0.19
图片.png
  • 同步的仓库之前已经配好了, 直接配置复制管理即可
图片.png
图片.png

注意: Harbor推送镜像, 项目必须是已经存在的, 否则无法推送

  1. 在10.0.0.49拉取alpine镜像, 打标签, 推送到10.0.0.29上
root@user2:~# docker pull alpine
root@user2:~# docker tag alpine:latest 10.0.0.29/alpine-test/alpine:v1.0
root@user2:~# docker push 10.0.0.29/alpine-test/alpine:v1.0
The push refers to repository [10.0.0.29/alpine-test/alpine]
c04d1437198b: Layer already exists 
v1.0: digest: sha256:d0710affa17fad5f466a70159cc458227bd25d4afb39514ef662ead3e6c99515 size: 528
  • 10.0.0.29上推送成功
  • 10.0.0.19上同步成功
图片.png

3.5.2.3 以10.0.0.19为基准, 向10.0.0.29同步镜像, 实现双向同步

  1. 创建仓库管理项目
图片.png
  1. 创建复制管理

10.0.0.29的项目

10.0.0.19的项目

图片.png
  • 因此, 需要将harbor-test同步到10.0.0.29上
图片.png
  1. 验证10.0.0.29上同步到了harbor-test项目
图片.png

镜像复制是单向复制, 在Harbor-1上配置将项目A复制到Harbor-2, 那么只有Harbor-1上的A项目发生变化, 才会同步给Harbor-2, 而如果在Harbor-2上的项目A做修改, 是不会同步给Harbor-1的. 因此, 同一个项目, 需要在两个Harbor上配置双向复制, 或者使用共享存储

案例: 测试镜像的双向同步

  1. 先在两台harbor上, 创建相同的复制规则
image.png
image.png
  1. 在10.0.0.39上, 拉取10.0.0.19/alpine-test/alpine:v1.0, 然后重新打标签v2.0, 之后上传到10.0.0.19
root@user1:~# docker pull 10.0.0.19/alpine-test/alpine:v1.0
root@user1:~# docker tag 10.0.0.19/alpine-test/alpine:v1.0 10.0.0.19/alpine-test/alpine:v2.0
root@user1:~# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
10.0.0.19/harbor-test/busybox   v1.0                ff4a8eb070e1        3 weeks ago         1.24MB
busybox                         latest              ff4a8eb070e1        3 weeks ago         1.24MB
10.0.0.19/alpine-test/alpine    v1.0                9c6f07244728        2 months ago        5.54MB
10.0.0.19/alpine-test/alpine    v2.0                9c6f07244728        2 months ago        5.54MB
root@user1:~# docker push 10.0.0.19/alpine-test/alpine:v2.0
  1. 验证10.0.0.19上v2.0上传成功, 10.0.0.29上同步了v2.0
image.png
image.png
  1. 在10.0.0.49上, 拉取10.0.0.29/alpine-test/alpine:v2.0, 然后重新打标签v3.0, 之后上传到10.0.0.29
root@user2:~# docker pull 10.0.0.19/alpine-test/alpine:v2.0
root@user2:~# docker tag 10.0.0.29/alpine-test/alpine:v2.0 10.0.0.29/alpine-test/alpine:v3.0
root@user2:~# docker push 10.0.0.29/alpine-test/alpine:v3.0
  1. 验证10.0.0.29上v3.0上传成功, 10.0.0.19上同步了v3.0
image.png
image.png

3.5.3 删除镜像

Harbor上做删除操作时, 如果项目内有镜像或者有复制策略是不能直接删除项目的
需要先基于镜像删除, 然后删除复制策略

3.6 实现Harbor开机启动

Harbor在服务器重启后, 有些内部容器不会启动, 因此可以利用service文件来实现Harbor开机自启, 或者将命令写到rc.local
  • 方法1:
[root@Ubuntu-1804-2:/apps/harbor]# cat /etc/rc.local
#!/bin/bash
cd /apps/harbor
/usr/sbin/docker-compose up -d
  • 方法2:
[root@Ubuntu-1804-2:/apps/harbor]# vim /lib/systemd/system/harbor.service 

[Unit]                                                                                                                                                                                 
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/sbin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/sbin/docker-compose -f /apps/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容