介紹
Docker是一個很棒的工具,但要真正充分發揮其潛力,最好是應用程式的每個元件都在自己的容器中運作。對于具有大量元件的複雜應用程式,編排所有容器以一起啟動和關閉(更不用說彼此交談)可能很快變得難以處理。
Docker社群提出了一個名為Fig的流行解決方案,它允許您使用單個YAML檔案來編排所有Docker容器和配置。這變得如此受歡迎,以至于Docker團隊最終決定基于Fig源制作他們自己的版本。他們稱之為Docker Compose。簡而言之,它使得處理Docker容器的編排過程(例如啟動,關閉和設定容器内連結和卷)非常容易。
在本文結束時,您将安裝Docker和Docker Compose,并對Docker Compose的工作原理有基本的了解。
Docker和Docker撰寫概念
使用Docker Compose需要将一堆不同的Docker概念合二為一,是以在我們開始之前,讓我們花一點時間來回顧一下所涉及的各種概念。如果您已經熟悉Docker概念,如卷,連結和端口轉發,那麼您可能希望繼續前進到下一部分。
Docker鏡像
每個Docker容器都是Docker鏡像的本地執行個體。您可以将Docker鏡像視為完整的Linux安裝。通常,最小安裝僅包含運作映像所需的最少包。這些映像使用主機系統的核心,但由于它們在Docker容器内運作并且隻能看到自己的檔案系統,是以完全可以在Ubuntu主機上運作像CentOS這樣的分發(反之亦然)。
大多數Docker鏡像都是通過Docker Hub分發的,Docker Hub由Docker團隊維護。大多數流行的開源項目都有相應的鏡像上傳到Docker Registry,您可以使用它來部署軟體。在可能的情況下,最好抓住“官方”鏡像,因為Docker團隊保證他們遵循Docker最佳實踐。
Docker鏡像之間的通信
預設情況下,Docker容器與主機隔離,這意味着預設情況下主機無法通路Docker容器内的檔案系統,也無法通過網絡與其通信。毋庸置疑,這使得預設情況下配置和處理在Docker容器内運作的映像很困難。
Docker有三種主要方法可以解決這個問題。第一個也是最常見的是讓Docker指定将在Docker容器中設定的環境變量。然後,在Docker容器内運作的代碼将在啟動時檢查這些環境變量的值,并使用它們來正确配置自身。
另一種常用的方法是Docker資料卷)。Docker卷有兩種形式 - 内部和共享。
指定内部卷隻意味着對于為特定Docker容器指定的檔案夾,資料将在删除容器時保留。例如,如果您想確定挂起的日志檔案可能指定了内部
/var/log
卷。
共享卷将Docker容器内的檔案夾映射到主機上的檔案夾。這使您可以輕松地在Docker容器和主機之間共享檔案。
與Docker容器通信的第三種方式是通過網絡。Docker允許通過
links
端口轉發在不同的Docker容器之間進行通信,允許您将Docker容器内的端口轉發到主機伺服器上的端口。例如,您可以建立一個連結,以允許您的WordPress和MariaDB Docker容器互相通信并進行端口轉發,以便将WordPress暴露給外部世界,以便使用者可以連接配接到它。
準備
要閱讀本文,您需要具備以下條件:
- CentOS 7 騰訊雲CVM
- 一台已經設定好可以使用
指令的非root賬号的CentOS伺服器,并且已開啟防火牆。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後再購買伺服器。sudo
第1步 - 安裝Docker
首先,如果你還沒有安裝Docker。安裝Docker的最快方法是下載下傳并安裝他們的安裝腳本(系統會提示您輸入sudo密碼)。
wget -qO- https://get.docker.com/ | sh
複制
上面的指令下載下傳并執行Docker團隊編寫的小型安裝腳本。
如果未正确配置使用者,使用Docker會很麻煩,是以請使用
docker
以下指令将使用者添加到組中。
sudo usermod -aG docker $(whoami)
複制
登出并從伺服器登入以激活新組。
将Docker設定為在引導時自動啟動:
sudo systemctl enable docker.service
複制
最後,啟動Docker服務:
sudo systemctl start docker.service
複制
第2步 - 安裝Docker Compose
現在你已經安裝了Docker,讓我們繼續安裝Docker Compose。首先,安裝
python-pip
為先決條件:
sudo yum install epel-release
sudo yum install -y python-pip
複制
然後你可以安裝Docker Compose:
sudo pip install docker-compose
複制
您還需要在CentOS 7上更新Python包來獲得
docker-compose
才能成功運作:
sudo yum upgrade python*
複制
第3步 - 使用Docker Compose運作容器
公共Docker系統資料庫Docker Hub包含一個簡單的Hello World鏡像。現在我們已經安裝了Docker Compose,讓我們用這個非常簡單的例子來測試它。
首先,為我們的YAML檔案建立一個目錄:
mkdir hello-world
複制
然後切換到目錄:
cd hello-world
複制
現在使用您喜歡的文本編輯器建立YAML檔案(我們将使用nano):
nano docker-compose.yml
複制
将以下内容放入檔案,儲存檔案,然後退出文本編輯器:
my-test:
image: hello-world
複制
第一行将用作容器名稱的一部分。第二行指定用于建立容器的鏡像。該鏡像将從官方Docker Hub存儲庫下載下傳。
仍在
~/hello-world
目錄中時,執行以下指令來建立容器:
docker-compose up
複制
輸出應從以下開始:
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
複制
輸出然後解釋了Docker正在做什麼:
- Docker用戶端聯系了Docker守護程式。
- Docker守護程式從Docker Hub中提取了“hello-world”鏡像。
- Docker守護程式從該映像建立了一個新容器,該容器運作生成您目前正在讀取的輸出的可執行檔案。
- Docker守護程式将該輸出流式傳輸到Docker用戶端,後者将其發送到您的終端。
如果該過程沒有自行退出,請按
CTRL-C
。
這個簡單的測試沒有顯示Docker Compose的主要優點之一 - 能夠同時上下移動一組Docker容器。
第4步 - 學習Docker撰寫指令
讓我們回顧一下該
docker-compose
工具支援的指令。
該
docker-compose
指令基于每個目錄工作。您可以在一台計算機上運作多組Docker容器 - 隻需為每個容器建立一個目錄,為其目錄中的每個容器建立一個
docker-compose.yml
檔案。
到目前為止,我們一直在運作
docker-compose up
并使用
CTRL-C
它來關閉它。這允許調試消息顯示在終端視窗中。但這并不理想,在生産中運作時,您會希望
docker-compose
更像是服務。一種簡單的方法是在會話
-d
時添加選項
up
:
docker-compose up -d
複制
docker-compose
現在将分叉到背景。
要顯示您的Docker容器組(已停止且目前正在運作),請使用以下指令:
docker-compose ps
複制
例如,以下顯示
helloworld_my-test_1
容器已停止:
Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
複制
正在運作的容器将顯示
Up
狀态:
Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
複制
要停止應用程式組的所有正在運作的Docker容器,請在用于啟動Docker組的與
docker-compose.yml
檔案相同的目錄中發出以下指令:
docker-compose stop
複制
注意: 如果您需要更有力地關閉東西,也可以使用
docker-compose kill
。
在某些情況下,Docker容器會将其舊資訊存儲在内部卷中。如果要從頭開始,可以使用該
rm
指令完全删除構成容器組的所有容器:
docker-compose rm
複制
如果您從包含Docker容器和
.yml
檔案的目錄以外的目錄中嘗試這些指令中的任何一個,它将會抱怨并且不會顯示您的容器:
Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
複制
第5步 - 通路Docker容器檔案系統(可選)
如果需要在容器内部處理指令提示符,則可以使用該
docker exec
指令。
在世界,你好!示例在運作後退出,是以我們需要啟動一個将繼續運作的容器,以便我們可以使用它
docker exec
來通路容器的檔案系統。我們來看看Docker Hub 中的Nginx鏡像。
為它建立一個新目錄并更改為:
mkdir ~/nginx && cd $_
複制
在我們的新目錄中建立一個
docker-compose.yml
檔案:
nano docker-compose.yml
複制
并粘貼如下:
nginx:
image: nginx
複制
儲存檔案并退出。我們隻需要使用以下指令啟動Nginx容器作為背景程序:
docker-compose up -d
複制
将下載下傳Nginx鏡像,然後在背景啟動容器。
現在我們需要
CONTAINER ID
容器。正在運作的所有容器的清單:
docker ps
複制
您将看到類似于以下内容的内容:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
複制
注意:僅使用該指令列出正在運作的容器
docker ps
。
如果我們想對這個容器中的檔案系統進行更改,我們将擷取其ID(在此示例中是
e90e12f70418
)并用
docker exec
在容器内啟動shell:
docker exec -it e90e12f70418 /bin/bash
複制
該
-t
選項打開一個終端,該
-i
選項使其具有互動性。這些
/bin/bash
選項為正在運作的容器打開一個bash shell。請務必使用容器的ID。
您将看到容器的bash提示符類似于:
root@e90e12f70418:/#
複制
從這裡,您可以從指令提示符處工作。但請記住,除非您位于作為資料卷一部分儲存的目錄中,否則一旦容器重新啟動,您的更改就會消失。另一個需要注意的是,大多數Docker鏡像是使用非常少的Linux安裝建立的,是以您習慣使用的某些指令行實用程式和工具可能不存在。
結論
太棒了,是以它涵蓋了Docker Compose的基本概念以及如何安裝和運作它。
有關該
docker-compose.yml
檔案的配置選項的完整清單,請參閱Compose檔案參考。
更多CentOS教程請前往騰訊雲+社群學習更多知識。
參考文獻:《How To Install and Use Docker Compose on CentOS 7》