dockdocker

7. Docker仓库管理

2021-02-09  本文已影响0人  随便写写咯

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 给本地镜像打标签

案例:

给拉取的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/chickenwinner2019/test-box:v2.0 # 新的repo, test-box
root@Ubuntu-1804-1:~# docker tag busybox:latest chickenwinner2019/docker-images:v3.0 # 已有仓库docker-images
root@Ubuntu-1804-1:~# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
busybox                           latest              22667f53682a        6 days ago          1.23MB
chickenwinner2019/docker-images   v3.0                22667f53682a        6 days ago          1.23MB
chickenwinner2019/test-box        v2.0                22667f53682a        6 days ago          1.23MB
图片.png

2.3 上传镜像到Docker Hub

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

案例: 推送到已有仓库

root@Ubuntu-1804-1:~# docker push chickenwinner2019/docker-images # docker-images是REPO名称, 一般就是软件名
The push refers to repository [docker.io/chickenwinner2019/docker-images]
6b245f040973: Pushed 
v3.0: digest: sha256:56853b711255f4a0bc7c44d2158167f03f64ef75a22a0249a9fae4703ec10f61 size: 527
图片.png 图片.png

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

root@Ubuntu-1804-1:~# docker push chickenwinner2019/test-box
The push refers to repository [docker.io/chickenwinner2019/test-box]
6b245f040973: Layer already exists 
v2.0: digest: sha256:56853b711255f4a0bc7c44d2158167f03f64ef75a22a0249a9fae4703ec10f61 size: 527
图片.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

环境准备:

四台主机:
10.0.0.19: Harbor-1
10.0.0.29: Harbor-2
10.0.0.39: 用于上传和下载镜像
10.0.0.49: 用于上传和下载镜像

3.3.1 安装Docker

3.3.2 安装docker-compose

v1.26.2
harbor-1
上传docker-compose程序到/usr/sbin目录下,  因为该文件本身就是个执行程序.
直接改名为docker-compose并且加上执行权限
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

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
两台harbor分别安装
apt -y install python

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

图片.png 图片.png

3.4 Harbor使用

3.4.1 用户创建

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

图片.png

3.4.2 创建项目

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

3.4.3 在本地登录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
执行相同操作
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
同一个账号可以在多个客户端登录
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 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上, 创建项目ha-test
在ha-test中, 上传一个busybox:v2.0
在10.0.0.29上, 创建另一个管理员用户admin29

3.5.1 共享存储

需要共享的目录:
/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镜像
图片.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上建立一个复制目标, 表明要往这个目标复制镜像

图片.png
  1. 在10.0.0.29上, 配置复制管理, 指定将ha-test项目复制到10.0.0.19
图片.png
  1. 在10.0.0.19上验证ha-test项目被复制到了本地
图片.png
  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
图片.png 图片.png
  1. 在10.0.0.29上, 再创建一个项目alpine-test, 从10.0.0.29给镜像打标签并推送到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 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
图片.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 图片.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上配置双向复制, 或者使用共享存储

3.5.3 删除镜像

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

3.6 实现Harbor开机启动

Harbor在服务器重启后, 有些内部容器不会启动, 因此可以利用service文件来实现Harbor开机自启, 或者将命令写到rc.local
[root@Ubuntu-1804-2:/apps/harbor]# cat /etc/rc.local
#!/bin/bash
cd /apps/harbor
/usr/sbin/docker-compose up -d
[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
上一篇下一篇

猜你喜欢

热点阅读