Tìm hiểu Docker compose

I. Docker compose là gì ?

Docker compose  là một công cụ để xác định và chạy multi-container. Với Docker compose, bạn sử dụng tệp YAML để config các service của ứng dụng. Sau đó, bằng một lệnh duy nhất, bạn tạo và khởi động tất cả các service từ config của mình.

II. Các thuộc tính phổ biến sử dụng trong config

version: Thông tin version file config

networks: Định nghĩa network dùng chung cho các container thường sẽ là bridge

services:  Thiết lập các sevice hay còn gọi là container muốn build hoặc run

image: Thông tin image đưuọc sử dụng khi tạo container

environment: Thiết lập khai báo biến môi trường cần thiết cho container

container_name: Thông tin container name

ports:  Thiết lập ports chạy tại máy host và container

volumes: Mount thư mục giứa máy host và container

depends_on: Chỉ ra sự phụ thuộc giữa các service(VD: service A phải chạy trước thì serive B mới được chạy)

build: Thường sẽ là khai báo thông tin context dockerfile muốn build

III. Các lệnh cơ bản

Xem thông tin version Docker compose

$ docker-compose version

Tạo hoặc tạo lại các container

$ docker-compose build

Khởi động lại toàn bộ container

$ docker-compose up

Stop toàn bộ container

$ docker-compose stop

Xóa hoàn toàn container và data volumes được sử dụng bởi các services

$ docker-compose down --volumes

Khởi động lại các containers

$ docker-compose restart

Xem dánh sách thông tin container, image, tag…

$ docker-compose images

Truy cập vào container hoặc run command trong container

$ docker-compose exec

$ #VD truy cập vào container
$ docker-compose exec {container} bash

VI. Example docker-compose.yaml môi trường develop

Cú pháp ${VARIABLE} là thông tin các variable được lấy trong file .env

Example file .env
#user
USER_NAME=example
USER_ID=1001
GROUP_NAME=example
GROUP_ID=1001

#path in host
DATA_PATH_HOST=~/docker/data
COMMAND_PATH_HOST=./command

#timezone
TIMEZONE=UTC

# Networks driver
NETWORKS_DRIVER=bridge
NETWORK_APP=volume_test_network

# Volumes driver
VOLUMES_DRIVER=local
VOLUME_NGINX=volume_test_volume_nginx

File này thường dùng để build image và test khi đã ok sẽ tiến hành push image lên docker hub

version: '3.5'
networks:
  app:
    name: ${NETWORK_APP}
    driver: ${NETWORKS_DRIVER}  #container cùng network mới giao tiếp được với nhau
volumes:
  nginx:
    name: ${VOLUME_NGINX}
    driver: ${VOLUMES_DRIVER}
services:
  nginx:
    build:
      context: .
      dockerfile: dockerfiles/nginx.dockerfile #File config ở local
    environment:
      - 'CREATE_USER=${CREATE_USER}'
      - 'USER_NAME=${USER_NAME}'
      - 'USER_ID=${USER_ID}'
      - 'GROUP_NAME=${GROUP_NAME}'
      - 'GROUP_ID=${GROUP_ID}'
    image: example/nginx-1.19.8-alpine:latest
    container_name: "nginx-1.19.8-alpine"
    ports:
      - '${NGINX_HOST_HTTP_PORT}:80'
      - '${NGINX_HOST_HTTPS_PORT}:443'
    volumes:
      - '${NGINX_SITE_PATH}:/etc/nginx/sites-enabled'
      - nginx:/var/log/nginx
    networks:
      - app
    depends_on:
      - php
      - mysql
  php:
    build:
      context: .
      dockerfile: dockerfiles/php.dockerfile #File config ở local
    environment:
      - 'CREATE_USER=${CREATE_USER}'
      - 'USER_NAME=${USER_NAME}'
      - 'USER_ID=${USER_ID}'
      - 'GROUP_NAME=${GROUP_NAME}'
      - 'GROUP_ID=${GROUP_ID}'
    image: example/php8.0-fpm:latest
    container_name: "php8.0-fpm"
    volumes:
      - '${COMMAND_PATH_HOST}/api:/command/api'
    networks:
      - app
  mysql:
    build:
      context: .
      dockerfile: dockerfiles/mysql.dockerfile #File config ở local
    image: example/mysql-8.0:latest
    container_name: "mysql-8.0"
    environment:
      - 'MYSQL_DATABASE=${MYSQL_DATABASE}'
      - 'MYSQL_USER=${MYSQL_USER}'
      - 'MYSQL_PASSWORD=${MYSQL_PASSWORD}'
      - 'MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}'
      - 'TZ=${TIMEZONE}'
    volumes:
      - '${DATA_PATH_HOST}/mysql:/var/lib/mysql'
    ports:
      - '${MYSQL_PORT}:3306'
    networks:
      - app
  redis:
    build:
      context: .
      dockerfile: dockerfiles/redis.dockerfile #File config ở local
    image: example/redis:latest
    container_name: "redis-latest"
    volumes:
      - ${DATA_PATH_HOST}/redis:/data
    ports:
      - "${REDIS_PORT}:6379"
    networks:
      - app

