7、使用Docker Compose部署Apps

使用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使得二進制可執行。以下所示:後端

  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

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

  • 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網絡,所以能彼此通訊。

3、用Compose部署app

本節,咱們將會部署在前一個小節定義在Compose文件中的app,須要從github上下載程序,包含四個文件:Dockerfile、app.py、requirements.txt、docker-compose.yml。以下圖所示:

  • app.py:應用程序代碼;
  • docker-compose.yml :Docker Compose文件,描述了Docker應該如何部署app;
  • Dockerfile:描述瞭如何從web-fe服務構建鏡像;
  • requirements.txt:列出了app所須要的Python包。

在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目錄,以下圖所示:

拷貝完成後,鏈接應用程序,查看變化,便可查看到修改後的變化。

相關文章
相關標籤/搜索