使用harbor和nexus作為docker registry

陳順吉發表於2019-02-23

容器化的環境下,公司內部使用的映象不可能直接放在 dockerhub 上,更不可能只放在某臺機器上,所以一個公司內部的私有的 docker 映象倉庫(registry)必須存在。

目前來講,docker registry 的實現還蠻多,包括官方的 registry、harbor,以及 nexus 等。

本文會講 nexus 和 harbor 的使用,為什麼要使用兩個而不是其中一個呢?因為它們都有缺陷,兩者合一用起來才完美。

harbor 的優勢很明顯,特別是可以自建資料夾進行分組這點就非常好。其實說實話,作為一個私有的映象倉庫,harbor 已經做得很好的了,唯一的缺點是它無法幫你下載映象。

也可能並不是缺點,只是定位不同,而在這一點上 nexus 就很好的做到了,但是 nexus 除了這點外,其他好像沒什麼值得稱道的地方了。

為什麼需要 Registry 幫你下載映象呢?因為在 kubernetes 環境下,你肯定有去公網拉映象的需求,無論是官方還是非官方。你不可能因為這個而特地給你的所有 node 節點開通外網訪問吧,這樣風險太多且不可控。在我看來,整個 kubernetes 叢集都不能訪問外網。

這時 nexus 就有了用武之地了,當你需要拉公網映象的時候,你只要向它發起請求,它如果本地沒有,就會自動去你配置的映象倉庫下載,下載完成之後先在本地快取一份,然後傳送給你。

你甚至不用給 nexus 開通外網,只需要在一臺可以訪問外網的機器上搭建一個代理服務就行,讓 nexus 通過代理去下載。那這方面的內容,我之前的文章中已經給出瞭解決方法,歡迎檢視。

好了,關於 nexus 和 harbor 對比的簡單說明就這麼多了。那麼本文的目標就是搭建 nexus 和 harbor,並使用免費可靠的 https 證照來開啟 https。

nexus

nexus 最初是給 java 用的,後來慢慢發展,可以作為眾多軟體的倉庫,比如 pipy、yum 等,在 3.0 版本中更是加入了 docker registry 的支援,因此我們要使用的至少是 3.0 版。

nexus 提供了 web 介面,預設監聽 8081 埠,我們幾乎所有的操作都可以在 web 介面上完成。當 docker 連線 nexus 時,預設通過 https,但是這只是針對 docker 倉庫的埠(需要配置),而不是針對 web 介面。

也就是說,docker 並不會連線 web 介面所監聽的 8081 埠,因此我們無需對 web 介面進行 https 配置。但是話又說回來,反正都要配 https 了,那將 web 介面進行 https 也只是順手的事。

說了這麼多,我們正式開始搭建。nexus 版本從 3 開始才支援 docker registry,這點需要注意,我們就直接下載最新版就好了。你可以直接訪問官方文件來全面瞭解它。

安裝

nexus 支援 docker 部署,我們這裡就不用了,直接使用一臺 Linux(CentOS7)搞起。

首先需要安裝 jdk,官方說不支援 openjdk,只支援 oracle jdk。那麼直接去 oracle 官網下載最新版的 rpm 包,放到伺服器上使用 rpm -ivh 進行安裝即可:

curl -v -j -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.rpm >jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
複製程式碼

下載 jdk 完成後會出現下面這樣資訊,但這並不是報錯。

* Connection #0 to host download.oracle.com left intact
複製程式碼

接著下載並解壓 nexus:

cd /opt
wget http://download.sonatype.com/nexus/3/nexus-3.15.2-01-unix.tar.gz
tar xf nexus-3.15.2-01-unix.tar.gz
ln -s nexus-3.15.2-01/ nexus
複製程式碼

當我們使用 root 使用者啟動時,雖然也能成功啟動,但是它會丟擲警告資訊:

# cd nexus/bin
# ./nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
複製程式碼

因此我們需要建立一個普通使用者來啟動它:

# ./nexus stop
# groupadd -g 1111 nexus
# useradd -u 1111 -g 1111 nexus
# chown -R nexus. /opt/sonatype-work/
# su - nexus
$ /opt/nexus/bin/nexus start
複製程式碼

可以驗證下它是否啟動成功:

