0x1 Dockerfile自定义镜像
1) Dockerfile介绍
Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。
我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系。
我们从上图中可以看到, Dockerfile 可以自定义镜像,通过 Docker 命令去运行镜像,从而达到启动容器的目的。
Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
2) Dockerfile的基本结构
Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
3)使用 Dockerfile 定制镜像/自定义镜像
Q
为什么要自定义Docker镜像?
A
工作中Docker中的镜像并不满足工作的需要,需要进行自己的配置。
Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的
3) 使用 Docker build 构建镜像创建容器的步骤
第一步 编写Dockerfile文件
第二步 Docker build
第三步 Docker run
3-1 企业案例通过Dockerfile自定义Centos镜像
docker pull centos
官方镜像 docker run -i -t 470671670cac
[root@localhost ~]# docker run -i -t 470671670cac
[root@87676eea74fc /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@87676eea74fc /]# pwd
/
[root@87676eea74fc /]#
官方进行我们执行的命令不支持,显然是不符合我们需求的
【注意】现在我们需要自定义一个镜像来支持 VIM、ifconfig、并且登录后的默认路径改做修改。
Step 1 编写 Dockerfile:
# 从标准centos构建
FROM centos
# 定义作者信息
MAINTAINER tim<azkaban@163.com>
# 定义一个变量
ENV newpath /tmp
# 设置登录后的落脚点
WORKDIR $newpath
# 安装vim和net-tools工具
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $newpath
CMD echo "success----------ok"
CMD /bin/bash
Step 2 接下来开始构建
[root@localhost home]# docker build -f dockerfile -t azkaban/custom_centos:dev .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
---> 470671670cac
Step 2/10 : MAINTAINER tim<azkaban@163.com>
---> Running in 17cfb49e9de0
Removing intermediate container 17cfb49e9de0
---> c11d2b7177b3
Step 3/10 : ENV newpath /tmp
---> Running in a9b0ac73880d
Removing intermediate container a9b0ac73880d
---> c7349c6f826e
Step 4/10 : WORKDIR $newpath
---> Running in 058f8a1c5f10
Removing intermediate container 058f8a1c5f10
---> da8c3420a837
Step 5/10 : RUN yum -y install vim
---> Running in 0d056f9155c3
CentOS-8 - AppStream 3.3 MB/s | 6.0 MB 00:01
CentOS-8 - Base 2.8 MB/s | 4.0 MB 00:01
CentOS-8 - Extras 3.2 kB/s | 2.1 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-13.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-13.el8 AppStream 48 k
which x86_64 2.21-10.el8 BaseOS 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 776 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 987 kB/s | 48 kB 00:00
(3/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm 5.2 MB/s | 1.4 MB 00:00
(4/5): which-2.21-10.el8.x86_64.rpm 239 kB/s | 49 kB 00:00
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm 6.2 MB/s | 6.3 MB 00:01
--------------------------------------------------------------------------------
Total 3.7 MB/s | 7.8 MB 00:02
CentOS-8 - AppStream 1.6 MB/s | 1.6 kB 00:00
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-10.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-13.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-13.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-15.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-15.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-13.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-13.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-13.el8.noarch 4/5
Verifying : which-2.21-10.el8.x86_64 5/5
Installed:
vim-enhanced-2:8.0.1763-13.el8.x86_64 gpm-libs-1.20.7-15.el8.x86_64
vim-common-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
which-2.21-10.el8.x86_64
Complete!
Removing intermediate container 0d056f9155c3
---> 5dbc71407158
Step 6/10 : RUN yum -y install net-tools
---> Running in 256ba8728c84
Last metadata expiration check: 0:00:16 ago on Thu Jan 23 07:23:35 2020.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.51.20160912git.el8 BaseOS 323 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm 4.1 MB/s | 323 kB 00:00
--------------------------------------------------------------------------------
Total 428 kB/s | 323 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.51.20160912git.el8.x86_64
Complete!
Removing intermediate container 256ba8728c84
---> 0cb56cf78270
Step 7/10 : EXPOSE 80
---> Running in ec469c4c3482
Removing intermediate container ec469c4c3482
---> d595211bf706
Step 8/10 : CMD echo $newpath
---> Running in 782b14b53101
Removing intermediate container 782b14b53101
---> bda657b8cc02
Step 9/10 : CMD echo "success----------ok"
---> Running in 5b53899004d9
Removing intermediate container 5b53899004d9
---> f139b252cd83
Step 10/10 : CMD /bin/bash
---> Running in d21678e7e46f
Removing intermediate container d21678e7e46f
---> 10248154fcbd
Successfully built 10248154fcbd
Successfully tagged azkaban/custom_centos:dev
[root@localhost home]#
自己构建的镜像成功 docker images查看
Step 3 通过Docker run 创建容器,验证vim 以及net-tools
通过我们自定义的镜像创建容器
测试ifconfig命令 OK
测试vim 命令OK
看看构建过程是否是如前面所说,这也证实了镜像的分层
4)Dockerfile镜像分层
dockerfile中的每一条命令,都会构建一层文件。
以下图的Dockerfile为例分析构建过程
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
只有容器层是可写的,容器层下面的所有镜像层都是只读的。
下面我们深入讨论容器层的细节。
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
1.添加文件
在容器中创建文件时,新文件被添加到容器层中。
读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
5) Dockerfile指令详解
一张图搞定Dockerfile常见命令
Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。
FROM
格式为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
MAINTAINER
格式为MAINTAINER user_name user_email,指定维护者信息
RUN
格式为RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c","echo hello"]
每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。
CMD
支持三种格式:
CMD ["executable","param1","param2"],使用exec执行,这是推荐的方式。
CMD command param1 param2 在/bin/sh中执行。
CMD ["param1","param2"] 提供给ENTERYPOINT的默认参数。
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
EXPOSE
格式为 EXPOSE port [port2,port3,...],例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。
ENV
格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
例如
ENV word hello
RUN echo $word
ADD
格式:ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。
COPY
格式为:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
ENTRYPOINT
格式有两种:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
VOLUME
格式为 VOLUME ["/data"]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
USER
格式为:USER username
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
例如:RUN groupadd -r docker && useradd -r -g docker docker
WORKDIR
格式: WORKDIR /path
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
ONBUILD
格式ONBUILD [INSTRUCTION]
该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。
例如下面的Dockerfile创建了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
FROM A
ADD ./app
RUN python app.py
docker build
创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。
通过 -t 指定镜像的标签信息,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路径
0x2 Docker Repository(仓库管理)
仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的
1)镜像的公有仓库 Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
1-1 注册
在 https://hub.docker.com 免费注册一个 Docker 账号。
1-2 登录和退出
登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
docker login 登录
[root@localhost home]# docker login
Login with your Docker ID 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.
Username: 13810294682
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@localhost home]#
docker logout 登出
[root@localhost home]# docker logout
Removing login credentials for https://index.docker.io/v1/
[root@localhost home]#
1-3 基本操作
上传镜像
docker push <image_name>
搜索镜像
docker search <image_name>
下载镜像
docker pull
2)镜像的私有仓库
Docker官方提供了docker-registry组件,我们可以用它来构建我们的私有镜像仓库。
安装docker-registry
1、Docker私有仓库安装
Step 1开始下载最新的镜像。
[root@localhost home]# docker rmi -f docker.io/registry
Error: No such image: docker.io/registry
[root@localhost home]#
[root@localhost home]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
docker images 查看镜像是否pull成功
Step2 启动并且挂载镜像仓库到本地磁盘
[root@localhost home]# docker run -d -v /registry:/home/docker-registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
ae5d40d1b9802a2b4579466608a69f290e1e39273729e7b7fbcebe212e31c128
[root@localhost home]#
查看容器启动进程
-v /registry:/home/docker-registry:默认情况下,会将仓库存放于容器内的/home/docker-registry目录下,指定本地目录挂载到容器。
-p 5000:5000 :端口映射。即本地5000端口,映射到registry中的5000端口。
–restart=always1:在容器退出时总是重启容器,主要应用在生产环境。
–privileged=true:在CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报类似权限错误。OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)
–name registry:指定容器的名称。
为了持久化数据,将volume挂载到/home/docker-registry
Step3 我们给一个本地镜像打个标签然后上传
[root@localhost home]# docker tag nginx:latest localhost:5000/nginx:1.0
[root@localhost home]# docker push localhost:5000/nginx:1.0
修改配置文件
[root@localhost registry]# echo '{ "insecure-registries":["192.168.0.115:5000"] }' > /etc/docker/daemon.json
[root@localhost registry]# systemctl restart docker
浏览器中打开 出现 {} 表示运行成功
打包上传镜像
浏览器验证
Step 4 另一台Docker主机上验证
[root@web01 ~]# docker pull 192.168.0.115:5000/azkaban/custom_centos:dev
dev: Pulling from azkaban/custom_centos
8a29a15cefae: Pull complete
dc26872d8705: Pull complete
aa55a5bd5b69: Pull complete
Digest: sha256:1c29e87308bbf896d030e6a07f534200761c24fc089b848933faeb5a294e68a2
Status: Downloaded newer image for 192.168.0.115:5000/azkaban/custom_centos:dev
[root@web01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.0.115:5000/azkaban/custom_centos dev 10248154fcbd 2 hours ago 322MB
rancher/scheduler v0.8.6 fbedeaddc3e9 12 months ago 248MB
rancher/agent v1.2.11 1cc7591af4f5 18 months ago 243MB
rancher/net v0.13.17 f170c38e3763 18 months ago 311MB
rancher/dns v0.17.4 678bde0de4d2 18 months ago 249MB
rancher/healthcheck v0.3.8 ce78cf69cc0b 18 months ago 391MB
rancher/metadata v0.10.4 02104eb6e270 18 months ago 251MB
rancher/network-manager v0.7.22 13381626c510 18 months ago 256MB
rancher/storage-nfs v0.9.1 9ff4993fd3f8 24 months ago 211MB
rancher/net holder 665d9f6e8cc1 2 years ago 267MB
[root@web01 ~]#
0x3 Docker Registry & Harbor企业级开源仓库
1) Harbor特性
基于角色的访问控制:用户和存储库是通过“项目”组织的,用户可以对多个镜像仓库统一命名空间拥有不同的权限。
镜像复制:可以基于具有多个Registry实例之间复制(同步)图像和图表。如果出现任何错误,Harbor会自动重试复制。非常适合于负载平衡、高可用性、多数据中心、混合和多云场景。
LDAP/AD支持:Harbor与现有企业LDAP/AD集成,用于用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
镜像删除和垃圾收集:镜像可以删除,其空间可以回收。
国际化:对多国语言支持(已拥有中文、英文、德文、日语和俄文);
图形化用户界面:用户可以轻松浏览、搜索存储库和管理项目。
审计管理:跟踪到存储库的所有操作。
RESTful API:用于大多数管理操作的RESTful API,易于与外部系统集成。一个嵌入式的Swagger用户界面可用于探索和测试API。
简单部署:提供在线和离线安装程序。此外,可以安装到vSphere平台的(OVA方式)虚拟设备。
2)Harbor 组件
proxy:Harbor的组件,如注册表、UI和令牌服务,都位于反向代理之后。代理将来自浏览器和Docker客户机的请求转发到各种后端服务。
Registry:负责存储Docker镜像和处理Docker推/拉命令。由于Harbor需要对映像进行访问权限控制,Registry将引导客户机访问令牌服务,以便为每个pull或push请求获取有效的令牌(token)。
-
Core Service:Harbor的核心功能,主要提供以下服务:
UI:提供图像化的图形用户界面,帮助人户管理镜像和对用户授权。
webhook: 为了及时获取registry上images的状态变化的情况,在Registry上配置webhook,把状态变化传递UI模块;
Token令牌服务:负责根据用户在项目中的角色为每个docker push/pull命令颁发令牌。如果从Docker客户机发送的请求中没有令牌,注册表将把请求重定向到令牌服务。
Datebase:为了给core services提供数据库舒服,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程负责功能,能把本地镜像同步到其他harbor实例当中。
Log Collector:为了帮助监控Harbor运行,负责手机其他组件的log,供日后分析。
3) Harbor 安装
Step1 安装Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
这一步国内不用加速器可能会比较慢!
Docker国内阿里云镜像加速传送门
Docker-compose官方安装文档链接
VMWare Harbor项目地址传送门
[root@web01 ~]# vim /etc/docker/daemon.json
[root@web01 ~]# sudo systemctl daemon-reload
[root@web01 ~]# sudo systemctl restart docker
[root@web01 ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 581 0 --:--:-- 0:00:01 --:--:-- 582
100 15.4M 100 15.4M 0 0 3205k 0 0:00:04 0:00:04 --:--:-- 4623k
[root@web01 ~]#
[root@web01 ~]# chmod +x /usr/local/bin/docker-compose
[root@web01 ~]# docker-compose --version
docker-compose version 1.24.1, build 4667896b
[root@web01 ~]#
[root@web01 ~]# yum install -y lrzsz
[root@web01 home]# tar -xvf harbor-offline-installer-v1.9.4.tgz
[root@web01 home]# cd harbor
[root@web01 harbor]# ./prepare
prepare base dir is set to /home/harbor
Unable to find image 'goharbor/prepare:v1.9.4' locally
v1.9.4: Pulling from goharbor/prepare
59bb73b1db41: Pull complete
151a8120c357: Pull complete
bdb3b55ae888: Pull complete
bc627acc6004: Pull complete
b9e028a223e6: Pull complete
0b1166b529f5: Pull complete
5255c5c54d23: Pull complete
Digest: sha256:3b0e3b40be3056aa2eab2f02393065a615e442c7e6f572def2f1f991257c8d5d
Status: Downloaded newer image for goharbor/prepare:v1.9.4
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /secret/keys/secretkey
Generated certificate, key file: /secret/core/private_key.pem, cert file: /secret/registry/root.crt
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
[root@web01 harbor]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 18.03.1
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 1.24.1
[Step 2]: loading Harbor images ...
安装成功