容器之王--Docker镜像的管理及镜像仓库的构建演练
3.docker镜像构建
3.1 docker镜像结构
- 共享宿主机的kernel
- base镜像提供的是最小的Linux发行版
- 同一docker主机支持运行多种Linux发行版
- 采用分层结构的最大好处是:共享资源
3.2 镜像运行的基本原理

- Copy-on-Write 可写容器层
- 容器层以下所有镜像层都是只读的
- docker从上往下依次查找文件
- 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
- 一个镜像最多127层
3.3 镜像获得方式
-
基本镜像通常由软件官方提供
-
企业镜像可以用官方镜像+Dockerfile来生成
-
系统关于镜像的获取动作有两种:
-
docker pull 镜像地址
-
docker load –i 本地镜像包
-
3.4 镜像构建
3.4.1 构建参数
FROM | 指定base镜像 eg:FROM busybox:version |
---|---|
COPY | 复制文件 eg:COPY file /file 或者 COPY [“file”,”/”] |
MAINTAINER | 指定作者信息,比如邮箱 eg:MAINTAINER user@example.com 在最新版的docker中用LABEL KEY="VALUE"代替 |
ADD | 功能和copy相似,指定压缩文件或url eg: ADD test.tar /mnt 或者 eg:ADD http://ip/test.tar /mnt |
ENV | 指定环境变量 eg:ENV FILENAME test |
EXPOSE | 暴漏容器端口 eg:EXPOSE 80 |
VOLUME | 申明数据卷,通常指数据挂载点 eg:VOLUME [“/var/www/html”] |
WORKDIR | 切换路径 eg:WORKDIR /mnt |
RUN | 在容器中运行的指令 eg: touch file |
CMD | 在启动容器时自动运行动作可以被覆盖 eg:CMD echo $FILENAME 会调用shell解析 eg:CMD [“/bin/sh”,”-c”,“echo $FILENAME”] 不调用shell解析 |
ENTRYPOINT | 和CMD功能和用法类似,但动作不可被覆盖 |
3.4.1.1 参数示例及用法
# FROM COPY 和 MAINTAINER
[root@Docker-node1 ~]# mkdir docker/
[root@Docker-node1 ~]# cd docker/
[root@Docker-node1 docker]# touch leefile
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox:latest # 指定使用的基础镜像
COPY leefile / # 复制当前目录文件到容器指定位置,leefile必须在当前目录中[root@Docker-node1 docker]# docker build -t example:v1 . #构建镜像#ADD
[root@Docker-node1 docker]# touch leefile{1..3}
[root@Docker-node1 docker]# tar zcf leefile.gz leefile*
[root@Docker-node1 docker]# vim Dockerfile
FROM busybox
MAINTAINER lee@timinglee.org
COPY leefile /
ADD leefile.gz /[root@Docker-node1 docker]# docker build -t example:v2 .
[root@Docker-node1 docker]# docker run -it --rm --name test example:v2
/ # ls
bin etc leefile leefile2 lib proc sys usr
dev home leefile1 leefile3 lib64 root tmp var#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
leeFROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
$NAME#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3
lee#ENTRYPOINT
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
ENTRYPOINT echo $NAME
[root@Docker-node1 docker]# docker run -it --rm --name test example:v3 sh
lee#EXPOSE VOLUME VOLUME
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
EXPOSE 80 443
VOLUME /var/www/html
WORKDIR /var/www/html
RUN touch leefile[root@Docker-node1 docker]# docker build -t example:v4 .
[root@Docker-node1 docker]# docker run -it --rm --name test example:v4
/var/www/html #
3.4.2 Dockerfile实例
3.4.2.1 建立构建目录,编写构建文件
# 以下是对于centos:7的更新了我们自己的版本(也就是yum仓库的配置,commit了一个配置了阿里云仓库的镜像)
[root@docker-node1 docker]# docker images[root@docker-node1 docker]# docker run -it --name centos centos:7[root@7349c08b4034 /]# rm -rf /etc/yum.repos.d/*
[root@7349c08b4034 /]# vi /etc/yum.repos.d/rhel7.repo
[rhel7]
name = rhel7
baseurl = https://mirrors.aliyun.com/centos/7/os/x86_64/
gpgcheck = 0[root@7349c08b4034 yum.repos.d]# yum makecache[root@docker-node1 ~]# docker commit -m "add repo" centos centos:repo[root@docker-node1 ~]# docker images[root@docker-node1 ~]#mdkir docker
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# cp ~/nginx-1.26.1.tar.gz .
[root@docker-node1 docker]# vim Dockerfile
FROM centos:repo
ADD nginx-1.26.1.tar.gz /mnt
RUN yum install -y gcc make pcre-devel openssl-devel
WORKDIR /mnt/nginx-1.26.1
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make && make install
VOLUME ["/usr/local/nginx/html"]
RUN echo ceshi > /usr/local/nginx/html/index.html
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
3.4.2.2 通过dockerfile生成镜像
[root@docker-node1 docker]# docker build -t nginx:dhj .