$ ss -tnl | grep 8081
LISTEN     0      50           *:8081                     *:*
複製程式碼

簡單配置

我們可以在 /opt/nexus/bin 下面看到一個 nexus.vmoptions 的配置檔案,通過這個配置檔案可以直接 jvm 引數。

$ cat nexus.vmoptions
-Xms1200M
-Xmx1200M
-XX:MaxDirectMemorySize=2G
-XX:+UnlockDiagnosticVMOptions
-XX:+UnsyncloadClass
-XX:+LogVMOutput
-XX:LogFile=../sonatype-work/nexus3/log/jvm.log
-XX:-OmitStackTraceInFastThrow
-Djava.net.preferIPv4Stack=true
-Dkaraf.home=.
-Dkaraf.base=.
-Dkaraf.etc=etc/karaf
-Djava.util.logging.config.file=etc/karaf/java.util.logging.properties
-Dkaraf.data=../sonatype-work/nexus3
-Djava.io.tmpdir=../sonatype-work/nexus3/tmp
-Dkaraf.startLocalConsole=false
複製程式碼

這裡的相對路徑是相對於 nexus 本身,而非 nexus/bin。我們可以看到它會自動在 nexus 目錄的父目錄下生成 sonatype-work 目錄,用來放配置檔案、資料,還有日誌等,你可以通過修改配置檔案來改變它的位置。

前面使用 root 使用者啟動之後生成的這個目錄的許可權是 root,再使用普通使用者啟動的話,普通使用者會因為沒有許可權往裡面的日誌檔案中寫資料而導致啟動失敗,所以只是上面要修改這個目錄許可權的原因。

配置 https

此時你可以直接使用瀏覽器訪問 http://ip:8081 來開啟它的 web 介面了,之後我們所有的操作都會在 web 介面上進行。在配置之前,我們先將 https 配置上去。之所以使用 https,是因為 docker 訪問 registry 預設就是使用 https,如果使用 http 也行,但是會增加很多操作。

nexus 使用 https 的方式有兩種,一種是直接配置 nexus 使用 https,另一種就是前面使用 nginx 配置 https,然後反向代理到後端的 nexus,其中客戶端和 nginx 之間使用 https,nginx 和 nexus 之間則使用 http。而不管是從易用性還是實用性的角度,我們都應該使用 nginx。

其實我們要使用 https 的地方在於 docker 和 registry 之間,而非 nexus 的 web 介面。docker 和 registry 之間通訊會使用另外的埠,而且 pull 和 push 埠都不一樣,這個下面會講到。

但是既然都要配 https 了,我們將 web 訪問也配上 https 也只是順手的事,反正證照都是使用同一個,而且使用 https 逼格更高。

OK,我們先安裝 nginx。

# cat >/etc/yum.repos.d/nginx.repo <<'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
EOF
# yum install -y nginx
複製程式碼

如果說你的伺服器不能訪問外網,可以參考我前面寫的一篇文章,教你如何在能夠上網的機器上搭建代理服務,讓其他內網伺服器通過它來上網。那如果說你連一臺能夠上網的機器都沒有,那你也可以通過上面的 nginx URL 將 rpm 包下載下來安裝即可,它沒有任何依賴。

要使用 https 首先得有證照,這方面可以參考該系列的上一篇文章,很容易就能夠獲取到安全可靠的 https 證照。那我這裡就使用文章中已經申請下來的 *.ntpstat.com 這個萬用字元證照,準備使用 registry.ntpstat.com 作為 nexus 的域名。

那直接開始修改 nginx 配置檔案。

# vim /etc/nginx/nginx.conf
# 替換 http 上下文的內容
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    proxy_send_timeout 120;
    proxy_read_timeout 300;
    proxy_buffering    off;
    keepalive_timeout  5 5;
    tcp_nodelay        on;
    sendfile        on;
    #tcp_nopush     on;
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

# 新增 https 配置
# vim /etc/nginx/conf.d/ssl.conf
server {
    listen   *:443;
    server_name  registry.ntpstat.com;

    # 允許大檔案上傳
    client_max_body_size 1G;

    # 對大於 1G 檔案的下載進行優化
    #proxy_max_temp_file_size 2G;

    ssl on;
    ssl_certificate      /etc/nginx/cert/fullchain.pem;
    ssl_certificate_key  /etc/nginx/cert/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8081/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto "https";
    }
}
複製程式碼

