顯示具有 docker 標籤的文章。 顯示所有文章
顯示具有 docker 標籤的文章。 顯示所有文章

2025年11月21日 星期五

VMware Harbor介紹

文 精誠資訊/恆逸教育訓練中心 - 資深講師 王俊城 Anderson Wang

Harbor私庫,是由VMware開發,目前是CNCF【Cloud Native Computing Foundation】維護。用來維護管理container images,提供安全、可控,適合企業環境使用的私庫解決方案。

圖一:Harbor網站介紹-1

圖二:Harbor網站介紹-2

跟另外一個私庫 – docker registry比起來,Harbor的定位跟功能更適合企業環境使用, 以下是 Harbor 與 docker registry 的比較

Harbordocker registry
VMware 開發,交付 CNCF 維護Docker 官方提供
直覺化圖形管理介面需要搭配 registry-web
支援 RBAC (Role Base Access Control)不支援 RBAC 授權管理
支援弱點掃描 plug-in不支援弱點掃描 plug-in
安裝比較複雜部署簡單
企業多租戶環境使用單人或小型團隊使用

表一:Harbor跟docker registry比較

以下就介紹如何安裝部署Harbor

環境是Rocky Linux 9.x,需要先安裝 docker-ce

[root@docker1 ~]# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo【同一行指令】
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
[root@docker1 ~]#
[root@docker1 ~]# ls -l /etc/yum.repos.d/
total 24
-rw-r--r--  1 root root 1919 Jan  2 14:43 docker-ce.repo
-rw-r--r--. 1 root root 6610 Nov  1 11:27 rocky-addons.repo
-rw-r--r--. 1 root root 1165 Nov  1 11:27 rocky-devel.repo
-rw-r--r--. 1 root root 2387 Nov  1 11:27 rocky-extras.repo
-rw-r--r--. 1 root root 3417 Nov  1 11:27 rocky.repo
[root@docker1 ~]#
[root@docker1 ~]# dnf install docker-ce -y
Docker CE Stable - x86_64                                173 kB/s |  61 kB     00:00
Dependencies resolved.
=========================================================================================
    Package                       Arch       Version             Repository            Size
=========================================================================================
Installing:
    docker-ce                     x86_64     3:27.4.1-1.el9      docker-ce-stable      27 M
Installing dependencies:
    containerd.io                 x86_64     1.7.24-3.1.el9      docker-ce-stable      43 M
    docker-ce-cli                 x86_64     1:27.4.1-1.el9      docker-ce-stable     8.0 M
Installing weak dependencies:
    docker-buildx-plugin          x86_64     0.19.3-1.el9        docker-ce-stable      14 M
    docker-ce-rootless-extras     x86_64     27.4.1-1.el9        docker-ce-stable     4.4 M
    docker-compose-plugin         x86_64     2.32.1-1.el9        docker-ce-stable      14 M

Transaction Summary
=========================================================================================
Install  6 Packages

