本文介绍compose配置文件参数的使用,熟练编写compose文件
[[email protected] lnmp]# cat lnmp.yaml version: ‘3‘ services: nginx: build: /root/docker_demo/nginx/ ports: - "80:80" links: - php:php volumes: - "/www:/usr/local/nginx/html" php: image: php expose: - "9000" volumes: - "/www:/usr/local/nginx/html"
上面的一个例子version代表版本
什么版本的docker-compose对应什么版本的docker:
services就是compose中定义的服务,compose管理的是project、service、container,project如果没有指定就是默认的lnmp.yml文件的lnmp
nginx、php就是属于services的子集栏,定义了两个service
nginx服务中有各种参数:
build:和docker中的build构建一样,后面的路径指向Dockerfile的位置:
[[email protected] 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.conf
ports参数就是docker在docker run启动容器时-p选项的意思差不多,映射到本机host,前者的端口是本机host,后面是container_port
links参数也是docker run在启动容器时--link选项的意思差不多,用于与容器间的互联访问,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(默认tag为latest),如果本地没有镜像将会进行pull
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd
有了上面的第一个简单的compose yml文件,于是进行启动container:
[[email protected] lnmp]# docker-compose -f lnmp.yaml up --build
由于我这里进行了配置文件的修改,所以不再单独的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只会进行build而不会进行启动容器,之后还需进行docker-compose -f lnmp.yaml up
build: /root/docker_demo/nginx/,build参数这里可以指定解决路径也可以以compose的项目路径的相对路径进行指定
[[email protected] lnmp]# cat lnmp.yaml version: ‘3‘ services: nginx: build: context: /root/docker_demo/nginx/ dockerfile: /root/docker_demo/nginx/Dockerfile
build参数的子集也可以根据Dockerfile构建的context来进行build
在build子集中还有args的使用,配合Dockerfile中的ARG结合使用
[[email protected] nginx]# cat Dockerfile FROM centos_init:v2 MAINTAINER [email protected]163.com ARG buildno RUN echo "Build number: $buildno"
上面的Dockerfile中定义了build,但是并没有赋值,RUN执行打印这个值,而在compose的yml中:
[[email protected] lnmp]# cat lnmp.yaml version: ‘3‘ services: nginx: build: context: /root/docker_demo/nginx/ dockerfile: /root/docker_demo/nginx/Dockerfile args: buildno: 2
定义了buildno的值,于是在docker-compose执行构建时使用了这个值,下面是过程
如果仅仅在yml文件中定义了args变量,而没有在Dockerfile中定义相同的变量,将会报错:
[Warning] One or more build-args [foo] were not consumed.
ARG在Dockerfile中的用法:
ARG <name>[=<default value>] 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数
ARG user1ARG buildno或者定义默认值
ARG user1=someuserARG buildno=1
ARG只是在build构建过程中使用,构建完成后,变量将会消失和ENV有着明显的区别