檢查配置檔案沒有問題之後,就可以啟動 nginx 了:

# nginx -t
# systemctl start nginx
複製程式碼

接著在本地配置 hosts 檔案,將 registry.ntpstat.com(換成你的域名)對映到伺服器所在 ip,然後在瀏覽器中直接使用 https://registry.ntpstat.com(換成你的域名)進行訪問。可以看到,https 配置成功。

使用harbor和nexus作為docker registry

配置 blob stores

web 頁面配置 https 只是小試牛刀,主要還是為了證明證照沒有問題,當然也是為了提升逼格。那麼接下來就要配置 docker 倉庫了,而這之前我們先配置倉庫使用的儲存,將不同的倉庫的資料放在不同的目錄下,方便管理。

首先,在 nexus 的 web 介面上點選右上角的 Sign in,使用預設 admin/admin123 進行登入,登入成功後,會出現一個小齒輪的圖示,點選進去之後就可以進行配置了。

我們首先點選 Repository 下面的 Blob Stores,點選 create blob store 建立一個新的 blob store。

  • Type:file
  • Name:docker-hub
  • Enable Soft Quota:限制目錄大小,有興趣可以勾選;
  • Path:自動補全,無需理會。

使用harbor和nexus作為docker registry

建立完成後,再建立一個:

  • Type:file
  • Name:docker-private

使用harbor和nexus作為docker registry

兩個儲存路徑就建好了,一個是給外部映象使用的,另一個給公司內部映象使用的。但是基本上公司內部的映象會放在 harbor 中,因為更好分類。

配置內部 docker 倉庫

同樣是設定介面,我們選擇 Blob Stores 的下一個選項 Repositories,我們會在其下配置 docker 的映象倉庫。

首先點選 Create repository -> docker(hosted):

使用harbor和nexus作為docker registry

  • Name:docker-private;
  • Online:勾選;
  • HTTP:勾選,並輸入 8083 埠(這個埠隨意,後面對上就行);
  • HTTPS:不要管,https 我們會在 nginx 上面配;
  • Allow anonymous docker pull:看需要了,如果你想拉映象的時候不需要登入就勾選,我不勾選;
  • Enable Docker V1 API:如果你使用的 docker 版本夠新的話,可以不勾選,我勾了;
  • Blob store:選擇之前建立的 docker-private;
  • Strlct Content Type Validation:貌似是要驗證 push 的映象的格式,我勾了;
  • Deployment policy:是否允許部署和更新映象啥的,沒弄懂,我選了 Allow redeploy
  • Available cleanup policles:映象的清除策略,因為我們還沒建立,因此沒得選,就先不選吧;

這個 repository 就是用來放公司內部的映象,在我們的計劃中它其實用不到,因為可以用 harbor 來完成,但是難免有人會用到,因此一併建立了。下次再建立一個 repository,這個倉庫用來存放從 dockerhub 下載下來的官方映象。

Create repository -> docker(proxy):

使用harbor和nexus作為docker registry

  • Name:docker-hub;
  • Online:勾選;
  • remote storage:https://registry-1.docker.io,這是 dockerhub 的地址;
  • Docker Index:Use Docker Hub;
  • Auto blocking enabled:勾選;
  • Maximum component age:快取時間自己定就好,預設 1440 為一天;
  • Maximum metadata age:使用預設值即可;
  • Blob store:選擇之前建立的 docker-hub;
  • Not found cache enabled:映象沒有找到是否快取,預設快取,按預設來;
  • Not found cache TTL:快取時長使用預設值即可;

沒有提到的選項不用管,然後就建立完畢了。使用它可以從 docker hub 上下載映象了,下載的方式下面會講到。它應該還可以配置從 k8s.gcr.io 下載,這裡的映象是 docker hub 中沒有的,有興趣的可以試試。

接下來還得建立一個 repository,這個倉庫用來分組,將上面兩個倉庫合併在一起,通過都一個埠來同時訪問它們。

Create repository -> docker(group):

