Nội dung và ý nghĩa các dòng viết trong file này được giải thích trong các comment, bạn có thể chỉnh lại cho phù hợp với mục đích của mình:
# VIẾT THEO CÚ PHÁP YAML, CHÚ Ý CHÍNH XÁC KHOẢNG TRẮNG ĐẦU CÁC DÒNG
version: "3" # chọn viết theo bản 3 docs.docker.com/compose/compose-file/
services: # CÁC DỊCH VỤ (CONTAINER) NĂM TRONG services
pro-memcached: # (((1))) BẮT ĐẦU TẠO DỊCH VỤ THỨ NHẤT
image: "memcached:latest" # Image tạo ra dịch vụ
container_name: c-memcached01 # Tên container khi chạy
restart: always
hostname: memcached
networks:
- my-network # nối vào mạng my-network (tạo mạng này ở dưới)
command:
- "--conn-limit=2048" # Giới hạn kết nối là 2048
- "--memory-limit=2048" # Giới hạn cho phép dùng tới 4096 MB bộ nhớ làm cache
xtlab-apache: # (((2))) TẠO DỊCH VỤ HTTPD
image: "httpd:version2" # sử dụng image custome lại ở trên để tạo container
container_name: c-httpd01 # tên khi chạy container HTTPD
restart: always
hostname: httpd01
networks:
- my-network
ports:
- "8080:80" # Mở cổng 8080 public, ánh xạ vào 80
- "443:443"
volumes: # Ánh xạ thự mục vào container
- dir-site:/home/sites/ # Bind ổ đĩa - dir-site
xtlab-mysql: # (((3))) TẠO DỊCH VỤ MYSQL
image: "mysql:latest"
container_name: mysql-product
restart: always
hostname: mysql01
networks:
- my-network
environment:
MYSQL_ROOT_PASSWORD: abc123 #Thiết lập password
volumes:
- /mycode/db:/var/lib/mysql # thư mục lưu DB
- /mycode/db/my.cnf:/etc/mysql/my.cnf # ánh xạ file cấu hình
xtlab-php: # (((4))) TẠO DỊCH VỤ PHP
image: "php:version2"
container_name: php-product # tên container
hostname: php01
restart: always
networks:
- my-network
volumes:
- dir-site:/home/sites/ # Bind ổ đĩa - dir-site
networks: # TẠO NETWORK
my-network:
driver: bridge
volumes: # TẠO Ổ ĐĨA
dir-site: # ổ đĩa này lưu dữ liệu ở /mycode/
driver_opts:
device: /mycode/ # Hãy đảm bảo có thư mục /mycode/default
o: bind
Mẫu docker-compose và giải thích
version: "3.7"
# KHAI BÁO CÁC DỊCH VỤ
services:
# TÊN DỊCH VỤ
web:
# TÊN IMAGE TẠO TẠO CONTAINER
image: busybox
## DÙNG IMAGE BUILD TỪ DOCKERFILE
# build:
# dockerfile: Dockerfile
# context: ./web
# ÁNH XẠ CỔNG MÁY HOST VÀO CỔNG CONTAINER
ports:
- 8099:80
# MỞ CỔNG, KHÔNG ÁNH XẠ HOST, DÙNG NỘI BỘ MẠNG
# expose:
# - "3000"
## CHÍNH SÁCH KHỞI ĐỘNG
restart: always
# Nối vào mạng network1
networks:
- network1
## Thêm hoặc bỏ các quyền (Capability) trong container
## http://man7.org/linux/man-pages/man7/capabilities.7.html
# cap_add:
# - ALL
# cap_drop:
# - NET_ADMIN
# - SYS_ADMIN
# cap quyen root
# privileged: true
## Ghi đè entrypoint
# entrypoint: /code/entrypoint.sh
## Ghi đè CMD mặc định nếu cần
# command: ["bash", "ls"]
## ĐẶT TÊN CONTAINER
container_name: my-container
## THÊM BIẾN MÔI TRƯỜNG
# environment:
# - TEN_BIEN1=giatri1
# - TEN_BIEN2=giatri2
## THÊM DỮ LIỆU HOST, TƯƠNG ĐƯƠNG KHAI BÁO TRONG /etc/hosts
# extra_hosts:
# - "example.com:192.168.1.55"
## GẮN Ổ ĐĨA, THƯ MỤC VÀO CONTAINER
# volumes:
# - /opt/data:/var/lib/mysql
# - data3:/var/lib/mysql
## THIẾT LẬP LOG
logging:
options:
max-size: "1m"
max-file: "2"
## CẤU HÌNH DNS
dns: 8.8.8.8
# CẤU HÌNH NẾU TRÊN SWARM
deploy:
replicas: 6 # Số lượng container cho dịch vụ
# placement:
# constraints:
# - node.role == manager # Chỉ chạy ở node manager
resources: # Thiết lập tài nguyên
limits: # Giới hạn tài nguyên
cpus: '0.50' # 50% của 1 Core
memory: 50M
reservations: # Tài nguyên tối thiểu
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
# ---------------------------------------------------------------------------------------
# KHAI BÁO VOLUME
volumes:
# volume không tạo mới, sử dụng volume đã có data1
data1:
external: true
# volume không tạo mới, sử dụng volume đã có data-abc
data2:
external:
name: data-abc
# tạo volume local
data3:
# tạo volume có ánh xạ đường dẫn
data4:
driver: local
driver_opts:
type: none
device: "/path/to/dir"
o: bind
# tạo volume mount từ NFS
data5:
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.1,rw
device: ":/path/to/dir"
# ---------------------------------------------------------------------------------------
# KHAI BÁO MẠNG
networks:
# Tạo mạng cầu
network1:
driver: bridge
# Mạng lấy bên ngoài, network2 là networkxyz đã có
network2:
external:
name: networkxyz
# Tạo mạng overlay trên swam
network3:
driver: overlay
name: my-overlay
Cảm ơn bạn đã trả lời.