compose配置文件參數詳解

 

本文介紹compose配置文件參數的使用,熟練編寫compose文件php

[root@docker 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表明版本html

什麼版本的docker-compose對應什麼版本的docker:node

services就是compose中定義的服務,compose管理的是project、service、container,project若是沒有指定就是默認的lnmp.yml文件的lnmpmysql

nginx、php就是屬於services的子集欄,定義了兩個servicenginx

nginx服務中有各類參數:web

build:和docker中的build構建同樣,後面的路徑指向Dockerfile的位置:redis

[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.conf

ports參數就是docker在docker run啓動容器時-p選項的意思差很少,映射到本機host,前者的端口是本機host,後面是container_portsql

links參數也是docker run在啓動容器時--link選項的意思差很少,用於與容器間的互聯訪問,php:php,前者php是定義的service名稱,後者的php是給它定義了一個別名docker

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:

[root@docker 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的項目路徑的相對路徑進行指定

[root@docker 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結合使用

[root@docker nginx]# cat Dockerfile 
FROM centos_init:v2

MAINTAINER json_hc@163.com
ARG buildno
RUN echo "Build number: $buildno"

上面的Dockerfile中定義了build,可是並無賦值,RUN執行打印這個值,而在compose的yml中:

[root@docker 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 user1
ARG buildno
或者定義默認值
ARG user1=someuser
ARG buildno=1

ARG只是在build構建過程當中使用,構建完成後,變量將會消失和ENV有着明顯的區別

而在compose的yml文件中args的定義:

build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  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/Dockerfile
      args:
        - buildno=2

command參數,覆蓋容器內默認的命令

[root@docker lnmp]# cat lnmp.yaml
version: '3'
services:
  nginx:
    build:
      context: /root/docker_demo/nginx/
      dockerfile: /root/docker_demo/nginx/Dockerfile
      args:
        - buildno=2
    command: ["/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

構建並啓動時並不會成功:

能夠明顯的看到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/Dockerfile
      args:
        - buildno=2
    container_name: lnmp-nginx

能夠看見nginx服務的容器名已經改成lnmp-nginx了

 

depends_on:定義服務間的依賴關係

好比數據庫db,必須在web啓動以前進行啓動,也就是說web啓動依賴db的啓動

[root@docker lnmp]# cat lnmp.yaml
version: '3'
services:
  nginx:
    build:
      context: /root/docker_demo/nginx/
      dockerfile: /root/docker_demo/nginx/Dockerfile
      args:
        - buildno=2
    container_name: lnmp-nginx
    depends_on:
      - db
    ports:
      - "80:80"
    links:
      - php:php
    volumes:
      - "/www:/usr/local/nginx/html"
  php:
    image: php
    expose:
      - "9000"
    volumes:
      - "/www:/usr/local/nginx/html"
  db:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: redhat
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

能夠看出nginx服務是最後啓動容器的,因爲nginx依賴db,而php與nginx有link,因此nginx最後啓動

 

dns:設置dns

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

能夠設置是一個單一值,也能夠是一個列表

 

dns_search:自定義搜索域:

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

能夠設置爲單一值,也能夠是一個列表

 

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/Dockerfile
      args:
        - buildno=2
    container_name: lnmp-nginx
    entrypoint: ["/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文件中進行添加

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

建立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

變量的定義格式爲這樣

而後進行docker-compose:

[root@docker lnmp]# docker-compose -f lnmp.yaml up --build

進入到db服務中進行驗證變量是否建立成功:

[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密碼已經設置,也建立了數據庫wordpress等等

 

environment:添加環境變量,能夠是一個字典也能夠是數組

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  db:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=redhat
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress

定義完成後進行構建並啓動後,進行驗證:

[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主機上,用法相似於Dockerfile中的EXPOSE

  php:
    image: php
    expose:
      - "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 管理的容器。參數格式跟 links 相似。

這個參數下篇文章有介紹

 

extra_hosts:添加hostname映射,相似於docker cli下面的--add-host

    extra_hosts:
      - "www.hcstart.com:192.168.101.14"

而後將這個compose file進行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:配置一個檢查去測試服務中的容器是否運行正常

[root@docker lnmp]# cat lnmp.yml|grep health -A 4
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3

查看healthcheck的狀態輸出:

[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:添加元數據到container中,查看現有容器的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:爲服務配置記錄日誌

[root@docker lnmp]# cat lnmp.yml|grep logging -A 4
    logging:
      driver: "json-file"
      options:
        max-size: "2000k"
        max-file: "10"

logging支持不少driver,而每個driver對應的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:在容器中設置內核參數

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0
相關文章
相關標籤/搜索