Docker學習—Compose

前言

 前面《Docker學習—DockerFile》文中介紹了dockerfile相關的語法,及使用方式;接下來了解docker三劍客之一的 Compose;接下來詳細學習。html

1、docker-compose介紹

 Docker-Compose項目是Docker官方的開源項目,主要使用Python編寫;用於定義和運行多容器Docker應用程序的工具。使用Compose,可使用YAML文件來配置應用程序的服務。而後使用一個命令,從配置建立並啓動全部服務。node

 Compose是一個定位「定義和運行多個Docker容器應用的工具」,其前身是Fig,目前使用的Compose仍然兼容Fig格式的模板文件。git

 Compose中包含兩個重要概念:github

  • 服務(Service):一個應用的容器,實際能夠包含若干個運行相同鏡像的容器實例
  • 項目(Project):一組相關聯的應用容器組成的完整業務單元,在docker-compose.yml文件中定義 

 Compose的默認管理對象是項目,經過子命令對項目中的一組容器進行便捷地生命週期管理。redis

2、docker-compose安裝

 Compose目前已經徹底支持Linux、Mac OS和Windows,在安裝Compose以前,須要先安裝Docker;(本篇主要在window中使用)sql

 安裝成功後命令行中輸入:docker compose -h  docker

 

3、docker-compose 命令

 安裝成功後來看下compose主要包含的命令:windows

  build              #生成或重建服務
  bundle             #從Compose文件生成Docker bundle
  config             #驗證並查看撰寫文件
  create             #建立服務
  down               #中止並刪除容器、網絡、鏡像和卷
  events             #從容器接收實時事件
  exec               #在正在運行的容器中執行命令
  help               #獲取命令幫助
  images             #顯示鏡像列表
  kill               #殺死容器
  logs               #查看容器的輸出
  pause              #暫停服務
  port               #打印端口綁定的公共端口
  ps                 #顯示容器列表
  pull               #拉取服務鏡像
  push               #推送服務鏡像
  restart            #從新啓動服務
  rm                 #移除中止的容器
  run                #運行一次性命令
  scale              #設置服務的容器數
  start              #啓動服務
  stop               #暫停服務
  top                #顯示正在運行的進程
  unpause            #取消暫停服務
  up                 #建立並啓動容器
  version            #顯示Docker-Compose版本信息

 對命令有大概印象後,接下來就須要對重點內容(docker-compose.yml)瞭解;每一個命令具體的使用參數在使用是具體介紹centos

3、docker-compose.yml編寫

 docker-compose.yml已有多個版本:以下api

  首先咱們先來看一個官方示例docker-compose.yml內容:

version: "3.8" services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        max_replicas_per_node: 1
        constraints:
          - "node.role==manager"

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager" networks:
  frontend:
  backend:

volumes:
  db-data:

 

 根據以上示例格式能夠看出docker-compose.yml中主要包含如下內容:

  • version: 指定當前docker-compose.yml的版本,版本與Docker Engine版本存在對應關係,如:v3.8對應 Docker Engine 19.03.0+
  • services:服務,能夠定義業務須要的一些服務,每一個服務可包含服務名稱、使用鏡像、掛載數據卷、使用的網絡、依賴服務等信息
  • networks:應用的網絡,能夠定義網絡名稱、使用的網絡類型等
  • volumes:數據卷,能夠定義數據卷,而後掛載到不一樣的服務下使用

 接着就來看下相關命令的語法及具體含義

  

docker-compose.yml命令
序號 所屬 命令 說明
1 services build 基於Dockerfile,指定Dockerfile所在路徑,Compose會利用它自動構建鏡像,而後啓動服務容器 
2 cap_add,cap_drop 添加或刪除容器功能
3 command 覆蓋容器啓動後默認執行的命令
4 config 使用「每服務配置」配置在每一個服務的基礎上授予對配置的訪問權限。存在兩種語法方式:短語法、長語法
5 cgroup_parent 爲容器指定一個可選的父cgroup
6 container_name 容器名稱
7 depends_on 容器依賴,用於指定服務依賴的其餘服務
8 depoly

指定與服務的部署和運行相關的配置。這隻在使用docker stack deploy部署到一個羣時生效,docker compose up和docker compose run將忽略此項。

9 devices 設備映射列表。
10 dns 自定義DNS服務器。能夠是單個值或列表。
11 dns_search 自定義DNS搜索域。能夠是單個值或列表。
12 entrypoint 覆蓋默認入口點
13 env_file 從文件添加環境變量。能夠是單個值或列表
14 environment 添加環境變量。可使用數組或字典。任何布爾值(true、false、yes、no)都須要用引號括起來,以確保它們不會被YML解析器轉換爲true或false。
15 expose 暴露端口而不將它們發佈到主機-它們只能被連接的服務訪問。只能指定內部端口。
16 external_links 連接到在此範圍以外docker-compose.yml甚至在Compose以外開始的容器,尤爲是對於提供共享或公共服務的容器。 同時指定容器名稱和連接別名()時,請external_links遵循與legacy選項類似的語義。
17 extra_hosts 添加主機名映射。使用與docker客戶端相同的值
18 healthcheck 配置運行的檢查以肯定該服務的容器是否「健康」
19 image 指定要從中啓動容器的鏡像。能夠是存儲庫/標籤或鏡像ID
20 init 在容器內運行一個初始化程序,以轉發信號並獲取進程。設置此選項能夠true爲服務啓用此功能。 
21 isolation 指定容器的隔離技術。在Linux上,惟一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。
22 labels 使用Docker標籤將元數據添加到容器中。您可使用數組或字典。
23 links 連接到另外一個服務中的容器。指定服務名稱和連接別名("SERVICE:ALIAS"),或者僅指定服務名稱。
24 logging 服務的日誌記錄配置
25 network_mode 網絡模式。使用與客戶端服務相同的網絡名稱和服務-參數docker相同。
26 networks 要加入的網絡,引用頂級網絡鍵下的條目。
27 pid 將PID模式設置爲主機PID模式。這將打開容器和主機操做系統之間的PID地址空間共享。
28 ports 暴露端口 
29 restart no是默認的重啓策略,在任何狀況下都不會重啓容器。當always指定時,容器老是從新啓動。該 on-failure若是退出代碼指示的故障錯誤政策重啓的容器。unless-stopped老是從新啓動容器,除非容器中止(手動或其餘方式)。
30 secrets 使用按服務secrets 配置,按服務授予對機密的訪問權限。
31 security_opt 覆蓋每一個容器的默認標籤方案。
32 stop_grace_period 指定在發送SIGKILL以前,若是容器不處理SIGTERM(或用stop_nusignal指定的任何中止信號),嘗試中止該容器時要等待多長時間。默認10s
33 stop_signal 設置中止容器的替代信號。默認狀況下,stop使用SIGTERM。使用stop_signal設置替代信號會致使stop發送該信號。
34 sysctls 要在容器中設置的內核參數。可使用數組或字典。
35 tmpfs 在容器內安裝一個臨時文件系統。能夠是單個值或列表。 
36 ulimits 覆蓋容器的默認ulimit。您能夠將單個限制指定爲整數,也能夠將軟/硬限制指定爲映射。
37 userns_mode 若是Docker守護程序配置了用戶名稱空間,則禁用此服務的用戶名稱空間。
38 volumes

掛載主機路徑或命名卷,指定爲服務的子選項。能夠將主機路徑安裝爲單個服務的定義的一部分,而無需在頂級volumes中進行定義。

可是,若是要在多個服務之間重用卷,請在頂級volumes密鑰中定義一個命名卷。

將命名卷與服務,羣集和堆棧文件一塊兒使用。

39

domainname, hostname, ipc, mac_address, privileged,

read_only, shm_size, stdin_open, tty, user, working_dir

其中每一個都是一個值,相似於其 docker run對應項。
40 Volumes dirver 指定該卷應使用哪一個卷驅動程序。默認爲Docker Engine配置爲使用的任何驅動程序,大多數狀況下爲 local。
41 dirver_opts 指定選項列表做爲鍵值對,以傳遞給該卷的驅動程序。
42 external 若是設置爲true,則指定此卷是在Compose以外建立的。docker-compose up不會嘗試建立它,若是不存在則引起錯誤。
43 labels 使用Docker標籤向容器添加元數據。可使用數組或字典。
44 name 爲此卷設置一個自定義名稱。名稱字段可用於引用包含特殊字符的卷。
45 Networks dirver 指定該網絡應使用哪一個驅動程序。
46 dirver_opts 指定選項列表做爲要傳遞給此網絡的驅動程序的鍵值對
47 attachable 僅當驅動程序設置爲覆蓋時使用。
48 enable_ipv6 在此網絡上啓用IPv6網絡。
49 ipam 指定自定義IPAM配置
50 internal 默認狀況下,Docker還會鏈接一個網橋網絡來提供外部鏈接。若是要建立外部隔離的覆蓋網絡,能夠將此選項設置爲true。
51 labels 使用Docker標籤將元數據添加到容器中 。您可使用數組或字典。
52 external 若是設置爲true,則指定此網絡是在Compose以外建立的。docker-compose up不會嘗試建立它,若是不存在則引起錯誤。
53 name 爲此網絡設置一個自定義名稱。名稱字段可用於引用包含特殊字符的網絡。

   經過以上內容發現,services中相關命令是docker相關配置項關聯;接下來就來驗證經過docker-compose.yml運行應用 

4、應用案例

 實現效果:基於身份認證時,相關示例代碼實現,經過docker-compose啓動相關全部服務容器,運行程序。

 A、在解決方案目錄下添加docker-compose.yml文件:

 添加方式:

 一、手動添加文件

 二、經過vs自動添加:選中須要添加項目右鍵,如圖

 添加後以下:

 

 

 B、修改內容以下:(該docker-compose.yml比較簡單)

version: '3.4'

services:
  cz.identityserver:
    image: ${DOCKER_REGISTRY-}czidentityserver
    build:
      context: .
      dockerfile: cz.IdentityServer/Dockerfile

  cz.api.order:
    image: ${DOCKER_REGISTRY-}czapiorder
    build:
      context: .
      dockerfile: cz.Api.Order/Dockerfile


  cz.api.goods:
    image: ${DOCKER_REGISTRY-}czapigoods
    build:
      context: .
      dockerfile: cz.Api.Goods/Dockerfile


  cz.mvcclient:
    image: ${DOCKER_REGISTRY-}czmvcclient
    build:
      context: .
      dockerfile: cz.MVCClient/Dockerfile

 

 C、執行命令docker-compose up命令:執行完成看到如下輸出,則編譯啓動完成。

  

  D、在docker管理頁面中查看以下:

  

後續:

 本篇內容先對docker-compose內容進行了相關介紹,下面將對Swarm、Machine、K8S 進行應用學習。

參考:

  https://docs.docker.com/compose/

  https://docs.docker.com/compose/compose-file/

相關文章
相關標籤/搜索