每一個docker-compose.yml必須定義image
或者build
中的一個,其它的是可選的。java
指定鏡像tag或者ID。示例:mysql
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
注意,在version 1
裏同時使用image
和build
是不容許的,version 2
則能夠,若是同時指定了二者,會將build
出來的鏡像打上名爲image
標籤。web
buildredis
用來指定一個包含Dockerfile文件的路徑。通常是當前目錄.。Fig將build並生成一個隨機命名的鏡像。sql
注意,在version 1
裏bulid
僅支持值爲字符串。version 2
裏支持對象格式。
docker
build: ./dir build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
context
爲路徑,dockerfile
爲須要替換默認docker-compose
的文件名,args
爲構建(build)過程當中的環境變量,用於替換Dockerfile裏定義的ARG
參數,容器中不可用。示例:
Dockerfile:數據庫
ARG buildno ARG password RUN echo "Build number: $buildno" RUN script-requiring-password.sh "$password"
docker-compose.yml:json
build: context: . args: buildno: 1 password: secret build: context: . args: - buildno=1 - password=secret
用來覆蓋缺省命令。示例:ubuntu
command: bundle exec thin -p 3000
command
也支持數組形式:數組
command: [bundle, exec, thin, -p, 3000]
用於連接另外一容器服務,如須要使用到另外一容器的mysql服務。能夠給出服務名和別名;也能夠僅給出服務名,這樣別名將和服務名相同。同docker run --link
。示例:
links: - db - db:mysql - redis
使用了別名將自動會在容器的/etc/hosts
文件裏建立相應記錄:
172.17.2.186 db 172.17.2.186 mysql 172.17.2.187 redis
因此咱們在容器裏就能夠直接使用別名做爲服務的主機名。
用於暴露端口。同docker run -p
。示例:
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
expose提供container之間的端口訪問,不會暴露給主機使用。同docker run --expose
。
expose: - "3000" - "8000"
掛載數據卷。同docker run -v
。示例:
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
掛載數據卷容器,掛載是容器。同docker run --volumes-from
。示例:
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
container:container_name
格式僅支持version 2
。
添加環境變量。同docker run -e
。能夠是數組或者字典格式:
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
使用 Compose 時,最大的好處就是少打啓動命令,可是通常項目容器啓動的順序是有要求的,若是直接從上到下啓動容器,必然會由於容器依賴問題而啓動失敗。
例如在沒啓動數據庫容器的時候啓動了應用容器,這時候應用容器會由於找不到數據庫而退出,爲了不這種狀況咱們須要加入一個標籤,就是 depends_on,這個標籤解決了容器的依賴、啓動前後的問題。
例以下面容器會先啓動 redis 和 db 兩個服務,最後才啓動 web 服務:
ersion: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
注意的是,默認狀況下使用 docker-compose up web 這樣的方式啓動 web 服務時,也會啓動 redis 和 db 兩個服務,由於在配置文件中定義了依賴關係。
連接搭配docker-compose.yml
文件或者Compose
以外定義的服務,一般是提供共享或公共服務。格式與links
類似:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
注意,external_links
連接的服務與當前服務必須是同一個網絡環境。
添加主機名映射。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229
將會在/etc/hosts
建立記錄:
162.242.195.82 somehost 50.31.209.229 otherhost
繼承自當前yml文件或者其它文件中定義的服務,能夠選擇性的覆蓋原有配置。
extends: file: common.yml service: webapp
service
必須有,file
可選。service
是須要繼承的服務,例如web
、database
。
設置網絡模式。同docker的--net
參數。
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
自定義dns服務器。
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
完整列子:
zookeeper: image: ce3dc5339ed2 #指定爲鏡像名稱或鏡像 ID privileged: false restart: always # 默認值爲 no ,即在任何狀況下都不會從新啓動容器;當值爲 always 時,容器老是從新啓動;當值爲 on-failure 時,當出現 on-failure #報錯容器退出時,容器從新啓動。 log_driver: json-file #默認的driver是json-file。只有json-file和journald能夠經過docker-compose logs顯示日誌 ports: - ip::2181/tcp:2181/tcp #暴露端口信息。 #使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。 # - "3000" #- "8000:8000" #- "127.0.0.1:8001:8001" #注:當使用 HOST:CONTAINER 格式來映射端口時,若是你使用的容器端口小於 60 你可能會獲得錯誤得結果,由於 YAML 將會解析 xx:yy 這種數字格式爲 60 進制。因此建議採用字符串格式。 volumes: - /data/zookeeper/logs/:/zookeeper/logs/ - /data/zookeeper/data/:/zookeeper/data/ - /data/zookeeper/conf/:/zookeeper/conf/ # 掛載一個目錄或者一個已存在的數據卷容器,能夠直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,後者對於容器來講,數據卷是隻讀的,這樣能夠有效保護宿主機的文件系統。 #Compose的數據卷指定路徑能夠是相對路徑,使用 . 或者 .. 來指定相對目錄。 #卷掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。 command: /root/zookeeper.sh #覆蓋容器啓動後默認執行的命令。 environment: -.utf8 - TZ=Asia/Shanghai #設置環境變量。你可使用數組或字典兩種格式。 #只給定名稱的變量會自動獲取它在 Compose 主機上的值,能夠用來防止泄露沒必要要的數據。 #environment: #- RACK_ENV=development #- SESSION_SECRET # depends_on #在使用 Compose 時,最大的好處就是少打啓動命令,可是通常項目容器啓動的順序是有要求的,若是直接從上到下啓動容器,必然會由於容器依賴問題而啓動失敗。 #例如在沒啓動數據庫容器的時候啓動了應用容器,這時候應用容器會由於找不到數據庫而退出,爲了不這種狀況咱們須要加入一個標籤,就是 depends_on,這個標籤解決了容器的依賴、啓動前後的問題。 #例以下面容器會先啓動 redis 和 db 兩個服務,最後才啓動 web 服務: #version: '2' #services: # web: # build: . # depends_on: # - db # - redis #redis: # image: redis # db: # image: postgres #links #還記得上面的depends_on吧,那個標籤解決的是啓動順序問題,這個標籤解決的是容器鏈接問題,與Docker client的--link同樣效果,會鏈接到其它服務中的容器。 #格式以下: #links: #- db #- db:database #- redis #使用的別名將會自動在服務容器中的/etc/hosts裏建立。例如: #172.12.2.186 db #172.12.2.186 database #172.12.2.187 redis sso: image: 698063d64ab5 privileged: false restart: always log_driver: json-file ports: - 172.16.0.13:7000/tcp:7000/tcp - 172.16.0.13:10000/tcp:10000/tcp volumes: - /data/tomcat/sso/logs/:/tomcat/logs/ - /data/tomcat/sso/server.xml:/tomcat/conf/server.xml - /data/tomcat/sso/catalina.sh:/tomcat/bin/catalina.sh - /data/tomcat/sso/sso.properties:/tomcat/webapps/sso/WEB-INF/classes/sso.properties - /data/webapps/sso/:/tomcat/webapps/sso/ command: /root/tomcat.sh environment: -.utf8 - TZ=Asia/Shanghai - DEBUGPORT=10000 - CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom