我的Docker之路(五):使用Docker-Compose管理多容器應用


前一篇實現了容器間的通信,像這樣由兩個乃至多容器構成的應用需要我們一步一步用docker命令搭建起來。由於Docker的遷移性,換一個有Docker的環境執行按相同的順序執行相同的docker命令便可搭建其一個相同的應用。但是在執行docker命令時某個指令執行錯誤,某個變量設置錯誤,某個命令執行的順序出錯等等情況都會導致應用搭建失敗。更或是如果應用需要啟動很多個容器,每個容器都有相應的網絡,卷等配置,容器間還存在依賴,這樣的應用搭建起來就會十分的繁瑣。而且在不同的環境上去搭建都是重復性的工作,那只要搭建一次豈不就是重復性的受罪嘛。

Docker-Compose簡介

遇到上面說的情況,docker-compose便可以解救我們進行大量重復性的手工作業。docker-compose是一個用於定義與啟動多容器應用的工具,通過docker-compose,我們可以通過一個yaml文件來配置要用到的所有的服務(容器),並且容器是如何構建、用到哪些卷、用什么網絡、映射哪個端口或依賴什么都可以定義。在定義之后,通過一句命令便可以運行起所有的服務。有了docker-compose之后就不用再擔心重復的搭建多容器應用了。

首先需要區分兩個概念,docker-compose中服務(service)可以理解成我們要運行的容器,而項目(project)是由一個docker-compose.yml文件定義的整個要運行的容器集合。

簡單總結下docker-compose的作用

  1. 幫我們按照制定好的規則構建與啟動服務
  2. 管理整個應用的生命周期
  3. 查看每個容器運行的日志
  4. 單獨控制yaml文件中定義的某個容器,包括停止、重啟、擴容等
  5. 可以使用項目名稱進行項目隔離,可以使用docker-compose在同一台主機上重復搭建多個應用項目,並且應用之間相互隔離單獨管理

Docker-Compose安裝

 在Linux系統中執行下面的命令下載當前穩定版本Docker-Compose,大約17M大小。

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

隨后執行命令增加權限

sudo chmod +x /usr/local/bin/docker-compose

驗證安裝是否成功

~$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

而在Windows系統下,當我們最開始安裝Docker DeskTop時已經一並安裝了,不需要其他操作,可使用同樣的命令驗證。

> docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

docker-compose.yaml

之前說了docker-compose通過執行在yaml文件中定義的服務及其配置來搭建我們的應用,我們需要在執行docker-compose命令的工作目錄下創建一個“docker-compose.yml”文件。

可以先看一個docker-compose.yml文件的例子來對其有個整體印象

version: "3"
services:
    web:
        container_name : myweb
        restart: always
        build: .
        ports:
            - "8000:80"
        volumes:
            - .:/code
            - logvolume01:/var/log
        networks:
            my-net
        depends_on:
            - db
    db:
        image: "mcr.microsoft.com/mssql/server"
        environment:
            SA_PASSWORD: "Your_password123"
            ACCEPT_EULA: "Y"
        networks:
            my-net
volumes:
    logvolume01:{}
networks:
    my-net:
        driver: bridge

通過上面的文件可以看出yml文件中一般分為四個部分

  1.  version :指明compose文件格式的版本,當前使用的是3.x的版本
  2.  services :中定義要用到的容器集合,定義容器所有相關的配置
  3.  volumes :應用要用到的所有數據卷
  4.  networks :應用要使用連接的網絡及其配置

下面對docker-compose.yml中其中常用的定義做一些簡單的記錄。

  build :指定構建鏡像用的dockerfile路徑

  • build: . 就表示當前路徑下的文件名為“Dockerfile”的文件
  • 或者我們可以指定具體路徑和具體dockerfile文件名,context中指定工作目錄,dockerfile指定具體的dockerfile文件名,args后跟構建鏡像時的參數
build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

 image:指定創建容器的鏡像

image :"mcr.microsoft.com/mssql/server"

container_name:給創建的容器取名

contain_name :my-web01

restart:指定重啟的策略

restart: "no"    # 默認,不自動重啟
restart: always    # 容器每次部署都會重新重啟
restart: on-failure  # 到容器異常退出會自動重啟
restart: unless-stopped

ports:映射主機的端口

 ports:
   - "8000:80"    #容器的80端口映射到8000端口

environment:設置環境變量

使用鍵值對的方式賦值

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

使用數組的方式賦值,yaml文件約定是使用“ - ”表示集合

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

volumes :指定容器使用的卷或者bind mount

設置的語法格式為 [SOURCE:]TARGET[:MODE] ,與使用docker命令啟動容器時使用 -v 標識寫法類似。

volumes:
  # 只設定路徑,Docker創建匿名卷掛載到指定路徑
  - /var/lib/mysql

  # 指定絕對路徑使用bind mount到容器的路徑
- /opt/data:/var/lib/mysql # 可使用相對路徑,相對於compose文件路徑 - ./cache:/tmp/cache
:ro
 # 使用命名的卷(datavolume)掛載到容器路徑 
- datavolume:/var/lib/mysql

在compose的3.2版本后可以使用以下語法更詳細的設置,與使用docker命令啟動容器時使用 --mount 標識寫法類似

... ... volumes: - type: volume source: mydata target: /data volume: nocopy: true - type: bind source: ./static target: /opt/app/static
... ...
volumes:
  mydata:

