你的應用可能需要很多個服務,比如web服務,資料庫服務,緩存服務等等。我們可以把這些服務放到單獨的容器裡面,如果手工去配置這些服務會有些麻煩,docker compose可以幫我們解決這個問題。
我們可以建立一個compose檔案,在這個檔案上面描述你都需要哪些服務,服務使用什麼鏡像、資料卷、網絡等等,然後再用一條指令就可以管理、啟動所有的服務。
compose檔案用的yml格式,docker規定了一些指令,使用它們可以去設定對應的東西,它主要分為了3個區域:
services:是服務,在它下面可以定義應用需要的一些服務,每個服務都有自己的名字、使用的鏡像、挂載的資料卷、所屬的網絡、依賴哪些其他服務等等;
networks:是應用的網絡,在它下面可以定義應用的名字、使用的網絡類型等等;
volumes:是資料卷,在它下面可以定義的資料卷(名字等等),然後挂載到不同的服務下去使用;
先建立一個檔案夾beck-docker,并在裡面建立docker-compose.yml檔案,然後使用version指定一下compose使用的版本号。

在應用裡需要定義的服務,可以放到services下面。比如,我們去定義一個dog的服務,使用nginx鏡像,指定主機上的8080端口映射到容器中得80端口,也就是nginx的http的通路端口。
以同樣的方式,定義一個cat的服務,同樣使用nginx鏡像,然後指8081端口對應80端口。
需要注意的是,cat與dog要在同一個級别,還有ports是個數組,可以指定多個端口映射關系。
定義好服務以後,在項目的目錄啟動這些服務,可以執行:
這樣會啟動,在compose檔案下定義的所有服務。由于這是第一次啟動這個服務,是以可以看到它是creating,也就是去建立相關的東西。首先會建立這個服務使用的網絡,這裡是叫做「beckdocker_default」的網絡,然後是dog和cat的服務,這些網絡和服務的名字,預設會加上一個字首,由于在建立應用的時候沒有指定名字,是以會預設使用項目目錄的名字,後面還有一個數字的字尾。最後會有一個「Attaching to …」,将網絡應用到服務上。
啟動成功後,在浏覽器通路一下。8080對應的是dog的服務,8081是cat的服務。
回到終端,可以看到服務的通路日志,日志的開頭會有服務的名字,标志着日志是從哪個服務來的:
如果希望服務在背景運作,可以使用-d選項(也就是detach):
檢視正在運作的服務
停止一個服務
如果後面不加服務名,會停止所有的服務。
啟動某一個服務
如果後面不加服務名,會啟動所有的服務。
檢視服務運作的log
加上-f選項,可以持續跟中服務産生的log。
進入服務容器中
删除服務
注意這個docker-compose rm不會删除應用的網絡和資料卷。檢視一下網絡,可以看到應用建立的網絡「beckdocker_default」,如果要删除所有的這些,可以使用:
會提示我們删除網絡 beckdocker_default。
網絡決定了服務之間以及服務和外界之間如何去通信,在執行docker-compose up的時候,docker會預設建立一個預設的網絡,建立的服務也會預設地屬于這個預設網絡。服務和服務之間,可以使用服務的名字進行通信。也可以自己建立網絡,并将服務屬于到這個網絡之中,這樣服務之間可以互相通信,而外界就不能夠與這個網絡中的服務通信,可以保持隔離性。
下面登入dog服務去連接配接cat服務,登入到cat服務連接配接dog服務:
可以通過服務的名稱進行連接配接。
1、在networks中先定義一個名為animal,類型為bridge的網絡:
2、讓dog和cat服務使用這個網絡:
3、再增加一個叫pig的服務,使用預設網絡,來展現于自定義網絡的隔離性:
4、重新啟動應用
5、登入cat服務,嘗試去連接配接dog服務和pig服務:
因為cat與dog同在animal網絡,是以可以通過名字連接配接,而pig在default網絡中,是以不能。
在compose檔案中,還可以指定一些有名字的資料卷,讓服務去使用。方法是:在與networks同級的地方,添加volumes,接着是資料卷的名字,下面使用driver去指定資料卷的類型。
定義好資料卷後,就将這個資料卷交給一個服務去使用。可以用volumes給服務指定需要使用的資料卷:
以dog服務為例,volumes下指定使用的資料卷,冒号左邊是資料卷名稱,冒号右邊是挂載到的docker對應目錄位置。接着給cat服務也添加同樣的資料卷。
回到終端,執行docker-compose up -d,下面測試一下資料卷:
因為cat與dog服務都使用nest的資料卷,是以在dog中/mnt目錄下建立的data1,在cat服務的/mnt目錄下可以看到。
dog和cat都是一個web服務,現在我想将主機的某一個位置當做是服務的一個内容,那麼我們可以去創一個指定位置的資料卷。首先可以在目前目錄,建立./app/web檔案夾,在裡面建立個index.html。
編輯内容:
内容編輯好後,就給dog與cat服務指定資料卷,冒号左邊是主機上的目錄,冒号右邊是服務内挂載的目錄:
說明:/usr/share/nginx/html 目錄是nginx預設主機的根目錄,也就是nginx歡迎界面的目錄。
本文轉自 dengaosky 51CTO部落格,原文連結:http://blog.51cto.com/dengaosky/1854570,如需轉載請自行聯系原作者