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 và 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.