容器編排 Docker Compose
在我們啟動容器的時候經常要使用docker run 指定很多參數,當我們需要管理很多容器時,使用這樣的方式會給我們的運維人員帶來很大的負擔,docker compose容器編排工具無疑是解決這個一問題的利器。
Docker Compose是用來管理多容器應用的工具,我們可以使用compose file 文件來配置容器的應用和服務,編寫好compose file 文件以後,我們只需要使用一條簡單的命令就可以創建並啟動我們需要的應用。
使用compose一般有三個步驟:
1、編寫Dockerfile,定義鏡像的構建參數。
2、編寫docker-compose.yml文件,定義應用的掛載,環境變量,啟動參數等。
3、執行 docker-compose up 命令,自動執行構建鏡像並啟動容器和應用。
安裝Compose
這裏只介紹Linux環境下的安裝。
執行如下命令:
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
可以根據的自己的需求安裝不同的版本,修改鏈接中的版本號即可。也可以直接去https://github.com/docker/compose/releases 上下載需要的版本。
對文件添加執行權限:
chmod +x /usr/local/bin/docker-compose
安裝完成後,執行compose命令驗證是否安裝成功:
# docker-compose --version docker-compose version 1.14.0, build c7bdf9e
Compose file 常用語法介紹
compose使用的是YAML格式的文件,我們可以使用它來定義服務、網絡和卷。compose file的固定命名為 docker-compose.yml。
這裏只列出常用的信息,具體用法參考:https://docs.docker.com/compose/compose-file/
build: 構建鏡像,指定構建的路徑,文件,源鏡像等信息。
build: context: . # 指定Dockerfile的構建路徑,或者是一個url的git倉庫地址 dockerfile: Dockerfile-abcd #可以指定Dockerfile的名稱,如果不是默認名稱時。 args: #添加構建參數,環境變量參數只能在構建過程中訪問,使用時需要先在Dockerfile中定義。 - buildno=1 #yaml語法,‘=’兩邊不能有空格 - password=secret #也可以使用列表的方式 ‘password: secret‘
command: 用於重新覆蓋Dockerfile中的COMMAND命令。
command: COMMAND args
也可以使用列表的形式:
command: ["comand1", "command2"]
devices: 映射宿主機的設備到容器中。
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on: 執行此模塊的行為時,所依賴的其他模塊必須已經完成。
services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
dns: 指定dns.
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
env_file: 從文件中添加環境變量參數。如果您使用docker-compose -f FILE指定了一個Compose文件,則env_file中的路徑與文件所在的目錄相關。
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
expose:暴露端口而不將它們發布到主機 - 它們只能被鏈接服務訪問。 只能指定內部端口。
expose: - "3000" - "8000"
image: 指定要從中啟動容器的鏡像,可以是存儲庫/標簽或部分映像ID。
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
links: 鏈接到另一個服務中的容器。 請同時指定服務名稱和鏈接別名(SERVICE:ALIAS),或僅指定服務名稱。
logging: 日誌服務。支持三種日誌驅動,json-file, syslog, none. 默認的為json-file.
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
services: some-service: image: some-service logging: driver: "json-file" options: max-size: "200k" # 日誌文件最大不超過200K max-file: "10" # 日誌文件最多不超過10個
network_mode: 指定網絡模式。與使用docker 命令的-net參數一樣。
network_mode: "bridge" network_mode: "host" network_mode: "none"
networks: 指定所要加入的網絡。
IPV4_ADDRESS:指定加入這個網絡的IP地址。
services: some-service: networks: - some-network - other-network
services: app: image: busybox command: ifconfig networks: app_net: ipv4_address: 172.16.238.10 ipv6_address: 2001:3984:3989::10 networks: app_net: driver: bridge enable_ipv6: true ipam: driver: default config: - subnet: 172.16.238.0/24 - subnet: 2001:3984:3989::/64
ports: 對外開放的端口。
短語法模式:
ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp"
長語法模式(版本v3.2):
target:容器內部端口
published:對外暴露的端口
protocol:協議類型
mode: host 用於在每個節點上發布主機端口的主機,或將要進行負載均衡的群模式端口的入口。
ports: - target: 80 published: 8080 protocol: tcp mode: host
vlumes: 掛載宿主機目錄,或命名卷。
短語法:
volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume - datavolume:/var/lib/mysql
長語法(v3.2):
volumes: - type: volume source: mydata target: /data volume: nocopy: true - type: bind source: ./static target: /opt/app/static
restart: 定義自啟動。
restart: "no" restart: always restart: on-failure restart: unless-stopped
domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir: 指定屬性。 與使用docker run 指定參數功能一樣。
user: postgresql working_dir: /code domainname: foo.com hostname: foo ipc: host mac_address: 02:42:ac:11:65:43 privileged: true read_only: true shm_size: 64M stdin_open: true tty: true
本文出自 “Trying” 博客,請務必保留此出處http://tryingstuff.blog.51cto.com/4603492/1948706
容器編排 Docker Compose