簡介
Docker 是一個讓在容器中運行和管理應用程式流程變得更容易的平台。它提供了一種將您的應用程式與基礎架構分離的方法。容器與虛擬機器非常相似,但它們更輕便、高效且易於使用。有許多種方法可以在 Linux 發行版上安裝 Docker。在現有作業系統上安裝 Docker 最熱門且簡單的方法是使用 yum 指令。
本教學將示範如何在幾步簡單的步驟中,於 CentOS 7 上設定並使用 Docker。
先決條件:
- 64 位元 CentOS 7 執行個體.
- 具有 sudo 權限的非 root 使用者。
您在本教學中執行的所有指令都是以非 root 使用者身分執行,如有必要,將使用 sudo 關鍵字提供 root 存取權限。
步驟 1:在 CentOS 7 執行個體上設定 Docker
官方的 CentOS 7 套件庫可能沒有最新的 Docker 安裝套件。在本節中,您將從官方 Docker 套件庫安裝最新版本的 Docker。首先,您需要使用以下指令更新套件資料庫:
|
1 |
sudo yum check-update |
更新步驟完成後,執行以下指令以下載並安裝最新版本的 Docker:
|
1 |
curl -fsSL https://get.docker.com/ | sh |
Docker 現在已安裝,因此您可以透過執行以下指令來啟動 Docker 精靈程序:
|
1 |
sudo systemctl start docker |
若要驗證 Docker 精靈程序是否正在執行,請輸入以下內容:
|
1 |
sudo systemctl status docker |
systemctl status 指令的輸出應該與下方分享的輸出類似,這顯示它正在執行:
|
1 2 3 4 5 6 |
輸出: ● docker.service - Docker 應用程式 容器 引擎 已載入: 已載入 (/usr/lib/systemd/system/docker.service; 已停用; 廠商 預設: 已停用) 作用中: 作用中 (執行中) 自 週三 2021-02-17 18:22:06 UTC; 10秒 前 文件: https://docs.docker.com 主 PID: 21884 (dockerd) |
最後,為了確保 Docker 在您重新啟動電腦時自動啟動,請使用以下指令:
|
1 |
sudo systemctl enable docker |
Docker 安裝為您提供了 Docker 服務以及用戶端公用程式(Docker 命令列用戶端)。在本教學的下一節中,您將能夠更實際地操作使用 Docker 指令。
您也可以參考我們的 關於如何在公有雲中的 Ubuntu 上安裝 & 操作 Docker 的深入教學.
步驟 2:在不使用 Sudo 前綴的情況下使用 Docker 指令
Docker 指令需要 root 權限才能執行。因此,如果您想執行這些指令,必須在它們前面加上 sudo。在安裝過程中,預設會建立一個 Docker 群組。如果您將使用者新增至該群組,則可以在不使用 sudo 的情況下執行 Docker 指令。嘗試在不使用 sudo 且未將使用者新增至群組的情況下執行 Docker 指令,將會產生類似於下方的輸出:
|
1 2 3 |
輸出: docker: 無法 連線 至 此 Docker 精靈程序. 是否 此 docker 精靈程序 正在執行 於 此 主機?. 請參閱 'docker run --help'. |
將您的使用者名稱新增至 Docker 群組將可確保您不必使用 sudo 來執行 Docker 指令:
|
1 |
sudo usermod -aG docker $(whoami) |
若要將另一個使用者新增至 Docker 群組,您只需替換指令中的使用者名稱:
|
1 |
sudo usermod -aG docker username |
在本指南的其餘部分中,我們將假設所有指令都是由 Docker 使用者群組中的使用者執行的。如果不是這種情況,您可以在指令中使用 sudo 前綴。
步驟 3:執行 Docker 命令
現在您已安裝並執行 Docker,讓我們來看看一些命令,以熟悉 Docker 命令行公用程式。Docker 命令通常採用以下形式:
|
1 |
docker [選項] [命令] [參數] |
要尋找所有可用的子命令,您應該使用:
|
1 |
docker |
截至 Docker 20.10.3,可用的子命令完整清單包括:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
輸出: attach 附加 本機 標準 輸入, 輸出, 和 錯誤 資料流 到 一個 執行中的 容器 build 建置 一個 映像 從 一個 Dockerfile commit 建立 一個 新 映像 從 一個 容器 的變更 cp 在容器與本機檔案系統之間複製檔案/資料夾 create 建立新容器 diff 檢查容器' 的 檔案系統上檔案或目錄的變更 events 取得 即時 time 事件 從 the 伺服器 exec 執行 一個 命令 在 一個 執行中的 容器 export 匯出 一個 容器' 的 檔案系統 作為 一個 tar 封存檔 history 顯示 the 歷程記錄 的 一個 映像 images 列出 映像 import 匯入 the 內容 從 一個 tarball 以 建立 一個 檔案系統 映像 info 顯示 系統-範圍的 資訊 inspect 傳回 低-階 資訊 關於 Docker 物件 kill 強制停止 一個 或 多個 執行中的 容器 load 載入 一個 映像 從 一個 tar 封存檔 或 STDIN login 登入 in 到 一個 Docker 登錄伺服器 logout 自 out Docker a 登錄伺服器 登出 logs 取得 the 記錄 的 一個 容器 pause 暫停 所有 程序 在 一個 或 多個容器 連接埠 列出 連接埠 對應 或 一個 特定 對應 給 該 容器 ps 列出 容器 pull 拉取 一個 映像檔 或 一個 存放庫 從 一個 註冊表 push 推送 一個 映像檔 或 一個 存放庫 至 一個 註冊表 rename 重新命名 一個 容器 restart 重新啟動 一個 或 多個 容器 rm 移除 一個 或 多個 容器 rmi 移除 一個 或 多個 映像檔 run 執行 一個 指令 在 一個 新增的 容器 save 儲存 一個 或 多個 映像檔 至 一個 tar 封存檔 (以串流方式 至 STDOUT 預設 default) search 搜尋 該 Docker Hub 以尋找 映像檔 start 啟動 一個 或 多個 已停止的 容器 stats 顯示 一個 即時 串流 的 容器(的) 資源 使用量 統計資料 stop 停止 一個 或 多個 執行中的 容器 tag 建立 一個 標籤 TARGET_IMAGE 指向 參照 至 SOURCE_IMAGE top 顯示 該 執行中的 程序 於 一個 容器 unpause 取消暫停 所有 程序 在...之內 一個 或 多個 容器 update 更新 設定 的 一個 或 多個 容器 version 顯示 該 Docker 版本 資訊 wait 阻塞 直到 一個 或 多個 容器 停止, 然後 列印 它們的 結束 代碼 |
You can use –help flag with a specific command to get more information about it:
|
1 |
docker subcommand --help |
To get detailed information about the system, use:
|
1 |
docker info |
步驟 4:使用 Docker 映像檔
Docker 映像檔可以被稱為 Docker 容器的藍圖。這些映像檔通常是從 Docker Hub 拉取的,這是一個由 Docker 專案管理的註冊表。任何人都可以建立自己的映像檔並將其推送到 Docker Hub。因此,您可以輕鬆地在該註冊表中找到各種應用程式和作業系統發行版。讓我們嘗試一個簡單的程式,它將確認對 Docker Hub 的存取:
|
1 |
docker run hello-world |
您應該會得到如下輸出,這表示 Docker 正在正常運作:
|
1 2 3 4 |
輸出: 哈囉 來自 Docker! 此 訊息 顯示 指出 您的 安裝 似乎 正在 be 運作 正常. ... |
您可以使用 search 指令在 Docker Hub 上找到各種 Docker 映像檔。例如,請參閱以下指令以搜尋 CentOS 映像檔:
|
1 |
docker search centos |
搜尋查詢將顯示與該子字串相符的所有映像檔列表。在您的情況下,輸出應該像這樣:
|
1 2 3 4 5 6 7 8 |
輸出: 名稱 描述 星數 官方 自動化 centos 該 官方 建置版本 的 CentOS. 6410 [OK] ansible/centos7-ansible Ansible 在 Centos7 132 [OK] consol/centos-xfce-vnc Centos 容器 附帶 "無頭" VNC 工作階段… 125 [OK] jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL 套件庫… 117 [OK] centos/systemd systemd 已啟用的 基礎 容器. 96 [OK] ... |
在搜尋結果中,有不同的欄位描述關於映像檔的資訊。OFFICIAL 欄位中的 OK 表示該映像檔是由應用程式背後的公司建立並支援的。一旦您確定了映像檔,您可以使用 Docker pull 指令將其下載到您的本機電腦:
|
1 |
docker pull centos |
下載映像檔後,您可以使用 Docker run 指令執行容器。如果您直接嘗試在未事先下載的情況下執行映像檔,Docker 將會下載該映像檔,然後執行容器:
|
1 |
docker run centos |
您可以使用以下指令列出已下載到本機電腦的映像檔:
|
1 |
docker images |
您應該會得到類似的輸出:
|
1 2 3 4 |
輸出: REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 300e315adb2f 2 個月 前 209MB hello-world latest bf756fb1ae65 13 個月 前 13.3kB |
在本教學的後面,您將能夠修改映像檔以執行容器。這些新的映像檔可以新增或推送到 Docker Hub 以及其他託管 Docker 映像檔的註冊中心。
步驟 5:以互動方式執行容器
有不同類型的容器。您在 步驟 4 中執行的 hello-world 容器是一種在列印訊息後執行並退出的容器。另一種容器類型是互動式容器。您可以像使用虛擬機器一樣使用互動式容器。
讓我們從最新的 CentOS 映像檔建立一個容器。在 Docker run 指令中使用 -i 和 -t 旗標將提供對 CentOS 容器的互動式存取:
|
1 |
docker run -it centos |
命令提示字元將會改變,它應該看起來像下面的輸出:
|
1 2 |
輸出: [root@3ce69d2a35b9 /]# |
|
1 |
注意: 此 容器 ID 顯示 於 命令 提示 字元 是 唯一的 且 它 將 在 稍後 派上 用場,, 在 此 範例 中 為 3ce69d2a35b9。 |
現在您執行的任何指令都將在容器內部執行。這類似於在虛擬機器中執行指令。讓我們嘗試安裝 MySQL 伺服器到 CentOS 容器中。您可以使用以下指令來執行此操作:
|
1 |
yum install mysql |
步驟 6:將容器中的變更提交為 Docker 映像檔
啟動容器後,您可以執行在類似虛擬機器中可以執行的所有操作,例如建立/修改檔案或設定應用程式。請注意,這些變更僅會保留在該容器中,在您銷毀容器後,您所做的變更將會遺失。
在本教學的這個部分中,您將學習如何從已進行變更的容器中建立新的 Docker 映像檔。在 Step5 之後,您將擁有一個運行中且已安裝 MySQL 伺服器的 CentOS 容器。此容器現在與純 CentOS 映像檔不同。您可以儲存此容器狀態以便日後使用。首先,您需要使用以下指令退出容器:
|
1 |
exit |
使用以下指令將您在容器中所做的變更提交到新的 Docker 映像檔中:
|
1 |
docker commit -m "Changes done to the image" -a "Author Name" container-id repository/new_image_name |
在指令中,-m 指的是提交訊息,基本上應該表示所做的變更,-a 標籤用於提及作者。Container-id 是來自 Step5,這是您在互動模式下執行容器後取得的,通常,repository 是您在 Docker Hub 的使用者名稱。例如:
|
1 |
docker commit -m "added mysql-server" -a "CloudSigma" 59839a1b7de2 finid/centos-mariadb |
|
1 |
注意: 在 該 新 映像檔 被 提交 後,它 會 儲存 在 您的 系統上. 在 此 後續 階段 的 本 教學中, 您 將 學習 如何 將 推送 一個 映像檔 至 Docker Hub 以及 在 其他 類似的 登錄庫 ,其 託管 docker 映像檔. 一旦 您的 映像檔 被 推送 至 該 登錄庫, ,它 可以 被 存取 由 其他人 也 一樣. |
現在映像檔已提交,Docker images 指令應該會列出新的映像檔以及舊的映像檔:
|
1 |
docker images |
指令的輸出應該類似如下:
|
1 2 3 4 5 |
輸出: REPOSITORY TAG IMAGE ID CREATED SIZE cloudsigma23/centos-mysql latest 1b9368efea70 13 秒前 308MB centos latest 300e315adb2f 2 個月前 209MB hello-world latest bf756fb1ae65 13 個月前 13.3kB |
如範例所示,使用來自 Docker Hub 的 CentOS 映像檔建立了一個新的映像檔 centos-mysql。大小的差異表示已進行了一些變更。在此範例中,是在容器中新增了 MySQL 伺服器。下次如果您需要一個帶有 MySQL 伺服器的容器,您只需執行新的映像檔,瞧!您就擁有一個運行中且預先安裝了 MySQL 伺服器的 CentOS 容器。
步驟 7:管理 Docker 容器
現在您已經熟悉 Docker,在使用一段時間後,您應該已經有一些運行中和一些未作用的容器。要取得作用中容器的清單,您應該使用:
|
1 |
docker ps |
您應該會看到類似的輸出:
|
1 2 3 |
輸出: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 604c889cf404 centos "/bin/bash" 20 分鐘 前 Up 20 分鐘 intelligent_easley |
若要列出所有作用中和非作用中的容器,您應該在命令中使用 -a 旗標:
|
1 |
docker ps -a |
若要尋找您最後建立的容器,可以提供 -l 旗標:
|
1 |
docker ps -l |
若要停止執行中/作用中的容器,請執行以下簡單命令:
|
1 |
docker stop container-id |
您可以在 Docker ps 命令的輸出中找到 container-id。
步驟 8:將映像檔發佈到儲存庫
建立新映像檔後的下一步是與您的朋友分享。您也可以使用 Docker Hub 或任何其他登錄庫將其開放給全世界。在推送映像檔之前,您需要登入相應的登錄庫。
在本教學的下一部分中,您將學習如何將映像檔推送至 Docker Hub。首先,在 Docker Hub 上註冊。您需要登入 Docker Hub 才能使用以下命令推送您的映像檔:
|
1 |
docker login -u docker-registry-username |
輸入正確的密碼且驗證成功後,您就可以推送映像檔。若要推送映像檔,請使用以下命令:
|
1 |
docker push docker-registry-username/docker-image-name |
該命令的輸出將類似於以下內容:
|
1 2 3 4 5 |
輸出: The push refers to repository [docker.io/cloudsigma23/centos-mysql] ee30e80cbcc5: Pushed 2653d992f4ef: Mounted from library/centos ... |
推送映像檔後,它應該會顯示在您帳戶的儀表板上,如下圖所示:

如果出現類似的失敗情況,很可能是因為您尚未登入:
|
1 2 3 4 5 6 7 |
輸出: The push refers to repository [docker.io/cloudsigma23/centos-mysql] ee30e80cbcc5: Layer already exists 2653d992f4ef: Layer already exists errors: denied: requested access to the resource is denied unauthorized: authentication required |
您可以登入並重新嘗試推送。
結論
您可以使用許多種方式來利用 Docker。本教學應該為您提供了足夠的入門資訊。由於 Docker 是一個非常熱門的專案,您可以從專案的部落格頁面.
您也可以查看我們其他的 Docker 教學,以深入了解您可以使用 Docker 做些什麼:
- 清理 Docker 資源 – 映像檔、容器和資料卷
- 使用 Docker Compose 部署 Laravel、Nginx 和 MySQL
- 使用 OpenVPN Access Server 在 Docker 下執行您自己的 VPN 伺服器
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。