在現代軟體開發流程中,容器化技術已成為不可或缺的一環。Docker 作為領先的容器化平台,提供了一種輕量級、可移植且一致的環境,讓開發者可以輕鬆封裝、佈署和管理應用程式。本文將引導讀者在 Ubuntu 系統上安裝 Docker,並示範如何使用 Docker Hub 下載和執行 Nginx 容器映像檔,作為建立 Web 服務的基礎。過程中,我們會詳細說明每個步驟的指令和輸出結果,並解釋其技術含義,讓讀者能更深入地理解 Docker 的運作原理。同時,我們也會探討容器映像檔的大小和安全性等重要議題,提供實務上的最佳建議。
Docker 安裝與設定
前言
Docker 是一種流行的容器化技術,允許開發者將應用程式及其依賴項封裝到一個可移植的容器中。在本章中,我們將介紹如何在 Ubuntu 系統上安裝 Docker 並進行基本設定。
檢查系統狀態
在安裝 Docker 之前,我們先來檢查系統的當前狀態。使用以下命令來掃描正在執行的程式、Linux 映像檔以及檢查核心版本。
shiva@wks01:~$
內容解密:
這行命令提示符號表示目前使用者為 shiva
,主機名稱為 wks01
,目前位於家目錄 (~
)。
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
shiva@wks01:~$
內容解密:
這段輸出表示系統掃描了正在執行的程式和 Linux 映像檔後,確認目前的核心版本是最新的。沒有需要重新啟動的服務、容器或使用者工作階段,也沒有執行過時虛擬機器管理程式 (qemu
) 的虛擬機器。
安裝 Docker
接下來,我們需要確認 Docker 是否已經安裝在系統上。可以使用以下命令檢查 Docker 是否已安裝。
shiva@wks01:~$ dpkg -l docker.io
內容解密:
dpkg -l
命令用於列出系統上已安裝的套件。docker.io
是 Docker 套件的名稱。輸出結果顯示 Docker 已安裝,版本為 20.10.12-0ubuntu4
,適用於 amd64
架構。
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii docker.io 20.10.12-0ubuntu4 amd64 Linux container runtime
shiva@wks01:~$
內容解密:
輸出結果表明 Docker 已安裝並且狀態正常 (ii
表示已安裝)。
啟動 Docker 服務
確認 Docker 已安裝後,我們需要啟動 Docker 服務並檢查其狀態。
shiva@wks01:~$ sudo service docker start
shiva@wks01:~$ service docker status
內容解密:
第一行命令使用 sudo
來啟動 Docker 服務。第二行命令檢查 Docker 服務的狀態。
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-01-19 03:34:56 UTC; 1min 42s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 2637 (dockerd)
Tasks: 7
Memory: 29.8M
CPU: 226ms
CGroup: /system.slice/docker.service
└─2637 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Jan 19 03:34:56 wks01 dockerd[2637]: time="2023-01-19T03:34:56.066391104Z" level=info msg="API listen on /run/docker.sock"
內容解密:
輸出結果顯示 Docker 服務已啟動並正在執行 (Active: active (running)
)。主要程式 ID (Main PID
) 為 2637
,對應的執行檔是 /usr/bin/dockerd
。
設定使用者許可權
由於 Docker 需要 root 許可權執行,我們需要將目前使用者加入 Docker 群組,以便能夠在不使用 sudo
的情況下執行 Docker 命令。
shiva@wks01:~$ sudo usermod -a -G docker shiva
shiva@wks01:~$ newgrp docker
內容解密:
第一行命令使用 usermod
將使用者 shiva
加入 Docker 群組。第二行命令使用 newgrp
切換目前工作階段到 Docker 群組,無需重新登入。
shiva@wks01:~$ id
uid=1000(shiva) gid=112(docker) groups=112(docker),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),1000(shiva)
shiva@wks01:~$
內容解密:
輸出結果顯示目前使用者的群組資訊。可以看到 shiva
使用者已成功加入 Docker 群組 (gid=112(docker)
)。
執行 Hello-World 容器
現在,我們已經完成了 Docker 的安裝和基本設定,可以執行一個簡單的 Hello-World 容器來驗證 Docker 是否正常運作。
shiva@wks01:~$ docker run hello-world
內容解密:
這行命令指示 Docker 執行一個名為 hello-world
的容器。如果本地沒有該映像檔,Docker 會自動從預設的容器儲存函式庫下載。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
內容解密:
輸出結果顯示 Docker 成功下載並執行了 hello-world
容器。這個過程包括了與 Docker 守護程式的通訊、從 Docker Hub 下載映像檔、建立容器並執行其中包含的可執行檔。
Docker 未來發展方向
Docker 作為容器化技術的領頭羊,將繼續在雲端運算、微服務架構和 DevOps 領域發揮重要作用。未來,我們可以期待 Docker 在以下幾個方面有更多的發展:
- 安全性增強:隨著容器化技術的普及,安全性將成為一個越來越重要的議題。Docker 將繼續改進其安全特性,以保護使用者的容器化應用。
- 效能最佳化:Docker 將持續最佳化其效能,以提供更快的容器啟動速度和更低的資源消耗。
- 與 Kubernetes 的整合:作為容器協調的標準,Kubernetes 將繼續與 Docker 緊密整合,提供更完善的容器管理功能。
- 多平台支援:Docker 將繼續擴充套件其對不同平台的支援,包括 Windows、macOS 和各種 Linux 發行版。
使用 Docker 的容器基礎知識
在上一章中,我們學習瞭如何設定工作站以開始使用容器,安裝 Docker,並執行了第一個容器應用程式——hello-world 容器和一個網頁伺服器——使用標準的 nginx 容器映像,以及如何將容器上的埠對映到本地工作站,以便存取容器提供的服務。在本章中,我們將進一步學習更多的容器基本命令和概念,使用 Docker。
尋找預建容器
就像作業系統提供者提供包含各種應用程式套件的套件倉函式庫一樣,容器可以從各種倉函式庫中獲得,例如 Docker Hub。在本練習中,我們將使用 Docker Hub,但還有許多其他倉函式庫可供選擇。
請存取 https://hub.docker.com,您可以看到圖 3-1 所示的 Docker Hub 登入頁面。
圖 3-1:Docker Hub 登入頁面
此圖示顯示 Docker Hub 的首頁,用於搜尋和查詢容器映像。
圖表翻譯: 圖 3-1 展示了 Docker Hub 的登入頁面,這是查詢和管理容器映像的平台。
您可以註冊一個免費帳戶(個人使用免費)。在左上角的搜尋欄中輸入 nginx
,然後選擇第一個結果「nginx」,它屬於已驗證內容,這將帶您到達如圖 3-2 所示的對話方塊。
安全注意事項
與任何公共倉函式庫一樣,任何人都可以釋出映像;在下載和執行來自未知來源的映像時,請務必謹慎。在 Docker 倉函式庫中,已知的良好映像具有「DOCKER 官方映像」徽章。
docker run nginx
內容解密:
此命令用於執行一個名為 nginx
的容器。Docker 將自動從 Docker Hub 下載 nginx
映像(如果本地尚未存在),然後執行它。這個命令展示了 Docker 的基本使用方法,即從遠端倉函式庫取得映像並啟動容器。
docker run -p 80:80 nginx
內容解密:
此命令與前一個命令類別似,但增加了埠對映引數 -p 80:80
。這意味著將本地主機的 80 埠對映到容器內的 80 埠,使得可以透過存取本地主機的 80 埠來存取容器內執行的 nginx 服務。
組態容器
在上一章中,我們執行了命令 docker run nginx
。背後發生了什麼?為什麼我們必須對映埠 80:80?如果我想執行不同的應用程式,我在哪裡找到容器映像?我們將在這裡更深入地探討這些主題。
執行容器
要執行一個容器,您可以使用 docker run
命令,後面跟著容器映像的名稱。如果容器映像在本地不存在,Docker 將自動從遠端倉函式庫下載它。
docker run -it ubuntu bash
內容解密:
此命令用於以互動模式執行一個 Ubuntu 容器,並啟動一個 bash shell。-it
引數允許與容器進行互動,ubuntu
是容器映像的名稱,bash
是要在容器內執行的命令。
您的任務
無論您的工作站型別是什麼,請確保 Docker 已設定並執行,就像我們在這裡所做的那樣,並且執行兩個示例容器,並確保我們收到預期的結果。接下來的章節將建立在我們在這裡所設定的基礎上。
graph LR A[開始] --> B[搜尋容器映像] B --> C[下載容器映像] C --> D[執行容器] D --> E[組態容器] E --> F[存取容器服務]
圖表翻譯: 此圖表展示了使用 Docker 容器的基本流程,從搜尋容器映像到存取容器提供的服務。
重點整理
- 使用 Docker Hub 尋找和下載容器映像
- 使用
docker run
命令執行容器 - 組態容器以存取它們提供的服務
- 使用埠對映來存取容器內的服務
隨著容器技術的不斷發展,我們可以預期會有更多的工具和平台出現,以簡化容器的管理和協調。未來的容器技術可能會更加註重安全性和可移植性,並且可能會出現更多的自動化和智慧化工具,以幫助開發人員和維運人員更有效地管理容器。
安全性考量
在使用容器時,安全性是一個非常重要的考量。我們需要確保容器映像的安全性,以及容器執行時的安全性。這包括使用可信的容器映像,避免使用未知來源的映像,並且定期更新和修補容器映像中的漏洞。
使用 Docker 探索容器基礎:下載與執行 Nginx 容器映像檔
在上一章中,我們學習瞭如何使用 Docker 基本指令來操作容器。本章節將探討如何使用 Docker Hub 搜尋、提取並執行 Nginx 容器映像檔,以及如何管理容器映像檔的版本和大小。
搜尋合適的 Nginx 容器映像檔
首先,我們需要在 Docker Hub 上搜尋 Nginx 容器映像檔。Docker Hub 是 Docker 官方的映像檔倉函式庫,提供了大量的官方和社群維護的映像檔。
搜尋 Nginx 容器映像檔
在 Docker Hub 的搜尋欄中輸入
nginx
,然後選擇官方的 Nginx 映像檔。官方映像檔通常會標示為「Docker 官方映像檔」,這代表該映像檔由 Docker 或軟體的官方維護,相對更安全。https://hub.docker.com/search?q=nginx
選擇
nginx
映像檔後,進入其頁面並點選「Tags」標籤,以檢視可用的映像檔版本。選擇合適的 Nginx 映像檔版本
在
nginx
映像檔頁面中,可以看到多個版本標籤(Tags),例如latest
、stable-alpine
、stable-perl
等。這些標籤代表不同的版本或組態。latest
:代表最新的穩定版本。alpine
:代表根據 Alpine Linux 的映像檔,體積較小,適合用於生產環境。- 其他標籤:可能包含特定的功能或模組。
選擇合適的版本後,可以使用提供的指令來下載映像檔。
使用 Ubuntu 維護的 Nginx 容器映像檔
除了官方的 Nginx 映像檔,我們還可以使用 Ubuntu 維護的 ubuntu/nginx
映像檔。同樣在 Docker Hub 中搜尋 ubuntu/nginx
,並選擇「Verified Content」標籤的映像檔。
下載 ubuntu/nginx 映像檔
在終端機中使用以下指令下載
ubuntu/nginx:latest
映像檔:docker pull ubuntu/nginx:latest
系統會顯示下載進度,包括各個層(layer)的下載狀態和最終的映像檔摘要(Digest)。
latest: Pulling from ubuntu/nginx e2e81a815547: Pull complete 7c0b7a3612f4: Pull complete f7324d013584: Pull complete 3894566cf529: Pull complete Digest: sha256:a27d1870851c03123e1b7f5f321a36578c711adc33508b365733c0182331339c Status: Downloaded newer image for ubuntu/nginx:latest docker.io/ubuntu/nginx:latest
驗證映像檔是否下載成功
使用
docker image ls
指令來列出本機已下載的映像檔:docker image ls
輸出結果會顯示映像檔的名稱、標籤、映像檔 ID、建立時間和大小。
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu/nginx latest 047208ad86d4 6 days ago 142MB nginx latest eea7b3dcba7e 7 days ago 187MB hello-world latest 9c7a54a9a43c 3 months ago 13.3kB
可以看到
ubuntu/nginx:latest
映像檔的大小約為 142MB,相較於虛擬機器動輒數 GB 的大小,容器映像檔的體積非常精簡。
執行 Nginx 容器
下載映像檔後,我們需要執行容器並對外暴露連線埠(port),因為 Nginx 是一個網頁伺服器,需要透過 HTTP/HTTPS 連線埠對外提供服務。
檢視映像檔的使用說明
在 Docker Hub 的
ubuntu/nginx
映像檔頁面中,有一個「Usage」或「Overview」區塊,提供了執行容器時需要對外暴露的連線埠資訊。docker run -d -p 8080:80 ubuntu/nginx:latest
上述指令會啟動一個 Nginx 容器,並將主機的 8080 連線埠對應到容器的 80 連線埠。
執行容器
執行以下指令來啟動 Nginx 容器:
docker run -d --name my_nginx -p 8080:80 ubuntu/nginx:latest
-d
:代表背景執行容器。--name my_nginx
:為容器命名為my_nginx
。-p 8080:80
:將主機的 8080 連線埠對應到容器的 80 連線埠。
驗證 Nginx 是否正常執行
在瀏覽器中輸入
http://localhost:8080
,如果看到 Nginx 的預設歡迎頁面,表示容器已成功執行。
容器映像檔的大小與安全性考量
映像檔大小:Nginx 容器映像檔的大小約為 140MB 左右,這比傳統虛擬機器映象檔案小得多,顯示了容器技術在資源利用上的高效性。
安全性:選擇映像檔時應優先考慮官方或知名廠商維護的映像檔,如
nginx
或ubuntu/nginx
,因為這些映像檔通常會定期更新,修補已知的安全漏洞。
重點整理
- 搜尋與選擇映像檔:在 Docker Hub 上搜尋並選擇適合的 Nginx 映像檔。
- 下載映像檔:使用
docker pull
指令下載映像檔。 - 執行容器:使用
docker run
指令執行容器,並對外暴露必要的連線埠。 - 驗證容器執行狀態:透過瀏覽器或
docker ps
指令檢查容器是否正常執行。
內容解密:
此章節詳細介紹瞭如何使用 Docker Hub 搜尋、下載並執行 Nginx 容器映像檔。透過選擇適當的映像檔版本,並使用 docker pull
和 docker run
指令,可以快速佈署一個 Nginx 網頁伺服器。過程中,我們也強調了容器映像檔的大小與安全性考量,確保佈署的服務既高效又安全。
graph LR; A[開始] --> B[搜尋 Nginx 映像檔]; B --> C[選擇 ubuntu/nginx 映像檔]; C --> D[下載 ubuntu/nginx:latest 映像檔]; D --> E[執行 Nginx 容器]; E --> F[驗證 Nginx 是否正常執行]; F --> G[結束];
圖表翻譯:
此圖表呈現了使用 Docker 佈署 Nginx 容器的流程。首先搜尋 Nginx 相關映像檔,接著選擇 ubuntu/nginx
映像檔並下載 latest
版本。下載完成後,執行 Nginx 容器,並驗證其是否正常執行。整個流程展示了從搜尋到佈署的完整步驟。