Total download size: 110 M
Installed size: 430 M
Downloading Packages:
(1/6): docker-ce-27.4.1-1.el9.x86_64.rpm                 230 kB/s |  27 MB     02:00
(2/6): docker-buildx-plugin-0.19.3-1.el9.x86_64.rpm      114 kB/s |  14 MB     02:04
(3/6): docker-ce-rootless-extras-27.4.1-1.el9.x86_64.rpm 161 kB/s | 4.4 MB     00:27
(4/6): docker-ce-cli-27.4.1-1.el9.x86_64.rpm             173 kB/s | 8.0 MB     00:47
(5/6): containerd.io-1.7.24-3.1.el9.x86_64.rpm           241 kB/s |  43 MB     03:02
(6/6): docker-compose-plugin-2.32.1-1.el9.x86_64.rpm     307 kB/s |  14 MB     00:45
-----------------------------------------------------------------------------------------
Total                                                    570 kB/s | 110 MB     03:17
Docker CE Stable - x86_64                                 13 kB/s | 1.6 kB     00:00
Importing GPG key 0x621E9F35:
    Userid     : "Docker Release (CE rpm) "
    Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
    From       : https://download.docker.com/linux/centos/gpg
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
    Preparing        :                                                                 1/1
    Installing       : docker-compose-plugin-2.32.1-1.el9.x86_64                       1/6
    Running scriptlet: docker-compose-plugin-2.32.1-1.el9.x86_64                       1/6
    Installing       : docker-buildx-plugin-0.19.3-1.el9.x86_64                        2/6
    Running scriptlet: docker-buildx-plugin-0.19.3-1.el9.x86_64                        2/6
    Installing       : docker-ce-cli-1:27.4.1-1.el9.x86_64                             3/6
    Running scriptlet: docker-ce-cli-1:27.4.1-1.el9.x86_64                             3/6
    Installing       : containerd.io-1.7.24-3.1.el9.x86_64                             4/6
    Running scriptlet: containerd.io-1.7.24-3.1.el9.x86_64                             4/6
    Installing       : docker-ce-rootless-extras-27.4.1-1.el9.x86_64                   5/6
    Running scriptlet: docker-ce-rootless-extras-27.4.1-1.el9.x86_64                   5/6
    Installing       : docker-ce-3:27.4.1-1.el9.x86_64                                 6/6
    Running scriptlet: docker-ce-3:27.4.1-1.el9.x86_64                                 6/6
    Verifying        : containerd.io-1.7.24-3.1.el9.x86_64                             1/6
    Verifying        : docker-buildx-plugin-0.19.3-1.el9.x86_64                        2/6
    Verifying        : docker-ce-3:27.4.1-1.el9.x86_64                                 3/6
    Verifying        : docker-ce-cli-1:27.4.1-1.el9.x86_64                             4/6
    Verifying        : docker-ce-rootless-extras-27.4.1-1.el9.x86_64                   5/6
    Verifying        : docker-compose-plugin-2.32.1-1.el9.x86_64                       6/6

Installed:
    containerd.io-1.7.24-3.1.el9.x86_64
    docker-buildx-plugin-0.19.3-1.el9.x86_64
    docker-ce-3:27.4.1-1.el9.x86_64
    docker-ce-cli-1:27.4.1-1.el9.x86_64
    docker-ce-rootless-extras-27.4.1-1.el9.x86_64
    docker-compose-plugin-2.32.1-1.el9.x86_64

Complete!
[root@docker1 ~]#
[root@docker1 ~]# systemctl start docker
[root@docker1 ~]# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker1 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
        Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
        Active: active (running) since Thu 2025-01-02 14:52:54 CST; 9s ago
TriggeredBy: ● docker.socket
        Docs: https://docs.docker.com
    Main PID: 37103 (dockerd)
        Tasks: 8
        Memory: 25.8M
        CPU: 212ms
        CGroup: /system.slice/docker.service
                └─37103 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.s>

Jan 02 14:52:52 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:52.392261994>
Jan 02 14:52:52 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:52.393861130>
Jan 02 14:52:52 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:52.455078708>
Jan 02 14:52:52 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:52.489173923>
Jan 02 14:52:54 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:54.178443739>
Jan 02 14:52:54 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:54.601115373>
Jan 02 14:52:54 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:54.626563823>
Jan 02 14:52:54 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:54.626713951>
Jan 02 14:52:54 docker1.training.lab dockerd[37103]: time="2025-01-02T14:52:54.686957168>
Jan 02 14:52:54 docker1.training.lab systemd[1]: Started Docker Application Container En>
[root@docker1 ~]#    
  

使用以下shell sript安裝Harbor

#!/bin/bash
# 2025.7.4 Fri Version 0.0.2
#   Rocky Linux 9.x,安裝在 docker1.training.lab
###################################################################
#
# 下載docker-compose
#
curl -L https://github.com/docker/compose/releases/download/v2.38.1/docker-compose-linux-x86_64 > /usr/local/bin/docker-compose
sha256sum /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
/usr/local/bin/docker-compose --version

# 下載harbor離線安裝包
cd /root
curl -LO https://github.com/goharbor/harbor/releases/download/v2.13.1/harbor-offline-installer-v2.13.1.tgz
tar zxvf harbor-offline-installer-v2.13.1.tgz

# 憑證相關
mkdir -p /etc/pki/tls/harbor
cd /etc/pki/tls/harbor

# 產生 CA private key
openssl genrsa -out ca.key 4096

