使用Docker Compose能夠部署多容器的應用程序。Docker Compose 和 Docker Stacks很類似。本章節,咱們主要聚焦於Docker Compose,可在運行在單引擎模式的Docker節點上部署和管理多容器應用程序。下一章節的 Docker Stacks,可在運行在集羣模式的Docker節點上部署和管理多容器應用程序。前端
現代應用程序由多個相互交互的多個小服務組成,以造成一個有用的app,咱們稱之爲微服務。一個app也許由如下四個服務組成:web前端、訂購、分類、後端數據庫。python
部署和管理許多服務多是很困難。這正是Docker Compose發揮做用的地方git
做爲用替換用腳本和Docker命令將全部東西粘在一塊兒,Docker Compose容許在單個聲明性配置文件中描述整個應用程序。而後用一個單一的命令部署它。
一旦部署應用程序後,就可使用一組簡單的命令來管理它的整個生命週期。github
1、安裝Composeweb
在不少平臺上均可以使用Docker Compose,本節主要關注Windows和Linux。redis
(1)在Windows 10上安裝Composedocker
在Windows 10 上運行Docker的推薦方式是Docker for Windows(DfW),Docker Compose是標準DfW安裝的一部分,所以通常安裝了DfW,你就能夠運行Docker Compose。可使用命令:docker-compose --version,將會顯示Docker Compose的版本。數據庫
(2)在Linux上安裝Docker Composevim
在Linux上安裝Docker Compose須要兩步。首先,使用curl命令下載二進制;其次,使用chmod使得二進制可執行。以下所示:後端
2、Compose文件
Compose 使用YAML文件定義多服務應用程序。YAML是JSON的子集。缺省的Compose YAML文件的名字是docker-compose.yml,也可使用-f標誌來指定自定義的文件名。
接下來的例子顯示了一個很是簡單的Compose文件,定義了一個具備兩個服務(web-fe and redis)的小Flask服務 。這個app是一個簡單的web服務器,統計訪問次數並把值存在Redis中。咱們稱之爲counter-app,在接下來的章節中將它做爲示例應用程序。Docker Compose文件內容以下:
version: "3.5" services: web-fe: build: . command: python app.py ports: - target: 5000 published: 5000 networks: - counter-net volumes: - type: volume source: counter-vol target: /code redis: image: "redis:alpine" networks: counter-net: networks: counter-net: volumes: counter-vol:
上述文件有4個頂層關鍵詞:
其餘的頂層關鍵詞也存在,好比secrets 和configs,但咱們暫時不關注。
version關鍵詞是強制的,它老是文件根目錄的第一行,它定義了Compose文件格式(基本上是API)的版本,一般使用 最新版本。
須要注意的是version關鍵字並不定義Docker Compose或者Docker引擎的版本。更多關於Docker Engine, Docker Compose,和the Compose文件格式版本之間的兼容性,請搜索「Compose file versions and upgrading」。在本章節的剩餘部分將使用version 3或者更高版本。
頂層services關鍵字定義不用應用程序的服務,在本例子中定義了兩個服務:web-fe和redis。Compose將會在他們各自的容器內部署每個服務。
networks關鍵字告訴Docker建立新的網絡,確實狀況下,Compose將會建立橋接網絡,這是單主機網絡,僅鏈接在相同主機上的容器。然而,你也可使用driver屬性來指定不一樣的網絡類型。例如:
networks: over-net: driver: overlay attachable: true
頂層volumes關鍵字告訴Docker建立新的volumes。
上述文件中的services節有兩個第二層級的關鍵字:web-fe和redis。每個都定義了一個應用程序中的服務。Compose將他們每個部署爲 一個容器,並使用keys名稱做爲容器名稱,理解這點很重要。在咱們的例子中,定義了兩個關鍵字:web-fe和redis,這意味着Compose將部署兩個容器,一個命名爲:web-fe,另外一個命名爲redis。
在web-fe服務的定義內,咱們向Docker提供了以下指令:
總之,Compose將會指導Docker爲web-fe部署一個單個獨立的容器。將基於從Dockerfile文件中構建的鏡像(Dockerfile和Compose文件 在同一目錄下),鏡像將會啓動一個 容器,並運行app.py做爲主應用程序。它將會把本身暴露給主機上的5000端口。附着在counter-net網絡,並掛載一個volume到/code。
在redis服務的定義內,咱們向Docker提供了以下指令:
image: redis:alpine 告訴Docker基於redis:alpine鏡像啓動一個叫作redis的容器。此鏡像將會從Docker Hub拉取;
• networks: redis容器將會附着在counter-net 網絡。
以上兩個服務都部署在相同的counter-net網絡,所以能彼此通訊。
3、用Compose部署app
本節,咱們將會部署在前一個小節定義在Compose文件中的app,須要從github上下載程序,包含四個文件:Dockerfile、app.py、requirements.txt、docker-compose.yml。以下圖所示:
在counter-app目錄下輸入:docker-compose up & (&:表示在前端啓動,能夠再終端觀看輸出結果),以下圖所示(省略掉了一些中間輸出結果):
docker-compose up是運行Compose app最經常使用的方式,它構建所須要的鏡像,建立網絡和volumes,啓動所須要的容器。缺省狀況下,docker-compose up指望的Compose文件是docker-compose.yml或docker-compose.yaml,若是須要一個不一樣的名稱,則須要使用-f標誌,如:docker-compose -f prod-equus-bass.yml up。也可使用-d,使其在後臺運行,如docker-compose -f prod-equus-bass.yml up -d。
使用docker image ls命令顯示以下:
其中python鏡像是Dockerfile文件中所使用的鏡像,counter-app_web-fe是用Compose文件構建的鏡像,redis鏡像是從Docker Hub倉庫拉取的。
注意:Compose使用項目名和聲明在Compose文件中的資源名的組合在命名新構建的鏡像,二者之間使用下劃線(_)鏈接。全部被Compose部署的資源都遵循這個命名規範。
使用命令:docker container ls,查看容器,Compose文件建立了兩個容器,以下圖:
在瀏覽器輸入地址,出現以下界面,應用程序部署成功。
4、用Compose管理app
本小節,將學習如何啓動、中止、刪除和獲取由Docker Compose管理的應用程序的狀態。同時咱們還將瞭解咱們使用的容量,如何用於直接嚮應用程序的Web前端注入更新。
down命令:docker-compose down #執行此命令後,刪除了Compose文件建立的容器,而不刪除鏡像
up命令:docker-compose up -d
查看app狀態:docker-compose ps
查看運行在每個容器內的進程:docker-compose top
其中:PID是從Docker主機中看的PID,而不是從容器內看到的。
stop命令:docker-compose stop #僅中止而不刪除容器和鏡像
restart命令:docker-compose restart
在Compose文件中,咱們定義了一個volume,叫counter-vol,Compose使用項目名和volume名稱來命名最終的volume。
如上圖所示,查看docker-compose.yml文件中的web-fe服務,能夠看到,它正在將counter-app volume掛載進服務的容器內。最終結果是,咱們的app代碼駐留在Docker的volume中。這意味着,從主機側,咱們能夠更改volume中的文件。
在counter-app目錄下,使用vim或其餘編輯軟件打開app.py文件,在22行,修改「What's up......"這一行的代碼,能夠隨意修改。修改完成後,咱們須要將修改後的代碼拷貝到Docker主機上的volume內。每個Docker volume都暴露在Docker主機文件系統中的某一個位置,使用docker volume inspect命令能夠查看具體位置,而後將修改後的文件拷貝到volume目錄,以下圖所示:
拷貝完成後,鏈接應用程序,查看變化,便可查看到修改後的變化。