使用harbor和nexus作為docker registry

  • Name:docker-group;
  • Online:勾選;
  • HTTP:8082;
  • Allow anonymous docker pull:我沒有勾選,需要認證才能下載映象;
  • Enable Docker V1 API:如果你使用的 docker 版本夠新的話,可以不勾選,我勾了;
  • Blob store:它只是一個組,不存放任何東西,因此使用 default 即可;
  • Member repositories:將 docker-private 和 docker-hub 放到右邊;

建立完畢之後,nexus 會自動啟動 8082 和 8083 埠。其中 8082 是用來 pull 私有倉庫和 dockerhub 映象的,8083 用來 push 映象到私有倉庫。現在要做的就是使用 nginx 為這些埠配置 https。

我們分別通過 2222 和 3333 埠來代理 8082 和 8083,並且在 2222 和 3333 上啟用 https,因此 docker 需要連線 2222 和 3333 埠。

# vim /etc/nginx/conf.d/nexus.conf
server {
    listen 2222 ssl;
    server_name registry.ntpstat.com;

    ssl_certificate /etc/nginx/cert/fullchain.pem;
    ssl_certificate_key /etc/nginx/cert/privkey.pem;
    ssl_session_cache shared:SSL:50m;

    location / {
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_redirect          http:// https://;
        proxy_pass              http://127.0.0.1:8082;
        client_max_body_size       1024m;
        client_body_buffer_size    128k;
    }
}

server {
    listen 3333 ssl;
    server_name registry.ntpstat.com;

    ssl_certificate /etc/nginx/cert/fullchain.pem;
    ssl_certificate_key /etc/nginx/cert/privkey.pem;
    ssl_session_cache shared:SSL:50m;

    location / {
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_redirect          http:// https://;
        proxy_pass              http://127.0.0.1:8083;
        client_max_body_size       1024m;
        client_body_buffer_size    128k;
    }
}
複製程式碼

驗證是否配置成功

配置完成之後就可以使用 docker login 命令驗證了。在此之前,如果你係統上配置的 dns 無法解析 registry.ntpstat.com(替換成你的),你還需要將之新增到 hosts 檔案中。這裡略過,直接驗證。

# docker login -u admin -p admin123 registry.ntpstat.com:2222
# docker login -u admin -p admin123 registry.ntpstat.com:3333
複製程式碼

只要出現 Login Succeeded 表示驗證 ok,沒出現自然就是失敗了。

如果驗證失敗,你可以在 /etc/docker/daemon.json 中下面這行,IP 換成 nexus 的 ip 或主機名都可以。

"insecure-registries" : ["IP:8082", "IP:8083"]
複製程式碼

檔案修改完畢之後,使用 python -mjson.tool </etc/docker/daemon.json 來驗證格式是否正確,然後重啟 docker。

這是使用 http 而非 https 的方式直接連線 nexus,如果驗證成功,那就是你 nginx 配置有問題。當然證照肯定沒有問題,不然你 https 訪問 web 介面就一定不會是安全的。如果驗證失敗,那就是配置有問題了,照著上面仔細再配一遍吧。

# docker login -u admin -p admin123 IP:8082
# docker login -u admin -p admin123 IP:8083
複製程式碼

如果你使用 ip 的方式登入成功了,但是使用 https 死活都登入不了,且 nginx 配置不存在問題的情況下,可能是你 docker 使用了代理,docker login 的請求轉發到代理伺服器上去了。

此時你要檢查 docker systemd service 檔案以及同一目錄下的 docker.service.d 目錄下的所有檔案,看看這些檔案中是否存在 HTTP_PROXY 這樣的配置,如果有,註釋後重啟 docker 再驗證。

這種情況可以通過抓包發現。

下載 dockerhub 映象

驗證成功之後就可以下載映象了,nexus 可以幫我們從 dockerhub 上面下載映象,前提是你的 nexus 能夠訪問 dockerhub。如果不能也不要緊,搭建一個代理服務吧。那如果說你連可以上網的機器都沒有,那就沒辦法了,你可以直接使用 harbor 了。

nexus 配置代理的方法也很簡單,管理員登入 -> 點選小齒輪圖示 -> System -> HTTP -> 勾選 HTTP proxy -> 新增主機和埠 -> Save。