# 產生 CA public key
openssl req -x509 -new -nodes -sha512 -days 3650 \
    -subj "/C=TW/ST=Taiwan/L=Taipei/O=UUU/OU=DKL/CN=docker1.training.lab" \
    -key ca.key \
    -out ca.crt

# 產生 docker.training.lab private key
openssl genrsa -out docker1.training.lab.key 4096

# 產生 docker.training.lab CSR
openssl req -sha512 -new \
    -subj "/C=TW/ST=Taiwan/L=Taipei/O=UUU/OU=DKL/CN=docker1.training.lab" \
    -key docker1.training.lab.key \
    -out docker1.training.lab.csr

# 使用CA private幫CRS sign
openssl x509 -req -sha512 -days 3650 \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in docker1.training.lab.csr \
    -out docker1.training.lab.crt

# docker 需要使用 .cert 副檔名
cp docker1.training.lab.crt docker1.training.lab.cert

# 部署 CA public key for docker
mkdir -p /etc/docker/certs.d/docker1.training.lab
cp /etc/pki/tls/harbor/ca.crt /etc/docker/certs.d/docker1.training.lab/.
cp /etc/pki/tls/harbor/docker1.training.lab.* /etc/docker/certs.d/docker1.training.lab/.

systemctl restart docker

# 客製化的 harbor.yml
cd /root/harbor/
cp harbor.yml.tmpl harbor.yml

cat > harbor.sed <<-EOF
s/^hostname.*/hostname\: docker1.training.lab/g
s/certificate\: \/your\/certificate\/path/certificate\: \/etc\/pki\/tls\/harbor\/docker1.training.lab.crt/g
s/private_key\: \/your\/private\/key\/path/private_key\: \/etc\/pki\/tls\/harbor\/docker1.training.lab.key/g
EOF

sed -i -f harbor.sed /root/harbor/harbor.yml

# 安裝harbor
cd /root/harbor
./install.sh

docker login -u admin -p Harbor12345 https://docker1.training.lab            
  

使用firefox,登入Harbor圖形管理介面

[root@docker1 ~]# firefox https://docker1.training.lab

圖三:Harbor登入畫面-1

圖四:Harbor登入畫面-2

圖五:Harbor登入畫面-3

圖六:Harbor管理畫面

上傳container image到Harbor私庫

