1. 程式人生 > >七、使用Docker Compose部署Apps

七、使用Docker Compose部署Apps

使用Docker Compose可以部署多容器的應用程式。Docker Compose 和 Docker Stacks很相似。本章節,我們主要聚焦於Docker Compose,可在執行在單引擎模式的Docker節點上部署和管理多容器應用程式。下一章節的 Docker Stacks,可在執行在叢集模式的Docker節點上部署和管理多容器應用程式。

現代應用程式由多個相互互動的多個小服務組成,以形成一個有用的app,我們稱之為微服務。一個app也許由以下四個服務組成:web前端、訂購、分類、後端資料庫。

部署和管理許多服務可能是很困難。這正是Docker Compose發揮作用的地方

作為用替換用指令碼和Docker命令將所有東西粘在一起,Docker Compose允許在單個宣告性配置檔案中描述整個應用程式。然後用一個單一的命令部署它。
一旦部署應用程式後,就可以使用一組簡單的命令來管理它的整個生命週期。

一、安裝Compose

在很多平臺上都可以使用Docker Compose,本節主要關注Windows和Linux。

(1)在Windows 10上安裝Compose

在Windows 10 上執行Docker的推薦方式是Docker for Windows(DfW),Docker Compose是標準DfW安裝的一部分,因此一般安裝了DfW,你就可以執行Docker Compose。可以使用命令:docker-compose --version,將會顯示Docker Compose的版本。

(2)在Linux上安裝Docker Compose

在Linux上安裝Docker Compose需要兩步。首先,使用curl命令下載二進位制;其次,使用chmod使得二進位制可執行。如下所示:

  1. curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-' uname -s'-'uname -m' -o /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose

二、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個頂層關鍵詞:

  • version
  • services
  • networks
  • volumes

其他的頂層關鍵詞也存在,比如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提供瞭如下指令:

  • build: . ,告訴Docker使用當前目錄(.)中的Dockerfile檔案中的指令構建一個新的映象,新構建的映象將用作 建立服務的容器;
  •  command: python app.py :告訴Docker執行一個叫app.py的Python應用程式,作為容器內的主應用程式。映象必須包含app.py和Python。Dockerfile兼顧這些需求;
  • ports: 告訴Docker對映容器內(-target)的埠5000到主機上(published)的埠5000。這意味著傳送到主機埠5000的流量將會定向到容器內的埠5000,容器內監聽埠5000。
  • networks: 告訴Docker哪個網路將附著到服務容器上。這個網路應該已經存在或者定義在頂層的networks關鍵字中。
  • volumes: 告訴Docker掛載counter-vol volume (source:) to /code (‘target:’) [容器內]. counter-vol volume 需要已經存在或者定義在頂層的volumes 關鍵字中。

總之,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網路,因此能彼此通訊。

三、用Compose部署app

 


四、用Compose管理app