CoreOS容器云企業(yè)實戰(zhàn)(4)--Docker鏡像以及企業(yè)級Harbor倉庫管理

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)已旧。

image.png

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澈圈,供日后分析彬檀。

image

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載瞬女,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者窍帝。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诽偷,隨后出現(xiàn)的幾起案子坤学,更是在濱河造成了極大的恐慌,老刑警劉巖报慕,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深浮,死亡現(xiàn)場離奇詭異,居然都是意外死亡眠冈,警方通過查閱死者的電腦和手機(jī)飞苇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人布卡,你說我怎么就攤上這事雨让。” “怎么了忿等?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵栖忠,是天一觀的道長。 經(jīng)常有香客問我贸街,道長庵寞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任匾浪,我火速辦了婚禮皇帮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛋辈。我一直安慰自己属拾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布冷溶。 她就那樣靜靜地躺著渐白,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逞频。 梳的紋絲不亂的頭發(fā)上纯衍,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音苗胀,去河邊找鬼襟诸。 笑死,一個胖子當(dāng)著我的面吹牛基协,可吹牛的內(nèi)容都是我干的歌亲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼澜驮,長吁一口氣:“原來是場噩夢啊……” “哼陷揪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杂穷,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悍缠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耐量,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飞蚓,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年拴鸵,在試婚紗的時候發(fā)現(xiàn)自己被綠了玷坠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜗搔。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖八堡,靈堂內(nèi)的尸體忽然破棺而出樟凄,到底是詐尸還是另有隱情,我是刑警寧澤兄渺,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布缝龄,位于F島的核電站,受9級特大地震影響挂谍,放射性物質(zhì)發(fā)生泄漏叔壤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一口叙、第九天 我趴在偏房一處隱蔽的房頂上張望炼绘。 院中可真熱鬧,春花似錦妄田、人聲如沸俺亮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚曾。三九已至,卻和暖如春启具,著一層夾襖步出監(jiān)牢的瞬間本讥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工鲁冯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拷沸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓薯演,卻偏偏與公主長得像堵漱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涣仿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容