V. Example docker-compose.product.yaml môi trường product

Cú pháp ${VARIABLE} là thông tin các variable được lấy trong file .env

File này thường dùng trên product khi image đã có trên docker hub. Thường image sẽ có tag là latest để khi có version mới project sẽ được cập nhật.

version: '3.5'
networks:
  app:
    name: ${NETWORK_APP}
    driver: ${NETWORKS_DRIVER}  #container cùng network mới giao tiếp được với nhau
volumes:
  nginx:
    name: ${VOLUME_NGINX}
    driver: ${VOLUMES_DRIVER}
services:
  nginx:
    image: example/nginx-1.19.8-alpine:latest
    environment:
      - 'CREATE_USER=${CREATE_USER}'
      - 'USER_NAME=${USER_NAME}'
      - 'USER_ID=${USER_ID}'
      - 'GROUP_NAME=${GROUP_NAME}'
      - 'GROUP_ID=${GROUP_ID}'
    container_name: "nginx-1.19.8-alpine"
    ports:
      - '${API_HTTP_PORT}:80'
      - '${NGINX_HOST_HTTPS_PORT}:443'
    volumes:
      - '${NGINX_SITE_PATH}:/etc/nginx/sites-enabled'
      - nginx:/var/log/nginx
    networks:
      - app
    depends_on:
      - php
      - mysql
  php:
    image: example/php8.0-fpm:latest
    container_name: "php8.0-fpm"
    environment:
      - 'CREATE_USER=${CREATE_USER}'
      - 'USER_NAME=${USER_NAME}'
      - 'USER_ID=${USER_ID}'
      - 'GROUP_NAME=${GROUP_NAME}'
      - 'GROUP_ID=${GROUP_ID}'
    volumes:
      - '${COMMAND_PATH_HOST}/api:/command/api'
    networks:
      - app
  mysql:
    image: example/mysql-8.0:latest
    container_name: "mysql-8.0"
    environment:
      - 'MYSQL_DATABASE=${MYSQL_DATABASE}'
      - 'MYSQL_USER=${MYSQL_USER}'
      - 'MYSQL_PASSWORD=${MYSQL_PASSWORD}'
      - 'MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}'
      - 'TZ=${TIMEZONE}'
    volumes:
      - '${DATA_PATH_HOST}/mysql:/var/lib/mysql'
    ports:
      - '${MYSQL_PORT}:3306'
    networks:
      - app
  redis:
    image: example/redis:latest
    container_name: "redis-latest"
    volumes:
      - ${DATA_PATH_HOST}/redis:/data
    ports:
      - "${REDIS_PORT}:6379"
    networks:
      - app

VI. Kết luận

Trong bài này, mình giới thiệu cơ bản về Docker compose và các lệnh cơ bản trong Docker compose cũng như config file docker-compose.yaml

Cảm ơn tất cả mọi người đã đọc.

Related Posts