草庐IT

7. Docker仓库管理

随便写写咯 2023-10-06 原文

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

有关7. Docker仓库管理的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  3. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  6. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  9. ruby-on-rails - 使用用户或管理员模型和 Basecamp 样式子域设计登录 - 2

    我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica

  10. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

随机推荐