這樣一來,你 nexus 所有的 http/https 請求都會通過這個代理進行。當然,如果有不需要代理的 ip 你可以填在 Hosts to exclude from HTTP/HTTPS proxy 中。

現在你的 nexus 能上網了,那麼先下載個 busybox 映象吧。前面提到過,映象下載使用 2222 埠。

# docker login -u admin registry.ntpstat.com:2222
# docker pull registry.ntpstat.com:2222/busybox
Using default tag: latest
latest: Pulling from busybox
697743189b6d: Pull complete
Digest: sha256:4415a904b1aca178c2450fd54928ab362825e863c0ad5452fd020e92f7a6a47e
Status: Downloaded newer image for registry.ntpstat.com:2222/busybox:latest
複製程式碼

如果你允許匿名 pull 就不需要登入。

只需要將映象名寫在 registry.ntpstat.com:2222/ 的後面即可,nexus 本地如果沒有,就會去 dockerhub 上下載。當然,這麼下載下來的映象名自然也就是很長的一串了。

上傳映象

上傳映象使用 3333 埠,我們將剛剛下載下來的映象上傳。

# docker login -u admin registry.ntpstat.com:3333
# docker tag registry.ntpstat.com:2222/busybox registry.ntpstat.com:3333/busybox:test
# docker push registry.ntpstat.com:3333/busybox:test
The push refers to repository [registry.ntpstat.com:3333/busybox]
adab5d09ba79: Pushed
test: digest: sha256:4415a904b1aca178c2450fd54928ab362825e863c0ad5452fd020e92f7a6a47e size: 527
複製程式碼

push 必須登入。我這裡給 busybox 加了個 tag,只是為了測試,沒有任何作用。那麼關於 nexus 作為 docker 倉庫的內容也就這麼多了,接下來配置 harbor。

harbor

在安裝使用 harbor 之前,如果你的 harbor 和 nexus 都安裝在同一臺伺服器上,你需要將代理 nexus 的 nginx 的 80 和 443 埠改掉,因為 harbor 會監聽這兩個埠。其實這樣一來的話,nginx 的 80 和 443 都可以不用了,直接使用 nexus 的 8081 訪問即可。

安裝

harbor 是 VMware 開源的 registry,也是一款大眾熟知的產品,它的 GitHub 地址在此。它的安裝只能通過 docker 進行,因此你得首先安裝 docker。

# yum install -y yum-utils device-mapper-persistent-data lvm2
# cat > /etc/yum.repos.d/docker-ce.repo <<'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
# yum install docker-ce
# systemctl enable docker
# systemctl start docker
# systemctl status docker
複製程式碼

你還得安裝 docker-compose,它用來定義和管理由多個容器構成的應用。很顯然,harbor 需要執行多個容器。

curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
複製程式碼

以上前置條件都完成之後,下載 harbor 的離線包:

wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.1.tgz
複製程式碼

貌似被牆了,可以通過國內映象下載,但是從我寫這篇文章時發現國內映象的最新版本才 1.5 而非 1.7。這次操作還是通過 1.7 進行,1.5 應該和 1.7 安裝起來應該沒啥區別。當然,作為一名技術人,基礎的**牆手段應該還是應該具備的。

下載完成後先解壓:

tar xf harbor-offline-installer-v1.7.1.tgz
mv harbor /opt
cd harbor
複製程式碼

配置並啟動

在修改配置檔案前,我們需要首先獲得 https 證照,https 證照我們們已經獲取了,這裡就不多提了。我們先看看它的 compose 配置,它定義了 harbor 所需所有映象的配置。

vim docker-compose.yml
複製程式碼

可以看到它將資料都儲存在 /data 目錄下,如果你想要改的話,可以使用 sed 直接替換。我這裡將其改為了 /opt/data

# 先檢視改的對不對
sed -n 's@- /data/@- /opt/data/@gp' docker-compose.yml

# 確認 ok 之後,開幹
sed -i 's@- /data/@- /opt/data/@g' docker-compose.yml

# 將目錄建立出來
mkdir /opt/data
複製程式碼

從 yml 檔案我們還可以看到,它的 https 以及 web 伺服器都是配置在 nginx 容器中的,且它是將 harbor/common/config/nginx 下面的所有檔案都作為 nginx 容器的配置檔案。這個目錄目前並不存在,執行 prepare 指令碼會建立。

