version:指定 docker-compose.yml 的版本
執行docker-compose.yml文件之前先查看yml文件的版本信息version 和docker-compose的版本是否匹配一致
不一致要卸載docker-compose安裝適配的版本
- V1 版本的 docker-compose.yml 只被支持到 docker-compose 1.6.x。再往后的 docker-compose 版本就不再支持 V1 版本的 docker-compose.yml
V1 版本的 docker-compose.yml 文件格式主要區別就是:
- 沒有開頭的 version 聲明 - 沒有 services 聲明 - 不支持 depends_on - 不支持命名的 volumes, networks, build arguments 聲明
- V2版本僅支持單機模式
- V3版本支持單機模式也支持多機模式
version: '2' services: web: #服務名,自定義的 image: dockercloud/hello-world #指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。 ports: - 8080 networks: - front-tier - back-tier redis: image: redis links: - web networks: - back-tier lb: image: dockercloud/haproxy ports: - 80:80 links: - web networks: - front-tier - back-tier volumes: - /var/run/docker.sock:/var/run/docker.sock networks: front-tier: driver: bridge back-tier: driver: bridge
version: '2' services: c-chemical-mysql: #服務名,自定義的 build: context: ./ dockerfile: ./doc/db/Dockerfile environment: MYSQL_ROOT_PASSWORD: root restart: always container_name: c-chemical-mysql image: c-chemical-mysql #指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。 ports: - 13306:3306 volumes: - ./doc/conf/mysql/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf privileged: true c-chemical-redis: image: redis:4.0.10 restart: always container_name: c-chemical-redis volumes: - ./doc/conf/redis/redis.conf:/etc/redis/redis.conf command: redis-server /etc/redis/redis.conf
一份標准配置文件應該包含 version、services、networks 三大部分,其中最關鍵的就是 services 和 networks 兩個部分
2. build
服務可以基於鏡像和 Dockerfile兩種方式構建。build指定 Dockerfile 的路徑。Compose 根據Dockerfile構建鏡像,然后使用構建好的鏡像啟動服務容器。
Dockerfile的路徑可以是絕對路徑、相對路徑,或者設定上下文根目錄,然后以該目錄為准指定 Dockerfile。
build: /path/to/build/dir build: ./dir build: context: ../ dockerfile: path/of/Dockerfile
注意 build 都是一個目錄,dockerfile 標簽指定Dockerfile 文件。
如果同時指定了 image 和 build 兩個標簽,那么 Compose 會構建鏡像並且把鏡像命名為 image 后面的那個名字。
command
command 容器啟動后默認執行命令
也可以寫成類似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
container_name
Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>
雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個標簽指定:
container_name: app
environment
環境變量設置,可使用數組或字典兩種方式。示例:
environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET
privileged: true
大約在0.6版,privileged被引入docker。
使用該參數,container內的root擁有真正的root權限。
否則,container內的root只是外部的一個普通用戶權限。
privileged啟動的容器,可以看到很多host上的設備,並且可以執行mount。
甚至允許你在docker容器中啟動docker容器。
開了可以掛載host上的硬盤或其它的設備, 如打印機, 攝像頭什么的都可以, volumes和這參數沒什么關系