Detailed explanation of docker compose configuration

1 format of configuration file

  • An example docker-compose.yml
    services:
      elasticsearch:
        image: elasticsearch:7.14.2
        container_name: es
        environment:
          discovery.type: single-node
          ES_JAVA_OPTS: "-Xms512m -Xmx512m"
        ports:
          - "9200:9200"
          - "9300:9300"
        healthcheck:
          test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
          interval: 10s
          timeout: 10s
          retries: 3
        networks:
          - elastic
      logstash:
        image: logstash:7.14.2
        container_name: log
        environment:
          discovery.seed_hosts: logstash
          LS_JAVA_OPTS: "-Xms512m -Xmx512m"
        volumes:
          - ./logstash/pipeline/logstash-nginx.config:/usr/share/logstash/pipeline/logstash-nginx.config
          - ./logstash/nginx.log:/home/nginx.log
        ports:
          - "5000:5000/tcp"
          - "5000:5000/udp"
          - "5044:5044"
          - "9600:9600"
        depends_on:
          - elasticsearch
        networks:
          - elastic
        command: logstash -f /usr/share/logstash/pipeline/logstash-nginx.config
      kibana:
        image: kibana:7.14.2
        container_name: kib
        ports:
          - "5601:5601"
        depends_on:
          - elasticsearch
        networks:
          - elastic
    networks:
      elastic:
        driver: bridge
    

2. Explain the services section in detail

2.1 image

  • web user defined service name
  • Image can be specified as the image name or image ID. if it does not exist locally, it will automatically try to pull
services:
  web:
    image: redis

2.2 build

  • The service startup can be based on 2.1 image or Dockerfile. The build task will be executed when the service is started up.
  • The sub tag context sets the context root directory
  • The sub tag Dockerfile specifies the Dockerfile file
  • The child tag args specifies the environment variables used during the build
    services:
      web:
        build:
          context: ../
          dockerfile: Dockerfile
          args:
          	- buildno=1
          	- password=123456
    
  • Specifying both the image and build tags will name the built image after the image
    services:
      web:
        build: .
        image: webapp:tag
    

2.3 command

  • Using command overrides the command to be executed by default after the image is started
    services:
      web:
        command: redis-server /etc/redis/redis.conf --appendonly yes
    
    services:
      web:
        command: ["redis-server", "/etc/redis/redis.conf", "--appendonly", "yes"]
    

2.4 container_name

  • The format of docker compose startup container name is: < project name > < service name > < serial number >
  • You can also use container_name custom container name
    services:
      web:
        container_name: redis-6379
    

2.5 depends_on

  • Generally, in a project, the container needs to have a specific start sequence, otherwise it will fail to start due to dependency problems.
  • Example: if you start the application container without starting the database, the application container will exit because the database cannot be found
  • Solution: dependencies_ on
    services:
      web: 
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis:latest
      db:
        image: mysql:5.7
    

2.6 dns

  • The same purpose as the -- dns parameter in docker run
    services:
      web: 
        dns: 8.8.8.8
    
    services:
      web: 
        dns: 
          - 8.8.8.8
          - 114.114.114.114
    

2.7 entrypoint

  • There is an instruction entrypoint in Dockerfile to specify the access point. The definition of entrypoint in docker-compose.yml will overwrite the definition in Dockerfile
    services:
      web: 
        entrypoint: java -jar app.jar --spring.profiles.active=release 
    
    services:
      web: 
        entrypoint: 
          - java
          - -jar
          - app.jar
          - --spring.profiles.active=release 
    

2.8 environment

  • It is equivalent to the function of docker run -e
    services:
      mysql: 
        image: mysql
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_ALLOW_EMPTY_PASSWORD=yes 
    

2.9 extra_hosts

  • Adding the host name mapping is equivalent to adding records to / etc/hosts, and is equivalent to the function of docker run -- add host
    services:
      web: 
        extra_hosts: 
          - webnode1:192.168.171.100
          - webnode2:192.168.171.101
    
  • This is what / etc/hosts in the container can see
    192.168.171.100 webnode1
    192.168.171.101 webnode2
    

2.10 ports

  • The port mapping label is equivalent to the docker run -p function
    services:
      web: 
        ports:
          - 80:80
          - 1180:1180 
    

2.11 volumes

  • Mounting a directory or an existing data volume container is equivalent to the docker run -v function
  • HOST:CONTAINER HOST:CONTAINER:ro,: ro means read-only, and the default is read-write
    services:
      web: 
        volumes:
          - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro
          - ./webdist:/home/webdist
    

2.12 networks

  • Join the specified network
    services:
      web:
        networks:
          - web-net
          - backend-net
    

2.13 cap_add,cap_drop

  • Add or remove the kernel functionality of the container

2.14 cgroup_parent

  • Specifies the parent cgroup of the container

2.15 others

  • There are other single value Tags: user working_dir hostname privileged restart
    services:
      web:
        user: mysql
        working_dir: /home/webdist
        hostname: webnode
        privileged: true
        restart: always
    
Reference article:

https://www.jianshu.com/p/2217cfed29d7

Tags: Linux Docker docker compose

Posted on Tue, 30 Nov 2021 05:29:41 -0500 by pullaratt