其他的有想改的可以動手改,這裡就不改了。接著修改配置檔案。

# vim harbor.cfg

hostname = registry.ntpstat.com
# 直接 https 搞起
ui_url_protocol = https
# 我們有證照,不需要生成
customize_crt = off
# 指定證照檔案
ssl_cert = /etc/nginx/cert/fullchain.pem
ssl_cert_key = /etc/nginx/cert/privkey.pem
# 因為我這裡改了它的儲存目錄,所以這裡也要改
secretkey_path = /opt/data
# 管理員密碼
harbor_admin_password = Harbor12345
複製程式碼

還有其他的配置,比如郵件以及 ldap 的,有興趣的可以修改,這裡就略過了。

修改完成之後,執行 prepare 指令碼:

# ./prepare
Generated and saved secret to file: /opt/data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/core/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/config.yml
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/registryctl/env
Generated configuration file: ./common/config/core/app.conf
Copied configuration file: ./common/config/coreprivate_key.pem
Copied configuration file: ./common/config/registryroot.crt
The configuration files are ready, please use docker-compose to start the service.
複製程式碼

可以看到,它生成了很多的配置檔案,其中就有 nginx 的,它會將我們在配置檔案中指定的證照複製到 common/config/nginx/cert/ 目錄下,這樣容器內的 nginx 就能夠載入到了。你可以使用 md5sum 命令來檢測兩個證照檔案是否一致。

然後就可以執行 install.sh 了,其實執行這個指令碼的過程中它會自動執行上面執行的 prepare 指令碼:

# sh install.sh
...
✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://registry.ntpstat.com.
For more details, please visit https://github.com/goharbor/harbor .
複製程式碼

這種安裝方式不會安裝 Notary/Clair,如果要安裝它們,可以給 install.sh 傳遞 --with-notary--with-clair 引數。

你如果還希望使用 harbor 作為 chart 倉庫,為 helm 提供支援的話,可以給 install.sh 傳遞 --with-chartmuseum

安裝成功之後,會出現上面結尾的資訊,然後瀏覽器直接訪問就行了,我這裡訪問的是 https://registry.ntpstat.com,你們訪問你們的。

然後就開啟了 harbor 的 web 介面了,預設使用 admin/Harbor12345 直接登入。你可以直接建立不同的專案,也就是所謂的不同的目錄,然後將不同的映象放到不同的目錄下,這樣分類起來就很方便了,這也是 nexus 不具備的地方。

上傳映象

預設只有一個 library 專案,我們現在往裡面上傳一個映象來了解它的操作。

# docker login -u admin -p Harbor12345 registry.ntpstat.com
# docker tag registry.ntpstat.com:2222/busybox registry.ntpstat.com/library/busybox
# docker push registry.ntpstat.com/library/busybox
The push refers to repository [registry.ntpstat.com/library/busybox]
adab5d09ba79: Pushed
latest: digest: sha256:4415a904b1aca178c2450fd54928ab362825e863c0ad5452fd020e92f7a6a47e size: 527
複製程式碼

push 完成後,就可以在 library 下面看到 busybox 這個映象了。harbor 和 nexus 不同,它上傳和下載映象都使用同一個埠。

pull 映象就很簡單了,將上面的 push 換成 pull 就行了,而且只要專案的訪問級別為公開,那麼 pull 的時候都不用 login,這樣在寫指令碼的時候會方便一點。當然,不公開也沒啥關係,無非就多了個登入操作而已,在 k8s 中很容易做到。

停止和啟動

我們之前執行 install.sh 的時候自動將 harbor 拉起來了,總不能每次重啟都執行 install.sh 對吧。

它的停止和啟動的方式如下:

docker-compose stop
docker-compose start
複製程式碼

如果你想要改變 harbor 配置,你應該使用上面的命令先停止 harbor,然後修改 harbor.cfg,執行 prepare 生成新的配置,然後啟動 harbor。整個過程如下:

# docker-compose down -v
# vim harbor.cfg
# prepare
# docker-compose up -d
複製程式碼

好了,這篇文章就寫到這裡了,這只是個掃盲文章,更深入的東西就要靠你們自己研究了。

相關文章