天天看點

如何在CentOS 7上安裝和使用Docker Compose

介紹

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
  • 一台已經設定好可以使用

    sudo

    指令的非root賬号的CentOS伺服器,并且已開啟防火牆。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後再購買伺服器。

第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正在做什麼:

  1. Docker用戶端聯系了Docker守護程式。
  2. Docker守護程式從Docker Hub中提取了“hello-world”鏡像。
  3. Docker守護程式從該映像建立了一個新容器,該容器運作生成您目前正在讀取的輸出的可執行檔案。
  4. 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》