3.4.2.3 测试镜像可用性
[root@docker-node1 docker]# docker images
nginx dhj 7ef2b313b365 2 minutes ago 469MB[root@server1 docker]# docker history nginx:dhj
[root@docker-node1 docker]# docker run -d --name ceshi nginx:dhj

3.4.2.4 查看容器详情
[root@docker-node1 docker]# docker inspect ceshi
3.5 镜像优化方案
3.5.1 镜像优化策略
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
3.5.2 镜像优化示例
3.5.2.1 方法1:缩减镜像层
[root@server1 docker]# vim Dockerfile
FROM centos:7 AS build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.23.3 && yum clean all
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"][root@server1 docker]# docker build -t webserver:v2 .[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v2 caf0f80f2332 4 seconds ago 317MB
webserver v1 bfd6774cc216 About an hour ago 494MB
3.5.2.2 方法2:阶段构建
[root@server1 docker]# vim Dockerfile
FROM centos:7 AS build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.23.3 && yum clean allFROM centos:7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"][root@server1 docker]# docker build -t webserver:v3 .[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v3 1ac964f2cefe 29 seconds ago 205MB
webserver v2 caf0f80f2332 3 minutes ago 317MB
webserver v1 bfd6774cc216 About an hour ago 494MB
3.5.2.3 方法3:使用最精简镜像
使用google提供的最精简镜像
下载地址:
https://github.com/GoogleContainerTools/distroless
下载镜像:
docker pull gcr.io/distroless/base
利用最精简镜像构建
[root@docker-node1 ~]# cd /mnt
[root@docker-node1 mnt]# cd packages/[root@docker-node1 packages]# docker load -i debian11.tar.gz
[root@docker-node1 packages]# docker load -i nginx-1.23.tar.gz
[root@server1 ~]# mkdir new
[root@server1 ~]# cd new/
[root@server1 new]# vim Dockerfile
FROM nginx:1.23 AS baseRUN mkdir -p /opt/var/cache/nginx && \cp -a --parents /usr/lib/nginx /opt && \cp -a --parents /usr/share/nginx /opt && \cp -a --parents /var/log/nginx /opt && \cp -aL --parents /var/run /opt && \cp -a --parents /etc/nginx /opt && \cp -a --parents /etc/passwd /opt && \cp -a --parents /etc/group /opt && \cp -a --parents /usr/sbin/nginx /opt && \cp -a --parents /usr/sbin/nginx-debug /opt && \cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \cp -a --parents /usr/lib/x86_64-linux-gnu/libpcre* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /optFROM gcr.io/distroless/base-debian11
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"][root@docker-node1 docker]# docker build -t nginx:min .[root@docker-node1 docker]# docker images
nginx min 81e58ea79685 8 seconds ago 34.5MB
gcr.io/distroless/base-debian11 latest 2a6de77407bf N/A 20.6MB[root@docker-node1 ~]# docker run -d -p 80:80 --name ceshi nginx:min
b75b186f48b2c8d5619dacfe215f74c6fab9b14faf53d037858da3206f80f954[root@docker-node1 ~]# curl 172.25.254.10:80