networks:指定容器使用的網絡

services
... ...
  networks:
        my-net:
           ipv4_address: 168.18.0.4  # [可選]為其分配靜態IP
... ...
networks: my-net: driver: bridge # 網絡模式為bridge模式 ipam: config: - subnet:
168.18.0.0/24 # [可選]為其分配靜態IP

depend_on:指定當前容器的依賴容器

services:
  web:
    build: .
  #容器web的啟動要依賴容器redis和容器db,即在創建容器是會依照順序,先創建好redis和db容器在創建web容器
    depends_on:  
      - db    
      - redis
  redis:
    image: redis
  db:
    image: postgres

關於docker-compose.yml中詳細的用法可以參考https://docs.docker.com/compose/compose-file/

Docker-Compose命令

 docker-compose的常用的基本操作命令,和docker命令風格基本一致

  • docker-compose build 啟動構建,構建在yml文件中定義的所有鏡像
  • docker-compose up ,構建鏡像成功之后,執行該命令便可根據鏡像啟動容器
  • docker-compose down ,停止由up命令啟動的所有容器
  • docker-compose ps ,列出由up命令啟動的所有容器
  • docker-compose images ,由build命令構建的所有鏡像
  • docker-compose logs ,查詢日志
  • docker-compose start <service> ,啟動yml中定義的單個服務,使用服務名,不是容器名
  • docker-compose stop <service> ,停止yml中定義的單個服務
  • docker-compose rm <service> ,停止已停止的某個服務
  • docker-compose scale <service1>=3 <service2>=3 ,設置某個服務要啟動的容器的個數
  • docker-compose config 驗證yml文件有效性

更多的命令我們可以輸入 docker-compose --help 查看。

實驗:使用Docker-Compose管理多容器應用

為了簡單起見,我們繼續使用上一篇文章中使用的例子,這里我們使用docker-compose啟動這兩個容器(一個是aps.net core mvc應用,另一個是asp.net webapi應用)。

我們可以手動從0開始創建自己的docker-compose.yml文件,也可以使用ide幫我們自動生成。如果你使用的是vs2019,便可以通過以下的方式自動創建yml文件

之后“解決方案資源管理器”中會多出一個docker-compose的項目。

為了熟悉docker-compose,我們自己創建yml文件。用到的兩個asp.net core項目不用修改任何代碼和上篇文章一樣,來到項目根目錄創建“docker-compose.yml”文件。內容如下。

version: '3.4'

services:
  mvc_demo:
    build:
      context: .
      dockerfile : ./ASP.NET Core3.x MVC Demo/Dockerfile
    container_name : mvcdemo 
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "8081:80"
    networks:
      - demo-net
    restart: always
    depends_on: 
      - api_demo

  api_demo:
    build:
      context: .
      dockerfile : ./ASP.NET Core3.x WebApi Demo/Dockerfile
    container_name : webapidemo 
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    networks:
      - demo-net
    restart: always

networks:
  demo-net:
    driver : bridge

在定義好yml文件之后打開powershell,cd到項目根目錄下。使用 config 命令檢查下yml文件的合法性。

PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose config

networks:
  demo-net:
    driver: bridge
services:
  api_demo:
    build:
      context: D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo
      dockerfile: ./ASP.NET Core3.x WebApi Demo/Dockerfile
    container_name: webapidemo
    environment:
      ASPNETCORE_ENVIRONMENT: Development
    networks:
      demo-net: null
    restart: always
  mvc_demo:
    build:
      context: D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo
      dockerfile: ./ASP.NET Core3.x MVC Demo/Dockerfile
    container_name: mvcdemo
    depends_on:
    - api_demo
    environment:
      ASPNETCORE_ENVIRONMENT: Development
    networks:
      demo-net: null
    ports:
    - published: 8081
      target: 80
    restart: always
version: '3.4'

隨后執行  build  命令構建鏡像。

PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose build --force-rm 

構建成功之后便可以使用 up 啟動所有容器。

PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose up

不出意外,啟動成功,並且控制台中會輸出容器的Console日志(如果不希望這樣可以在使用上面的 up 命令時加上 -d 的參數)

使用命令查看下鏡像和容器的運行狀況。

PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose images   

Container Repository Tag Image Id Size
--------------------------------------------------------------------------- mvcdemo aspnet-core3x-demo_mvc_demo latest 3f015f6687d5 214.1 MB webapidemo aspnet-core3x-demo_api_demo latest c3f6ad95d424 229.5 MB
PS D:\workspace\GitHub_local\ASP.NET
-Core3.x-Demo> docker-compose ps

Name Command State Ports
-------------------------------------------------------------------------- mvcdemo dotnet ASP.NET Core3.x MVC ... Up 0.0.0.0:8081->80/tcp webapidemo dotnet ASP.NET Core3.x Web ... Up 80/tcp

接着訪問我們訪問http://localhost:8081/,可以成功看到和上篇文章中實驗結果一樣頁面和數據,說明容器啟動並運行成功。

參考文獻:

[1] https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/docker-application-development-process/docker-app-development-workflow

[2] Linux安裝Docker-Compose:https://docs.docker.com/compose/install/

[3] Compose file:https://docs.docker.com/compose/compose-file/

[4] https://www.cnblogs.com/cgzl/p/10040590.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM