Docker系列13:容器編排(1)

1、容器編排基礎

一、容器編排概念

  • 能夠指定各個容器中的程序是有依賴關係的
  • 好比有個web服務必須在mysql正常的狀況下,才能運行,那麼這個時候就是web容器是依賴mysql容器的,只有mysql容器正常啓動,web容器才能啓動。

    二、容器編排工具

  • docker compose
  • k8s
  • k3s

    2、compose詳解

一、什麼是compose

  • Docker Compose 將所管理的容器分爲三層,分別是工程(project)、服務(service)、容器(container)
  • Docker Compose 運行目錄下的全部文件(docker-compose.yml)組成一個工程,一個工程包含多個服務,每一個服務中定義了容器運行的鏡像、參數、依賴,一個服務可包括多個容器實例

二、安裝compse

方法1:用提供的這個conpose文件,將這個文件放到/usr/local/bin
Docker系列13:容器編排(1)
Docker系列13:容器編排(1)
方法2:用epel和extra源中的安裝包
1)配置yum源php

[root@host1 ~]# cat /etc/yum.repos.d/epel.repo 
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7Server/x86_64/
enabled=1
gpgcheck=0

2)安裝docker-composemysql

[root@host1 ~]# yum install docker-compose -y

三、compose參數詳解

先看一個dyml文件樣例
Docker系列13:容器編排(1)linux

參數1:build

  • build,它能夠指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像啓動服務容器。
  • 也能夠是相對路徑,只要上下文肯定就能夠讀取到 Dockerfile。
     

    參數2:context

  • 這個是用來指定dockerfile文件的工做目錄的
  • 這是build的一個子選項

參數3:dockerfile

  • 指定具體的dockerfile來作鏡像
  • 這是build的一個子選項

參數4:ARGS

  • 設置變量,這些變量僅僅在build的過程當中纔會用到
  • 這是build的一個子選項

參數5:labels

  • 這是build的一個子選項
  • 用來指定build過程當中的元數據

參數6:shm_size

  • 這是build的一個子選項,控制基於build構建的鏡像的參數配置
  • /dev/shm是linux中系統中物理內存的映射,使用/dev/shm對文件操做的效率會高不少,我在優化系統的時候,經常使用用到

參數7:command

  • 使用 command 能夠覆蓋容器啓動後默認執行的命令。
     

    參數8:image

  • image 則是指定服務的鏡像名稱或鏡像 ID。
  • 若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
    image: redis
    image: ubuntu:14.04
    image: tutum/influxdb
    image: example-registry.com:4000/postgresql
    image: a4bc65fd

參數9:container_name

  • 可使用這個標籤指定容器名稱

參數10:depends_on

  • 這個標籤解決了容器的依賴、啓動前後的問題

案例:下面容器會先啓動 redis 和 db 兩個服務,最後才啓動 web 服務:

Docker系列13:容器編排(1)

參數11:dns

  • 指定DNS服務器的地址
    dns: 8.8.8.8
    dns:
     - 8.8.8.8
     - 9.9.9.9

參數12:dns_search

  • 設置搜索域
    dns_search: example.com
    dns_search:
     - dc1.example.com
     - dc2.example.com

參數13:tmpfs

  • 掛載臨時目錄到容器內部
    tmpfs:
     - /run
     - /tmp

參數14:entrypoint

  • 用於覆蓋 Dockerfile 中的定義
    entrypoint:
       - php
       - -d
       - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
       - -d
       - memory_limit=-1
       - vendor/bin/phpunit

       

    參數15:env_file

  • docker-compose.yml 中能夠定義一個專門存放變量的文件。
  • 若是經過 docker-compose -f FILE 指定了配置文件,則 env_file 中路徑會使用配置文件路徑。
  • 若是有變量名稱與 environment 指令衝突,則之後者爲準。
    env_file:
     - ./common.env
     - ./apps/web.env
     - /opt/secrets.env

參數16:environment

  • 這個標籤的做用是設置鏡像變量,它能夠保存變量到鏡像裏面,也就是說啓動的容器也會包含這些變量設置,這是與 arg 最大的不一樣。
  • environment 和 Dockerfile 中的 ENV 指令同樣會把變量一直保存在鏡像、容器中,相似 docker run -e 的效果。
    environment:
    RACK_ENV: development
    SHOW: 'true'
    SESSION_SECRET:

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

#### 參數17:expose
* 這個標籤與Dockerfile中的EXPOSE指令同樣,用於指定暴露的端口,可是隻是做爲一種參考
* 實際上docker-compose.yml的端口映射還得ports這樣的標籤。