4.docker 镜像仓库的管理
4.1 什么是docker仓库

Docker 仓库(Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库。
它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉取所需的镜像。
Docker 仓库可以分为公共仓库和私有仓库:
- 公共仓库,如 Docker Hub,任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在 Docker Hub 上提供的镜像,方便用户直接获取和使用。
- 例如,您想要部署一个 Nginx 服务器,就可以从 Docker Hub 上拉取 Nginx 的镜像。
- 私有仓库则是由组织或个人自己搭建和管理的,用于存储内部使用的、不希望公开的镜像。
- 比如,一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中,以保证安全性和控制访问权限。
通过 Docker 仓库,开发者能够方便地共享和复用镜像,加速应用的开发和部署过程。
4.2 docker hub

官网:https://hub.docker.com/

Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。
它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。
以下是 Docker Hub 的一些关键特点和优势:
- 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用的镜像。
- 例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库的镜像。
- 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
- 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
- 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
- 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。
4.2.1 docker hub的使用方法
#登陆官方仓库
[root@docker ~]# docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/Username: timinglee
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/#credential-storesLogin Succeeded#登陆信息保存位置
[root@docker ~]# cd .docker/
[root@docker .docker]# ls
config.json
[root@docker .docker]# cat config.json
{"auths": {"https://index.docker.io/v1/": {"auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu"}}[root@docker ~]# docker tag gcr.io/distroless/base-debian11:latest timinglee/base-debian11:latest
[root@docker ~]# docker push timinglee/base-debian11:latest
The push refers to repository [docker.io/timinglee/base-debian11]
6835249f577a: Pushed
24aacbf97031: Pushed
8451c71f8c1e: Pushed
2388d21e8e2b: Pushed
c048279a7d9f: Pushed
1a73b54f556b: Pushed
2a92d6ac9e4f: Pushed
bbb6cacb8c82: Pushed
ac805962e479: Pushed
af5aa97ebe6c: Pushed
4d049f83d9cf: Pushed
9ed498e122b2: Pushed
577c8ee06f39: Pushed
5342a2647e87: Pushed
latest: digest: sha256:f8179c20f1f2b1168665003412197549bd4faab5ccc1b140c666f9b8aa958042 size: 3234

4.3 docker仓库的工作原理
仓库中的三个角色
index docker索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
registry docker仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证
Registry Client Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
4.3.1 pull原理
镜像拉取分为以下几步:
1.docker客户端向index发送镜像拉去请求并完成与index的认证
2.index发送认证token和镜像位置给dockerclient
3.dockerclient携带token和根据index指引的镜像位置取连接registry
4.Registry会根据client持有的token跟index核实身份合法性
5.index确认此token合法性
6.Registry会根据client的请求传递镜像到客户端
4.3.2 push原理

镜像上传的步骤:
1.client向index发送上传请求并完成用户认证
2.index会发方token给client来证明client的合法性
3.client携带index提供的token连接Registry
4.Registry向index合适token的合法性
5.index证实token的合法性
6.Registry开始接收客户端上传过来的镜像
4.3 搭建docker的私有仓库
4.3.1 为什么搭建私有仓库
docker hub虽然方便,但是还是有限制
- 需要internet连接,速度慢
- 所有人都可以访问
- 由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
地址: https://docs.docker.com/registry/deploying/
4.3.2 搭建简单的Registry仓库
4.3.2.1 下载Registry镜像
[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
930bdd4d222e: Pull complete
a15309931e05: Pull complete
6263fb9c821f: Pull complete
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest# 也可以使用我们的
[root@docker-node1 mnt]# cd packages/
[root@docker-node1 packages]# docker load -i registry.tag.gz
4.3.2.2 开启Registry
[root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry registry:latest[root@docker ~]# docker ps
4.3.2.3 上传镜像到仓库中
# 给要上传的镜像打标签
[root@docker ~]# docker tag busybox:latest 172.25.254.10:5000/busybox:latest#docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错
[root@docker ~]# docker push 172.25.254.100:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
Get "https://172.25.254.100:5000/v2/": dial tcp 172.25.254.100:5000: connect: connection refused#配置非加密端口
[root@docker ~]# vim /etc/docker/daemon.json
{"insecure-registries" : ["http://172.25.254.10:5000"]
}[root@docker ~]# systemctl restart docker#上传镜像
[root@docker ~]# docker push 172.25.254.10:5000/busybox:latest
The push refers to repository [172.25.254.100:5000/busybox]
d51af96cf93e: Pushed
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527#查看镜像上传
[root@docker ~]# curl 172.25.254.10:5000/v2/_catalog
{"repositories":["busybox"]}
4.3.3 为Registry提供加密传输
[root@docker-node1 ~]# docker ps
[root@docker-node1 ~]# docker rm -f registry[root@docker-node1 ~]# rm -rf /etc/docker/daemon.json
# 创建了证书与密钥
[root@docker-node1 ~]# mkdir -p /data/certs
[root@docker-node1 ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/dhj.org.key \
-addext "subjectAltName = DNS:reg.dhj.org" \
-x509 -days 365 -out /data/certs/dhj.org.crtCommon Name (eg, your name or your server's hostname) []:reg.dhj.org # 指定备用名称(在此必须为上面DNS处的信息)
# 启动registry仓库
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name registry \
-v /opt/registry:/var/lib/registry \
-v /data/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/dhj.org.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/dhj.org.key registry
测试:
[root@docker-node1 ~]# docker tag busybox:latest reg.dhj.org/busybox:latest
[root@docker-node1 ~]# docker push reg.dhj.org/busybox:latest # docker客户端没有key和证书
The push refers to repository [reg.dhj.org/busybox]
Get "https://reg.dhj.org/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
# 创建证书目录并部署信任证书(使Docker客户端信任私有仓库的HTTPS证书)
[root@docker docker]# mkdir /etc/docker/certs.d/reg.dhj.org/ -p
[root@docker docker]# cp /data/certs/dhj.org.crt /etc/docker/certs.d/reg.dhj.org/ca.crt
[root@docker docker]# systemctl restart docker
[root@docker-node1 ~]# docker push reg.dhj.org/busybox:latest
The push refers to repository [reg.dhj.org/busybox]
d51af96cf93e: Pushed
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527[root@docker docker]# curl -k https://reg.dhj.org/v2/_catalog
{"repositories":["busybox"]}
4.3.4 为仓库建立登录认证
# 安装建立认证文件的工具包
[root@docker docker]# dnf install httpd-tools -y# 建立认证文件
[root@docker ~]# mkdir -p /data/auth
[root@docker ~]# htpasswd -Bc /data/auth/htpasswd dhj # -B 强制使用最安全加密方式,默认用md5加密
New password:dhj
Re-type new password:dhj
Adding password for user dhj[root@docker-node1 ~]# htpasswd -B /data/auth/htpasswd admin # 建立第二个用户时不需要-c(如果加的话,则会覆盖前面的用户信息)
New password:admin
Re-type new password:admin
Adding password for user admin# 添加认证到registry容器中
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always --name registry \
-v /opt/registry:/var/lib/registry \
-v /data/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/dhj.org.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/dhj.org.key \
-v /data/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry[root@docker-node1 ~]# systemctl restart docker[root@docker-node1 ~]# docker ps[root@docker-node1 ~]# curl -k https://reg.dhj.org/v2/_catalog -u dhj:dhj
{"repositories":["busybox"]}# 登录测试
[root@docker-node1 ~]# docker login reg.dhj.org

当仓库开启认证后必须登陆仓库才能进行镜像上传
# 如果上面测试过之后,需要登出,执行logout命令
[root@docker-node1 ~]# docker logout reg.dhj.org# 未登陆情况下上传镜像
[root@docker-node1 ~]# docker push reg.dhj.org/busybox
Using default tag: latest
The push refers to repository [reg.dhj.org/busybox]
d51af96cf93e: Preparing
no basic auth credentials# 未登陆情况下也不能下载
[root@docker-node1 ~]# docker pull reg.dhj.org/busybox
Using default tag: latest
Error response from daemon: Head "https://reg.dhj.org/v2/busybox/manifests/latest": no basic auth credentials
4.4 构建企业级私有仓库

下载软件包地址:https://github.com/goharbor/harbor/releases
Harbor 是由vmware公司开源的企业级 Docker Registry 项目。
它提供了以下主要功能和特点:
- 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性。
- 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
- 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
- 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
- 垃圾回收:可以清理不再使用的镜像,节省存储空间。
4.4.1 部署harbor
# 如果在测试环境,前期需要做https的加密认证(上面的实验中有所提到)
# 在生产环境中,需要正规的CA认证[root@docker-node1 ~]# cd /mnt/packages/
[root@docker-node1 packages]# ls
[root@docker-node1 packages]# cp -p harbor-offline-installer-v2.5.4.tgz /root
[root@docker-node1 packages]# cd[root@docker-node1 ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-node1 ~]# cd harbor/
[root@docker-node1 harbor]# ls
[root@docker-node1 harbor]# cp harbor.yml.tmpl harbor.yml
# 需要修改内容如下(如果一致,不变即可):
[root@docker-node1 harbor]# vim harbor.yml5 hostname: reg.dhj.org17 certificate: /data/certs/dhj.org.crt # 看自己的存放位置18 private_key: /data/certs/dhj.org.key # 看自己的存放位置34 harbor_admin_password: admin # 初始密码47 data_volume: /data # 此处挂载的目录(需要跟上面证书与密钥在一个目录下)[root@docker harbor]# ./install.sh --help
Please set --with-notary #证书签名
Please set --with-trivy #安全扫描
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor# 先将之前的registry容器删除,要不会影响实验(没有的话则忽略)
[root@docker-node1 harbor]# docker rm -f registry[root@docker harbor]# ./install.sh --with-chartmuseum



# 管理harbor的容器
[root@docker-node1 harbor]# docker compose stop
[root@docker-node1 harbor]# docker compose start
[root@docker harbor]# docker compose up -d # 此处的 up -d 功能比start更加强大# 此时去浏览器中去测试172.25.254.10
4.4.2 管理仓库
4.4.2.1 登陆

4.4.2.2 建立仓库项目
4.4.2.3 上传镜像
[root@docker-node1 docker]# cd /etc/docker/
[root@docker-node1 docker]# vim daemon.json
{"registry-mirrors": ["https://reg.dhj.org"]
}
[root@docker-node1 docker]# systemctl restart docker[root@docker-node1 harbor]# docker logout reg.dhj.org[root@docker-node1 harbor]# systemctl restart docker
[root@docker-node1 harbor]# docker compose up -d[root@docker-node1 harbor]# docker login reg.dhj.org
Login Succeeded[root@docker-node1 harbor]# docker tag busybox:latest reg.dhj.org/ceshi/busybox:latest
[root@docker-node1 harbor]# docker push reg.dhj.org/ceshi/busybox:latest
The push refers to repository [reg.dhj.org/ceshi/busybox]
d51af96cf93e: Pushed
latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527[root@docker-node1 harbor]# curl -k https://reg.dhj.org/v2/_catalog
{"errors":[{"code":"UNAUTHORIZED","message":"unauthorized to list catalog: unauthorized to list catalog"}]}
[root@docker-node1 harbor]# curl -k https://reg.dhj.org/v2/_catalog -u admin:admin
{"repositories":["ceshi/busybox"]}
4.4.2.4 查看上传的镜像
