docker-compose ,docker-stack

1.例子php

version: "3"
services:
  php:
    image: registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
    ports:
       - "38080:80"
    networks:
       - my_php_mysql
    volumes:
       - webdata:/var/www
    deploy:
       mode: replicated
       replicas: 1
       resources:
         limits:
           cpus: '0.2'
           memory: 200M
         reservations:
           cpus: '0.1'
           memory: 50M

  mysql:
    image: docker.io/mysql:5.7.22
    networks:
       - my_php_mysql
    volumes:
       - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    deploy:
       mode: replicated
       replicas: 1
       resources:
         limits:
           cpus: '0.5'
           memory: 200M
         reservations:
           cpus: '0.25'
           memory: 50M
networks:
  my_php_mysql:
    driver: overlay
volumes:
  webdata:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=master,rw"
      device: "master:/opt/mnt/swarm/webdata"
  mysql_data:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=master,rw"
      device: "master:/opt/mnt/swarm/mysqldata"

相關說明

  • build: 指定 Dockerfile 所在文件夾的路徑(能夠是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。html

  • dockerfile: 若是須要指定額外的編譯鏡像的 Dockefile 文件,能夠經過該指令來指定。mysql

  • command:覆蓋容器啓動後默認執行的命令。nginx

command: echo "hello world"
  • env_file:從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。若是經過 docker-compose -f FILE 方式來指定 Compose 模板文件,則 env_file 中變量的路徑會基於模板文件路徑。若是有變量名稱與 environment 指令衝突,則按照慣例,之後者爲準。
env_file: .env
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
  • environment:設置環境變量。你可使用數組或字典兩種格式。 只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據。 environment設置環境變量。你可使用數組或字典兩種格式。只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,能夠用來防止泄露沒必要要的數據。

例如web

environment:
  RACK_ENV: development
  SESSION_SECRET:
或者

environment:
  - RACK_ENV=development
  - SESSION_SECRET

注意,若是變量名稱或者值中用到 true|false,yes|no 等表達布爾含義的詞彙,最好放到引號裏,避免 YAML 自動解析某些內容爲對應的布爾語義。http://yaml.org/type/bool.html 中給出了這些特定詞彙,包括redis

y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
  • expose 暴露端口,但不映射到宿主機,只被鏈接的服務訪問。僅能夠指定內部端口爲參數
expose:
 - "3000"
 - "8000"
  • extends: 基於其它模板文件進行擴展。 例如咱們已經有了一個 webapp 服務,定義一個基礎模板文件爲 common.yml。
# common.yml
webapp:
  build: ./webapp
  environment:
    - DEBUG=false
    - SEND_EMAILS=false

再編寫一個新的 development.yml 文件,使用 common.yml 中的 webapp 服務進行擴展。sql

# development.yml
web:
  extends:
    file: common.yml
    service: webapp
  ports:
    - "8000:8000"
  links:
    - db
  environment:
    - DEBUG=true
db:
  image: postgres

後者會自動繼承 common.yml 中的 webapp 服務及環境變量定義。docker

使用 extends 須要注意:apache

要避免出現循環依賴,例如 A 依賴 B,B 依賴 C,C 反過來依賴 A 的狀況。json

extends 不會繼承 links 和 volumes_from 中定義的容器和數據卷資源。

通常的,推薦在基礎模板中只定義一些能夠共享的鏡像和環境變量,在擴展模板中具體指定應用變量、連接、數據卷等信息。

  • external_links

連接到 docker-compose.yml 外部的容器,甚至 並不是 Compose 管理的外部容器。參數格式跟 links 相似。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql
  • extra_hosts

相似 Docker 中的 --add-host 參數,指定額外的 host 名稱映射信息。

例如:

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

會在啓動後的服務容器中 /etc/hosts 文件中添加以下兩條條目。

8.8.8.8 googledns
52.1.157.61 dockerhub
  • image

指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉去這個鏡像。

例如:

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
  • labels

爲容器添加 Docker 元數據(metadata)信息。例如能夠爲容器添加輔助說明信息。

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"
  • links

連接到其它服務中的容器。使用服務名稱(同時做爲別名)或服務名稱:服務別名 (SERVICE:ALIAS) 格式均可以。

links:
 - db
 - db:database
 - redis

使用的別名將會自動在服務容器中的 /etc/hosts 裏建立。例如:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

被連接容器中相應的環境變量也將被建立。

  • log_driver

相似 Docker 中的 --log-driver 參數,指定日誌驅動類型。

目前支持三種日誌驅動類型。

log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
  • log_opt

日誌驅動的相關參數。

例如

log_driver: "syslog"
log_opt:
  syslog-address: "tcp://192.168.0.42:123"
  • net

設置網絡模式。使用和 docker client 的 --net 參數同樣的值。

net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
  • pid

跟主機系統共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統之間能夠經過進程 ID 來相互訪問和操做。

pid: "host"
  • ports

暴露端口信息。

使用宿主:容器 (HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:當使用 HOST:CONTAINER 格式來映射端口時,若是你使用的容器端口小於 60 而且沒放到引號裏,可能會獲得錯誤結果,由於 YAML 會自動解析 xx:yy 這種數字格式爲 60 進制。爲避免出現這種問題,建議數字串都採用引號包括起來的字符串格式。

  • security_opt

指定容器模板標籤(label)機制的默認屬性(用戶、角色、類型、級別等)。

例如配置標籤的用戶名和角色名。

security_opt:
    - label:user:USER
    - label:role:ROLE
  • ulimits

指定容器的 ulimits 限制值。

例如,指定最大進程數爲 65535,指定文件句柄數爲 20000(軟限制,應用能夠隨時修改,不能超過硬限制) 和 40000(系統硬限制,只能 root 用戶提升)。

ulimits:
    nproc: 65535
    nofile:
      soft: 20000
      hard: 40000
  • volumes

數據卷所掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。

該指令中路徑支持相對路徑。例如

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro
  • volumes_driver

較新版本的 Docker 支持數據卷的插件驅動。

用戶能夠先使用第三方驅動建立一個數據卷,而後使用名稱來訪問它。

此時,能夠經過 volumes_driver 來指定驅動。

volume_driver: mydriver
  • volumes_from 從另外一個服務或容器掛載它的數據卷。
volumes_from:
 - service_name
 - container_name

其它指令 此外,還有包括 cpu_shares, cpuset, domainname, entrypoint, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, stdin_open, tty, user, working_dir 等指令,基本跟 docker-run 中對應參數的功能一致。

例如,指定使用 cpu 核 0 和 核 1,只用 50% 的 CPU 資源:

cpu_shares: 73
cpuset: 0,1
  • 指定服務容器啓動後執行的命令。
entrypoint: /code/entrypoint.sh

指定容器中運行應用的用戶名。

user: nginx 指定容器中工做目錄。

working_dir: /code 指定容器中搜索域名、主機名、mac 地址等。

domainname: your_website.com hostname: test mac_address: 08-00-27-00-0C-0A 指定容器中

ipc: host 指定容器中內存和內存交換區限制都爲 1G。

mem_limit: 1g memswap_limit: 1g 容許容器中運行一些特權命令。

privileged: true 指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,在生產環境中推薦配置爲 always 或者 unless-stopped。

restart: always 以只讀模式掛載容器的 root 文件系統,意味着不能對容器內容進行修改。

read_only: true 打開標準輸入,能夠接受外部輸入。

stdin_open: true 模擬一個假的遠程控制檯。

tty: true 讀取環境變量 從 1.5.0 版本開始,Compose 模板文件支持動態讀取主機的系統環境變量。

例如,下面的 Compose 文件將從運行它的環境中讀取變量 ${MONGO_VERSION} 的值,並寫入執行的指令中。

db: image: "mongo:${MONGO_VERSION}" 若是執行 MONGO_VERSION=3.0 docker-compose up 則會啓動一個 mongo:3.2 鏡像的容器;若是執行 MONGO_VERSION=2.8 docker-compose up 則會啓動一個 mongo:2.8 鏡像的容器

相關文章
相關標籤/搜索