expose:redis

  • "3000"
  • "8000"

參數18:external_links

  • 爲了使Compose可以鏈接這些不在docker-compose.yml中定義的容器,external_links可讓Compose項目裏面的容器鏈接到那些項目配置外部的容器
     external_links:
    - redis_1
    - project_db_1:mysql
    - project_db_1:postgresql

參數19:extra_hosts

  • 添加主機名的標籤,就是往/etc/hosts文件中添加一些記錄
    extra_hosts:
    - "somehost:162.242.195.82"
    - "otherhost:50.31.209.229"

標籤20:labels

  • 向容器添加元數據,和Dockerfile的LABEL指令一個意思
    labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""
    labels:
     - "com.example.description=Accounting webapp"
     - "com.example.department=Finance"
     - "com.example.label-with-empty-value"

標籤21:links

  • depends_on吧,那個標籤解決的是啓動順序問題
  • 這個標籤解決的是容器鏈接問題,與Docker client的--link同樣效果,會鏈接到其它服務中的容器。
    links:
    - db
    - db:database
    - redis

標籤22:logging

  • 這個標籤用於配置日誌服務。
    logging:
    driver: syslog
    options:
    syslog-address: "tcp://192.168.0.42:123"

標籤23:pid

  • 容器使用這個標籤將可以訪問和操縱其餘容器和宿主機的名稱空間。
  • pid: "host":將PID模式設置爲主機PID模式,跟主機系統共享進程命名空間。

標籤24:ports

  • 映射端口的標籤。
  • 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口。
    ports:
    - "3000"
    - "8000:8000"
    - "49100:22"
    - "127.0.0.1:8001:8001"
  • 當使用HOST:CONTAINER格式來映射端口時,若是你使用的容器端口小於60你可能會獲得錯誤得結果
  • 由於YAML將會解析xx:yy這種數字格式爲60進制。因此建議採用字符串格式。

標籤25:security_opt

  • 爲每一個容器覆蓋默認的標籤。簡單說來就是管理所有服務的標籤。好比設置所有服務的user標籤值爲USER。
    security_opt:
     - label:user:USER
     - label:role:ROLE

標籤26:stop_signal

  • 設置另外一個信號來中止容器。
  • 在默認狀況下使用的是SIGTERM中止容器。

標籤27:volumes

  • 掛載一個目錄或者一個已存在的數據卷容器
  • 能夠直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,後者的數據卷是隻讀的
  • Compose的數據卷指定路徑能夠是相對路徑,使用 . 或者 .. 來指定相對目錄。

標籤28:volumes_from

  • 從其它容器或者服務掛載數據卷
  • 可選的參數是 :ro或者 :rw,前者表示容器只讀,後者表示容器對數據卷是可讀可寫的
  • 默認狀況下是可讀可寫的。
    volumes_from:
     - service_name
     - service_name:ro
     - container:container_name
     - container:container_name:rw

    標籤29:cap_add, cap_drop

  • 添加或刪除容器的內核功能

標籤30:cgroup_parent

  • 指定一個容器的父級cgroup。

標籤31:devices

  • 設備映射列表。與Docker client的--device參數相似。

標籤32:extends

  • 這個標籤能夠擴展另外一個服務,擴展內容能夠是來自在當前文件,也能夠是來自其餘文件
  • 相同服務的狀況下,後來者會有選擇地覆蓋原有配置。
    extends:
    file: common.yml
     service: webapp

    標籤33:network_mode

  • 設置網絡模式
  • 與Docker client的--net參數相似,只是相對多了一個service:[service name] 的格式
    network_mode: "bridge"
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"
    network_mode: "container:[container name/id]"

    標籤34:networks

    services:
    some-service:
       networks:
        - some-network
        - other-network

    端口暴露問題

  • ports:暴露端口信息。使用:宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。
  • expose:暴露端口,但不映射到宿主機,只被鏈接的服務訪問。

關於控制啓動順序的問題

  • depends_on:表示服務以前的依賴關係,有兩個效果:
  • 1)docker-compose up,啓動web服務以前、啓動redis、db。
  • 2)docker-compose up web,啓動web容器時,檢查依賴depends_on的配置內容,先啓動db和redis
    version: '2'
    services: 
    web:
      build: .
       depends_on:
          - db
         - redis
    redis:   
        image: redis
    db:   
       image: postgres
相關文章
相關標籤/搜索