compose配置文件参数详解
本文介紹compose配置文件參數(shù)的使用,熟練編寫compose文件
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build: /root/docker_demo/nginx/ports:- "80:80"links:- php:phpvolumes:- "/www:/usr/local/nginx/html"php:image: phpexpose:- "9000"volumes:- "/www:/usr/local/nginx/html"上面的一個例子version代表版本
什么版本的docker-compose對應(yīng)什么版本的docker:
services就是compose中定義的服務(wù),compose管理的是project、service、container,project如果沒有指定就是默認(rèn)的lnmp.yml文件的lnmp
nginx、php就是屬于services的子集欄,定義了兩個service
nginx服務(wù)中有各種參數(shù):
build:和docker中的build構(gòu)建一樣,后面的路徑指向Dockerfile的位置:
[root@docker lnmp]# ll /root/docker_demo/nginx/ total 832 -rw-r--r--. 1 root root 1133 Nov 6 13:40 Dockerfile -rw-r--r--. 1 root root 1033 Nov 6 10:17 fastcgi_params -rw-r--r--. 1 root root 833473 Nov 6 09:35 nginx-1.8.1.tar.gz -rw-r--r--. 1 root root 776 Nov 6 10:16 nginx.conf -rw-r--r--. 1 root root 341 Nov 6 16:43 www.confports參數(shù)就是docker在docker run啟動容器時-p選項的意思差不多,映射到本機(jī)host,前者的端口是本機(jī)host,后面是container_port
links參數(shù)也是docker run在啟動容器時--link選項的意思差不多,用于與容器間的互聯(lián)訪問,php:php,前者php是定義的service名稱,后者的php是給它定義了一個別名
volumes:與docker run在啟動容器時-v選項的意思差不多,用于host與container之間的映射掛載,前者是host_mount_dir,后面是container中的目錄
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在下面的php這個service中:
image:代表的就是使用的docker images中的某個鏡像名稱去開啟container(默認(rèn)tag為latest),如果本地沒有鏡像將會進(jìn)行pull
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd有了上面的第一個簡單的compose yml文件,于是進(jìn)行啟動container:
[root@docker lnmp]# docker-compose -f lnmp.yaml up --build由于我這里進(jìn)行了配置文件的修改,所以不再單獨的up,而是up --build(If you change a service’s Dockerfile or the contents of its build directory, run?docker-compose build?to rebuild it.)
單獨的docker-compose?-f lnmp.yaml build只會進(jìn)行build而不會進(jìn)行啟動容器,之后還需進(jìn)行docker-compose?-f lnmp.yaml up
?build: /root/docker_demo/nginx/,build參數(shù)這里可以指定解決路徑也可以以compose的項目路徑的相對路徑進(jìn)行指定
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfilebuild參數(shù)的子集也可以根據(jù)Dockerfile構(gòu)建的context來進(jìn)行build
在build子集中還有args的使用,配合Dockerfile中的ARG結(jié)合使用
[root@docker nginx]# cat Dockerfile FROM centos_init:v2MAINTAINER json_hc@163.com ARG buildno RUN echo "Build number: $buildno"上面的Dockerfile中定義了build,但是并沒有賦值,RUN執(zhí)行打印這個值,而在compose的yml中:
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:buildno: 2定義了buildno的值,于是在docker-compose執(zhí)行構(gòu)建時使用了這個值,下面是過程
如果僅僅在yml文件中定義了args變量,而沒有在Dockerfile中定義相同的變量,將會報錯:
[Warning] One or more build-args [foo] were not consumed.ARG在Dockerfile中的用法:
ARG <name>[=<default value>] 設(shè)置變量命令,ARG命令定義了一個變量,在docker build創(chuàng)建鏡像的時候,使用 --build-arg <varname>=<value>來指定參數(shù)ARG user1 ARG buildno 或者定義默認(rèn)值ARG user1=someuser ARG buildno=1ARG只是在build構(gòu)建過程中使用,構(gòu)建完成后,變量將會消失和ENV有著明顯的區(qū)別
而在compose的yml文件中args的定義:
build:context: .args:buildno: 1password: secretbuild:context: .args:- buildno=1- password=secret上面兩種方式都可以
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:- buildno=2command參數(shù),覆蓋容器內(nèi)默認(rèn)的命令
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:- buildno=2command: ["/usr/local/nginx/sbin/nginx"]這里定義command的命令,而Dockerfile中的nginx的啟動命令:
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]所以在[root@docker lnmp]# docker-compose -f lnmp.yaml up --build
構(gòu)建并啟動時并不會成功:
可以明顯的看到command定義的命令替換掉了Dockerfile中的CMD命令
?
container_name:自定義容器名
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:- buildno=2container_name: lnmp-nginx可以看見nginx服務(wù)的容器名已經(jīng)改為lnmp-nginx了
?
depends_on:定義服務(wù)間的依賴關(guān)系
比如數(shù)據(jù)庫db,必須在web啟動之前進(jìn)行啟動,也就是說web啟動依賴db的啟動
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:- buildno=2container_name: lnmp-nginxdepends_on:- dbports:- "80:80"links:- php:phpvolumes:- "/www:/usr/local/nginx/html"php:image: phpexpose:- "9000"volumes:- "/www:/usr/local/nginx/html"db:image: mysqlports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: redhatMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpress可以看出nginx服務(wù)是最后啟動容器的,由于nginx依賴db,而php與nginx有l(wèi)ink,所以nginx最后啟動
?
dns:設(shè)置dns
dns: 8.8.8.8 dns:- 8.8.8.8- 9.9.9.9可以設(shè)置是一個單一值,也可以是一個列表
?
dns_search:自定義搜索域:
dns_search: example.com dns_search:- dc1.example.com- dc2.example.com可以設(shè)置為單一值,也可以是一個列表
?
entrypoint:覆蓋Dockerfile中的entrypoint,用法同Dockerfile中的用法
[root@docker lnmp]# cat lnmp.yaml version: '3' services:nginx:build:context: /root/docker_demo/nginx/dockerfile: /root/docker_demo/nginx/Dockerfileargs:- buildno=2container_name: lnmp-nginxentrypoint: ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] [root@docker lnmp]# docker-compose -f lnmp.yaml ps Name Command State Ports ---------------------------------------------------------------------------- lnmp-nginx /usr/local/nginx/sbin/ngin ... Up 0.0.0.0:80->80/tcp lnmp_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp lnmp_php_1 /usr/local/php/sbin/php-fpm Up 9000/tcp?
env_file:將定義的變量編寫在文件中,然后在yml文件中進(jìn)行添加
env_file: .envenv_file:- ./common.env- ./apps/web.env- /opt/secrets.env創(chuàng)建env_file文件mysql_env.txt:
[root@docker lnmp]# ll total 16 -rw-r--r--. 1 root root 477 Nov 9 17:00 docker-compose.yml.bak -rw-r--r--. 1 root root 550 Nov 10 15:45 lnmp.yaml -rw-r--r--. 1 root root 271 Nov 10 10:26 lnmp.yaml.bak -rw-r--r--. 1 root root 98 Nov 10 15:46 mysql_env.txt查看定義的變量:
[root@docker lnmp]# cat mysql_env.txt MYSQL_ROOT_PASSWORD=redhat MYSQL_DATABASE=wordpress MYSQL_USER=wordpress MYSQL_PASSWORD=wordpress變量的定義格式為這樣
然后進(jìn)行docker-compose:
[root@docker lnmp]# docker-compose -f lnmp.yaml up --build進(jìn)入到db服務(wù)中進(jìn)行驗證變量是否創(chuàng)建成功:
[root@docker nginx]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml exec db sh # mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec)mysql>可以看見MySQL的root密碼已經(jīng)設(shè)置,也創(chuàng)建了數(shù)據(jù)庫wordpress等等
?
environment:添加環(huán)境變量,可以是一個字典也可以是數(shù)組
environment:RACK_ENV: developmentSHOW: 'true'SESSION_SECRET:environment:- RACK_ENV=development- SHOW=true- SESSION_SECRET db:image: mysqlports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=redhat- MYSQL_DATABASE=wordpress- MYSQL_USER=wordpress- MYSQL_PASSWORD=wordpress定義完成后進(jìn)行構(gòu)建并啟動后,進(jìn)行驗證:
[root@docker nginx]# docker-compose -f /root/compose_project/lnmp/lnmp.yaml exec db sh # mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec)mysql>?
expose:暴露container的端口,但是并沒有映射到host主機(jī)上,用法類似于Dockerfile中的EXPOSE
php:image: phpexpose:- "9000"volumes:- "/www:/usr/local/nginx/html"?
external_links:
external_links:- redis_1- project_db_1:mysql- project_db_1:postgresql?鏈接到 docker-compose.yml 外部的容器,甚至 并非?Compose?管理的容器。參數(shù)格式跟?links?類似。
這個參數(shù)下篇文章有介紹
?
extra_hosts:添加hostname映射,類似于docker cli下面的--add-host
extra_hosts:- "www.hcstart.com:192.168.101.14"然后將這個compose file進(jìn)行up:
[root@docker lnmp]# docker-compose -f lnmp.yml up --build Creating network "lnmp_net1" with driver "bridge" Creating lnmp-php ... Creating lnmp-php ... done Creating lnmp-nginx ... Creating lnmp-nginx ... done Attaching to lnmp-php, lnmp-nginx [root@docker lnmp]# docker-compose -f lnmp.yml exec nginx cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.101.14 www.hcstart.com 172.19.0.3 35cc14084be9上面的/etc/hosts就可以看見剛剛加入的www.hctsrat.com映射了
?
healthcheck:配置一個檢查去測試服務(wù)中的容器是否運(yùn)行正常
[root@docker lnmp]# cat lnmp.yml|grep health -A 4healthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3查看healthcheck的狀態(tài)輸出:
[root@docker lnmp]# docker inspect lnmp-nginx "Health": {"Status": "healthy","FailingStreak": 0,"Log": [{"Start": "2017-10-27T03:52:37.921723965-04:00","End": "2017-10-27T03:52:38.021941235-04:00","ExitCode": 0,"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0<h1>hello nginx and php</h1>\n\r100 29 100 29 0 0 5741 0 --:--:-- --:--:-- --:--:-- 7250\n"},healthcheck中選項的詳解:https://docs.docker.com/engine/reference/builder/#healthcheck
?
labels:添加元數(shù)據(jù)到container中,查看現(xiàn)有容器的labels:
[root@docker lnmp]# docker inspect -f {{.Config.Labels}} lnmp-nginx map[com.docker.compose.oneoff:False com.docker.compose.service:nginx com.docker.compose.version:1.17.0 license:GPLv2 vendor:CentOS build-date:20170911 com.docker.compose.config-hash:edaa6c6d8f12639e28cb4bcdffda4961ef5a90f076e9017b204dacda56525e5b com.docker.compose.container-number:1 com.docker.compose.project:lnmp name:CentOS Base Image]?
logging:為服務(wù)配置記錄日志
[root@docker lnmp]# cat lnmp.yml|grep logging -A 4logging:driver: "json-file"options:max-size: "2000k"max-file: "10"logging支持很多driver,而每一個driver對應(yīng)的options都不一樣:
[root@docker lnmp]# docker inspect -f {{.HostConfig.LogConfig}} lnmp-nginx {json-file map[max-file:10 max-size:2000k]} [root@docker lnmp]# docker info |grep 'Logging Driver' Logging Driver: json-file更多其他的driver查看:https://docs.docker.com/engine/admin/logging/overview/
?
sysctls:在容器中設(shè)置內(nèi)核參數(shù)
sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn=1024- net.ipv4.tcp_syncookies=0?
總結(jié)
以上是生活随笔為你收集整理的compose配置文件参数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker-compose初试及命令基
- 下一篇: HBase中Bloomfilter类型的