[root@docker2 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    c5a012f9cf45   5 years ago   165MB
[root@docker2 ~]#
[root@docker2 ~]# docker tag httpd docker1.training.lab/library/httpd:latest
[root@docker2 ~]# docker push docker1.training.lab/library/httpd:latest
The push refers to repository [docker1.training.lab/library/httpd]
25a92d79dbfe: Pushed
b5432b464616: Pushed
e6699b4fc2e3: Pushed
762ba19e7ef1: Pushed
f2cb0ecef392: Pushed
latest: digest: sha256:d3df077ec2ddbe0a62279c672b9c792055b96f6d22ed1e45371bcd70393730f9 size: 1367
[root@docker2 ~]#            
 

到Harbor圖形管理介面確認是否上傳成功?

圖七:確認是否上傳container image-1

圖八:確認是否上傳container image-2

檢查是否可以從Harbor私庫,下載container image

[root@docker2 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@docker2 ~]#
[root@docker2 ~]# docker pull docker1.training.lab/library/httpd
Using default tag: latest
latest: Pulling from library/httpd
68ced04f60ab: Pull complete
35d35f1e0dc9: Pull complete
8a918bf0ae55: Pull complete
d7b9f2dbc195: Pull complete
d56c468bde81: Pull complete
Digest: sha256:d3df077ec2ddbe0a62279c672b9c792055b96f6d22ed1e45371bcd70393730f9
Status: Downloaded newer image for docker1.training.lab/library/httpd:latest
docker1.training.lab/library/httpd:latest
[root@docker2 ~]# docker images
REPOSITORY                           TAG       IMAGE ID       CREATED       SIZE
docker1.training.lab/library/httpd   latest    c5a012f9cf45   5 years ago   165MB
[root@docker2 ~]#        

比較kubernetes從docker公庫、docker registry私庫跟Harbor私庫部署container image從docker公庫部署
kubernetes create deployment test1 --image=nginx

從registry私庫部署
kubernetes create deployment test2 --image=docker1.training.lab:5000/nginx

從Harbor私庫部署
kubernetes create deployment test3 --image=docker1.training.lab/library/httpd

企業的正式環境,肯定是會在內部建置私庫使用,自行維護管理container image,Harbor在多租戶的正式環境是個不錯的選擇。


2022年12月19日 星期一

連Red Hat和Linux、微軟等科技巨頭都熱情擁抱的Docker,你不可不知道的Docker FAQ




Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實作。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,原始碼在 GitHub 上進行維護。Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。

Docker是一個提供作業系統層的虛擬化軟體工具,讓應用程式佈署在容器 (Container) 下,堆疊一層容器管理介面的軟體,提供自動化的機制來管理容器。Docker最主要解決了在一台獨立主機上的作業系統層虛擬化,在大量主機結點的叢集環境時常面臨的需求,如容器的佈署排程,工作負載,結點間的網路設計,負載平衡,高可靠性,資源監控與管理介面等。

Kubernetes(常簡稱為K8s)是用於自動部署、擴展和管理容器化(containerized)應用程式的開源系統。由Google設計,它旨在提供「跨主機集群的自動部署、擴展以及運行應用程式容器的平台」,支持一系列容器工具,包括Docker。Docker和Kubernetes 運作在不同的層次上,Docker提供應用的容器封裝機制,而Kubernetes則控制著Docker 容器的生命周期。透過 Kubernetes 可以幫助 Docker 的應用容器依據資源或規則分配容器到合適的結點上,並可設定副本與負載平衡機制來提升應用的擴展與可靠性。另外Kubernetes 亦對儲存與網路有多種選擇和支援,可滿足大多數的容器應用需求。

Docker常見Q&A:


Docker 可以在 Linux、macOS 和 Windows 上執行嗎?

完全可以!您可以在 Docker 容器中執行 Linux 和 Windows程式。
Docker平台可在 Linux(x86-64、ARM 和許多其他 CPU 架構)和 Windows (x86-64) 上本地執行。Docker Inc. 構建的產品也可讓您在Linux、Windows 和 macOS 上構建和執行容器。

Docker是LXC的升級版或替代品嗎?

Docker 技術不是LXC的替代品。

“LXC”指的是 Linux 內部功能,它允許在安全機制執行中(sandbox)可以控制資源分配。
在這種內部功能的基礎之上,Docker 提供更強大的功能:跨機器的便攜式部署,Docker 定義了一種格式,用於將應用程式及其所有依賴項目捆綁到稱為容器的單個物件中,這個容器可以轉移到任何支援 Docker 的機器上,容器可以在那裡執行,保證應用程式的執行環境,可以使其在開發、測試和生產的過程中是相同的結果。

Docker 容器和 VM 之間有什麼不同?

在StackOverflow 網站中有一篇解釋得很完整,請點選網頁:https://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-virtual-machine

容器退出執行時我會遺失資料嗎?

完全不會!
您的應用程式寫入磁碟的任何資料都會保留在其容器中,直到您明確刪除該容器。即使在容器停止後,容器的文件系統仍然存在。

Docker 容器的規模有多大?

當今世界上一些最大的服務器群都是建立於容器上,Google 和 Twitter 等大型網路佈署以及 Heroku 等平台提供商也都在容器技術上運行,規模為數十萬甚至數百萬個容器。

如何連接 Docker 容器?

目前推薦的連接容器的方法是通過 Docker網路功能。您可以查看有關如何使用 Docker 網路的詳細資訊:https://docs.docker.com/network/bridge/

如何在一個 Docker 容器中運行多個服務?

總體來說我們不鼓勵使用這種方法。
為了最大限度地提高效率和隔離,每個容器都應該只解決一個特定領域的服務。但是,如果您需要在單個容器中運行多個服務,您可以參考這個網頁:https://docs.docker.com/config/containers/multi-service_container/

如何反應有關 Docker 的安全問題?

您可以在這個網頁:https://www.docker.com/products/secure-software-supply-chain/了解Docker安全政策 ,也可以寄信到security@docker.com回報相關的安全問題。

為什麼我必需簽署DCO才能開始使用Docker?

請點選網頁:https://www.docker.com/blog/ 了解更多


想了解更多Docker的問題

還可以到下列網站搜尋相關討論喔!


(資料來源:Docker官網:https://www.docker.com/)


推薦課程: