0x1 Dockerfile自定義鏡像
1) Dockerfile介紹
Dockerfile 是自動構(gòu)建 docker 鏡像的配置文件扎筒, 用戶可以使用 Dockerfile 快速創(chuàng)建自定義的鏡像。Dockerfile 中的命令非常類似于 linux 下的 shell 命令女仰。
我們可以通過下面這幅圖來直觀地感受下 Docker 鏡像捕捂、容器和 Dockerfile 三者之間的關(guān)系蚀之。
我們從上圖中可以看到邑滨, Dockerfile 可以自定義鏡像每界,通過 Docker 命令去運(yùn)行鏡像捅僵,從而達(dá)到啟動容器的目的。
Dockerfile 是由一行行命令語句組成眨层,并且支持已 # 開頭的注釋行庙楚。
一般來說,我們可以將 Dockerfile 分為四個部分:
- 基礎(chǔ)鏡像(父鏡像)信息指令 FROM
- 維護(hù)者信息指令 MAINTAINER
- 鏡像操作指令 RUN 趴樱、 EVN 馒闷、 ADD 和 WORKDIR 等
- 容器啟動指令 CMD 酪捡、 ENTRYPOINT 和 USER 等
2) Dockerfile的基本結(jié)構(gòu)
Dockerfile的基本結(jié)構(gòu)
Dockerfile 一般分為四部分:基礎(chǔ)鏡像信息、維護(hù)者信息纳账、鏡像操作指令和容器啟動時執(zhí)行指令逛薇,’#’ 為 Dockerfile 中的注釋。
3)使用 Dockerfile 定制鏡像/自定義鏡像
Q
為什么要自定義Docker鏡像?
A
工作中Docker中的鏡像并不滿足工作的需要疏虫,需要進(jìn)行自己的配置永罚。
Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的
3) 使用 Docker build 構(gòu)建鏡像創(chuàng)建容器的步驟
第一步 編寫Dockerfile文件
第二步 Docker build
第三步 Docker run
3-1 企業(yè)案例通過Dockerfile自定義Centos鏡像
docker pull centos
image.png
官方鏡像 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 /]#
官方進(jìn)行我們執(zhí)行的命令不支持,顯然是不符合我們需求的
image.png
【注意】現(xiàn)在我們需要自定義一個鏡像來支持 VIM卧秘、ifconfig呢袱、并且登錄后的默認(rèn)路徑改做修改。
Step 1 編寫 Dockerfile:
# 從標(biāo)準(zhǔn)centos構(gòu)建
FROM centos
# 定義作者信息
MAINTAINER tim<azkaban@163.com>
# 定義一個變量
ENV newpath /tmp
# 設(shè)置登錄后的落腳點
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 接下來開始構(gòu)建
[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]#
自己構(gòu)建的鏡像成功 docker images查看
image.png
Step 3 通過Docker run 創(chuàng)建容器,驗證vim 以及net-tools
通過我們自定義的鏡像創(chuàng)建容器
測試ifconfig命令 OK
測試vim 命令OK
看看構(gòu)建過程是否是如前面所說翅敌,這也證實了鏡像的分層
image.png
4)Dockerfile鏡像分層
dockerfile中的每一條命令羞福,都會構(gòu)建一層文件。
Docker鏡像分層
以下圖的Dockerfile為例分析構(gòu)建過程
image.png
當(dāng)容器啟動時蚯涮,一個新的可寫層被加載到鏡像的頂部治专。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”恋昼。
所有對容器的改動 - 無論添加看靠、刪除、還是修改文件都只會發(fā)生在容器層中液肌。
只有容器層是可寫的挟炬,容器層下面的所有鏡像層都是只讀的。
下面我們深入討論容器層的細(xì)節(jié)嗦哆。
鏡像層數(shù)量可能會很多谤祖,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件老速,比如 /a粥喜,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a橘券。在容器層中额湘,用戶看到的是一個疊加之后的文件系統(tǒng)。
1.添加文件
在容器中創(chuàng)建文件時旁舰,新文件被添加到容器層中锋华。
讀取文件
在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件箭窜。一旦找到毯焕,打開并讀入內(nèi)存。
修改文件
在容器中修改已存在的文件時磺樱,Docker 會從上往下依次在各鏡像層中查找此文件纳猫。一旦找到婆咸,立即將其復(fù)制到容器層,然后修改之芜辕。
刪除文件
在容器中刪除文件時尚骄,Docker 也是從上往下依次在鏡像層中查找此文件。找到后物遇,會在容器層中記錄下此刪除操作乖仇。
只有當(dāng)需要修改時才復(fù)制一份數(shù)據(jù)憾儒,這種特性被稱作 Copy-on-Write询兴。可見起趾,容器層保存的是鏡像變化的部分诗舰,不會對鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改训裆,所有鏡像層都是只讀的眶根,不會被容器修改,所以鏡像可以被多個容器共享边琉。
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中創(chuàng)建多個鏡像時双饥,可以使用多個FROM指令。
MAINTAINER
格式為MAINTAINER user_name user_email示启,指定維護(hù)者信息
RUN
格式為RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....]兢哭,前者在shell終端中運(yùn)行命令,/bin/sh -c command夫嗓,例如:/bin/sh -c "echo hello"迟螺;后者使用exec執(zhí)行冲秽,指定其他運(yùn)行終端使用RUN["/bin/bash","-c","echo hello"]
每條RUN指令將當(dāng)前的鏡像基礎(chǔ)上執(zhí)行指令,并提交為新的鏡像矩父,命令較長的時候可以使用\來換行锉桑。
CMD
支持三種格式:
CMD ["executable","param1","param2"],使用exec執(zhí)行窍株,這是推薦的方式民轴。
CMD command param1 param2 在/bin/sh中執(zhí)行。
CMD ["param1","param2"] 提供給ENTERYPOINT的默認(rèn)參數(shù)球订。
CMD用于指定容器啟動時執(zhí)行的命令后裸,每個Dockerfile只能有一個CMD命令,多個CMD命令只執(zhí)行最后一個冒滩。若容器啟動時指定了運(yùn)行的命令微驶,則會覆蓋掉CMD中指定的命令。
EXPOSE
格式為 EXPOSE port [port2,port3,...]开睡,例如EXPOSE 80這條指令告訴Docker服務(wù)器暴露80端口因苹,供容器外部連接使用。
在啟動容器的使用使用-P篇恒,Docker會自動分配一個端口和轉(zhuǎn)發(fā)指定的端口扶檐,使用-p可以具體指定使用哪個本地的端口來映射對外開放的端口。
ENV
格式為:EVN key value 胁艰。用于指定環(huán)境變量款筑,這些環(huán)境變量,后續(xù)可以被RUN指令使用蝗茁,容器運(yùn)行起來之后醋虏,也可以在容器中獲取這些環(huán)境變量。
例如
ENV word hello
RUN echo $word
ADD
格式:ADD src dest
該命令將復(fù)制指定本地目錄中的文件到容器中的dest中哮翘,src可以是是一個絕對路徑颈嚼,也可以是一個URL或一個tar文件,tar文件會自動解壓為目錄饭寺。
COPY
格式為:COPY src desc
復(fù)制本地主機(jī)src目錄或文件到容器的desc目錄阻课,desc不存在時會自動創(chuàng)建。
ENTRYPOINT
格式有兩種:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2 會在shell中執(zhí)行艰匙。
用于配置容器啟動后執(zhí)行的命令限煞,這些命令不能被docker run提供的參數(shù)覆蓋。和CMD一樣员凝,每個Dockerfile中只能有一個ENTRYPOINT署驻,當(dāng)有多個時最后一個生效。
VOLUME
格式為 VOLUME ["/data"]
作用是創(chuàng)建在本地主機(jī)或其他容器可以掛載的數(shù)據(jù)卷,用來存放數(shù)據(jù)旺上。
USER
格式為:USER username
指定容器運(yùn)行時的用戶名或UID瓶蚂,后續(xù)的RUN也會使用指定的用戶。要臨時使用管理員權(quán)限可以使用sudo宣吱。在USER命令之前可以使用RUN命令創(chuàng)建需要的用戶窃这。
例如:RUN groupadd -r docker && useradd -r -g docker docker
WORKDIR
格式: WORKDIR /path
為后續(xù)的RUN CMD ENTRYPOINT指定配置工作目錄,可以使用多個WORKDIR指令征候,若后續(xù)指令用得是相對路徑杭攻,則會基于之前的命令指定路徑。
ONBUILD
格式ONBUILD [INSTRUCTION]
該配置指定當(dāng)所創(chuàng)建的鏡像作為其他新建鏡像的基礎(chǔ)鏡像時所執(zhí)行的指令疤坝。
例如下面的Dockerfile創(chuàng)建了鏡像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
則基于鏡像A創(chuàng)建新的鏡像時兆解,新的Dockerfile中使用from A 指定基鏡像時,會自動執(zhí)行ONBBUILD指令內(nèi)容卒煞,等價于在新的要構(gòu)建鏡像的Dockerfile中增加了兩條指令:
FROM A
ADD ./app
RUN python app.py
docker build
創(chuàng)建好Dockerfile之后痪宰,通過docker build命令來創(chuàng)建鏡像,該命令首先會上傳Dockerfile文件給Docker服務(wù)器端畔裕,服務(wù)器端將逐行執(zhí)行Dockerfile中定義的指令。
通常建議放置Dockerfile的目錄為空目錄乖订。另外可以在目錄下創(chuàng)建.dockerignore文件扮饶,讓Docker忽略路徑下的文件和目錄,這一點與Git中的配置很相似乍构。
通過 -t 指定鏡像的標(biāo)簽信息甜无,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路徑
0x2 Docker Repository(倉庫管理)
倉庫(Repository)是集中存放鏡像的地方。以下介紹一下 Docker Hub哥遮。當(dāng)然不止 docker hub岂丘,只是遠(yuǎn)程的服務(wù)商不一樣,操作都是一樣的
1)鏡像的公有倉庫 Docker Hub
目前 Docker 官方維護(hù)了一個公共倉庫 Docker Hub眠饮。
大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現(xiàn)奥帘。
1-1 注冊
在 https://hub.docker.com 免費注冊一個 Docker 賬號。
1-2 登錄和退出
登錄需要輸入用戶名和密碼仪召,登錄成功后寨蹋,我們就可以從 docker hub 上拉取自己賬號下的全部鏡像。
目前 Docker 官方維護(hù)了一個公共倉庫 Docker Hub扔茅。
大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現(xiàn)已旧。
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組件,我們可以用它來構(gòu)建我們的私有鏡像倉庫召娜。
安裝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]#
查看容器啟動進(jìn)程
-v /registry:/home/docker-registry:默認(rèn)情況下,會將倉庫存放于容器內(nèi)的/home/docker-registry目錄下秸讹,指定本地目錄掛載到容器胁后。
-p 5000:5000 :端口映射。即本地5000端口嗦枢,映射到registry中的5000端口攀芯。
–restart=always1:在容器退出時總是重啟容器,主要應(yīng)用在生產(chǎn)環(huán)境文虏。
–privileged=true:在CentOS7中的安全模塊selinux把權(quán)限禁掉了侣诺,參數(shù)給容器加特權(quán),不加上傳鏡像會報類似權(quán)限錯誤氧秘。OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)
–name registry:指定容器的名稱年鸳。
為了持久化數(shù)據(jù),將volume掛載到/home/docker-registry
Step3 我們給一個本地鏡像打個標(biāo)簽然后上傳
[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
瀏覽器中打開 出現(xiàn) {} 表示運(yùn)行成功
打包上傳鏡像
瀏覽器驗證
Step 4 另一臺Docker主機(jī)上驗證
[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企業(yè)級開源倉庫
1) Harbor特性
基于角色的訪問控制:用戶和存儲庫是通過“項目”組織的丸相,用戶可以對多個鏡像倉庫統(tǒng)一命名空間擁有不同的權(quán)限搔确。
鏡像復(fù)制:可以基于具有多個Registry實例之間復(fù)制(同步)圖像和圖表。如果出現(xiàn)任何錯誤灭忠,Harbor會自動重試復(fù)制膳算。非常適合于負(fù)載平衡、高可用性弛作、多數(shù)據(jù)中心涕蜂、混合和多云場景。
LDAP/AD支持:Harbor與現(xiàn)有企業(yè)LDAP/AD集成映琳,用于用戶身份驗證和管理机隙,并支持將LDAP組導(dǎo)入Harbor并為其分配適當(dāng)?shù)捻椖拷巧?/p>
鏡像刪除和垃圾收集:鏡像可以刪除,其空間可以回收萨西。
國際化:對多國語言支持(已擁有中文有鹿、英文、德文谎脯、日語和俄文)葱跋;
圖形化用戶界面:用戶可以輕松瀏覽、搜索存儲庫和管理項目穿肄。
審計管理:跟蹤到存儲庫的所有操作年局。
RESTful API:用于大多數(shù)管理操作的RESTful API,易于與外部系統(tǒng)集成咸产。一個嵌入式的Swagger用戶界面可用于探索和測試API矢否。
簡單部署:提供在線和離線安裝程序。此外脑溢,可以安裝到vSphere平臺的(OVA方式)虛擬設(shè)備僵朗。
2)Harbor 組件
proxy:Harbor的組件赖欣,如注冊表、UI和令牌服務(wù)验庙,都位于反向代理之后顶吮。代理將來自瀏覽器和Docker客戶機(jī)的請求轉(zhuǎn)發(fā)到各種后端服務(wù)。
Registry:負(fù)責(zé)存儲Docker鏡像和處理Docker推/拉命令粪薛。由于Harbor需要對映像進(jìn)行訪問權(quán)限控制悴了,Registry將引導(dǎo)客戶機(jī)訪問令牌服務(wù),以便為每個pull或push請求獲取有效的令牌(token)违寿。
-
Core Service:Harbor的核心功能湃交,主要提供以下服務(wù):
UI:提供圖像化的圖形用戶界面,幫助人戶管理鏡像和對用戶授權(quán)藤巢。
webhook: 為了及時獲取registry上images的狀態(tài)變化的情況搞莺,在Registry上配置webhook,把狀態(tài)變化傳遞UI模塊掂咒;
Token令牌服務(wù):負(fù)責(zé)根據(jù)用戶在項目中的角色為每個docker push/pull命令頒發(fā)令牌才沧。如果從Docker客戶機(jī)發(fā)送的請求中沒有令牌,注冊表將把請求重定向到令牌服務(wù)绍刮。
Datebase:為了給core services提供數(shù)據(jù)庫舒服温圆,負(fù)責(zé)儲存用戶權(quán)限、審計日志录淡、Docker image分組信息等數(shù)據(jù)捌木。
Job Services:提供鏡像遠(yuǎn)程負(fù)責(zé)功能,能把本地鏡像同步到其他harbor實例當(dāng)中嫉戚。
Log Collector:為了幫助監(jiān)控Harbor運(yùn)行,負(fù)責(zé)手機(jī)其他組件的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
這一步國內(nèi)不用加速器可能會比較慢!
Docker國內(nèi)阿里云鏡像加速傳送門
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 ...
安裝成功
瀏覽器登錄
用戶名admin 初始密碼Harbor12345