Hướng dẫn triển khai 10 dịch vụ hay dùng bằng Docker Compose
Dưới đây là nội dung hướng dẫn triển khai 10 dịch vụ hay dùng bằng Docker Compose. Mỗi dịch vụ đều kèm file mẫu docker-compose.yml, hướng dẫn từng bước triển khai được viết chi tiết, dễ thực hành cho người mới bắt đầu.
1. Nginx với Docker Compose
Giới thiệu
Nginx là reverse proxy, web server, và load balancer phổ biến, giúp tăng tốc truy cập, bảo mật và phân tải hiệu quả. Với Docker Compose, bạn dễ dàng triển khai nhiều instance phục vụ HA.
Triển khai từng bước
Bước 1: Tạo cấu trúc thư mục
bashmkdir -p ~/docker/nginx/conf ~/docker/nginx/html ~/docker/nginx/log
Bước 2: Tạo file cấu hình nginx.conf trong ~/docker/nginx/conf/
Bước 3: Tạo file docker-compose.yml:
textversion: '3'
services:
nginx1:
image: nginx:latest
container_name: nginx1
ports:
- "8081:80"
volumes:
- ./conf:/etc/nginx
- ./html:/usr/share/nginx/html
- ./log:/var/log/nginx
networks:
- nginx-net
nginx2:
image: nginx:latest
container_name: nginx2
ports:
- "8082:80"
volumes:
- ./conf:/etc/nginx
- ./html:/usr/share/nginx/html
- ./log:/var/log/nginx
networks:
- nginx-net
loadbalancer:
image: nginx:latest
container_name: nginx_loadbalancer
ports:
- "80:80"
volumes:
- ./loadbalancer/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- nginx1
- nginx2
networks:
- nginx-net
networks:
nginx-net:
Ghi chú:
- Tạo thêm file cấu hình loadbalancer nginx với upstream trỏ đến nginx1, nginx2.
Bước 4: Khởi động bằng:
bashdocker-compose up -d
Replication & HA/Load balancing (chi tiết)
- Bạn có thể gia tăng số lượng service nginx (nginx3…) để mở rộng.
- Loadbalancer sẽ round-robin các backend. Nếu 1 node lỗi, nginx sẽ loại node đó.
- Kết hợp với công cụ monitor như Keepalived để tăng tính sẵn sàng cho bản thân loadbalancer.
- Có thể dùng nhiều máy/nghost chạy cluster các container rồi dùng tool như Traefik, HAProxy làm reverse proxy phía trước.
2. MySQL với Docker Compose
Giới thiệu
MySQL là CSDL quan hệ nổi tiếng, nhiều tài nguyên học tập. Dùng docker-compose giúp tái tạo cluster developer hoặc thử nghiệm replication nhanh chóng.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/mysql/master/conf.d ~/docker/mysql/master/data
mkdir -p ~/docker/mysql/slave/conf.d ~/docker/mysql/slave/data
Bước 2: File docker-compose.yml (mô hình Master-Slave)
textversion: "3.7"
services:
mysql-master:
image: mysql:5.7
restart: always
container_name: mysql-master
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpw
MYSQL_DATABASE: demo
command:
--server-id=1 --log-bin=mysql-bin
volumes:
- ./master/data:/var/lib/mysql
- ./master/conf.d:/etc/mysql/conf.d
networks:
- mysql-net
mysql-slave:
image: mysql:5.7
restart: always
container_name: mysql-slave
ports:
- "3308:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpw
MYSQL_DATABASE: demo
command:
--server-id=2 --relay-log=mysql-relay-bin --log-bin=mysql-bin --read-only=1
depends_on:
- mysql-master
volumes:
- ./slave/data:/var/lib/mysql
- ./slave/conf.d:/etc/mysql/conf.d
networks:
- mysql-net
networks:
mysql-net:
Bước 3:
bashdocker-compose up -d
Bước 4: Thiết lập replication
- Đăng nhập vào mysql-master tạo user replication:sql CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘slavepw’; GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’; FLUSH PRIVILEGES;
- Lấy master_log_file & master_log_pos: sql SHOW MASTER STATUS;
- Đăng nhập vào mysql-slave, chạy: sql CHANGE MASTER TO MASTER_HOST=’mysql-master’, MASTER_USER=’repl’, MASTER_PASSWORD=’slavepw’, MASTER_LOG_FILE='[file]’, MASTER_LOG_POS=[pos]; START SLAVE;
Replication & HA
- Triển khai multi-slave tăng khả năng đọc.
- Dùng ProxySQL/HAProxy đặt phía trước MySQL Master/Slave, tự động failover khi master lỗi.
- Mô hình advanced: Dùng Galera Cluster hoặc MySQL Group Replication cho multi-master, nhưng phức tạp hơn.
3. Redis với Docker Compose
Giới thiệu
Redis là CSDL key-value siêu tốc cho cache/session. Docker Compose thích hợp lab hoặc dựng thử Redis Sentinel/Cluster.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/redis/{data,conf}
Bước 2: File docker-compose.yml (Redis Sentinel Cluster)
textversion: "3.7"
services:
redis-master:
image: redis:6
container_name: redis-master
command: redis-server --requirepass masterpw --appendonly yes
ports:
- "6379:6379"
volumes:
- ./data:/data
networks:
- redis-net
redis-slave:
image: redis:6
container_name: redis-slave
command: redis-server --slaveof redis-master 6379 --requirepass slavepw --masterauth masterpw --appendonly yes
ports:
- "6380:6379"
depends_on:
- redis-master
networks:
- redis-net
sentinel:
image: redis:6
container_name: redis-sentinel
command: redis-sentinel /etc/redis/sentinel.conf
ports:
- "26379:26379"
volumes:
- ./conf:/etc/redis
depends_on:
- redis-master
- redis-slave
networks:
- redis-net
networks:
redis-net:
Bước 3: Soạn file conf/sentinel.conf với cấu hình đại loại:
textsentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster masterpw
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
Bước 4:
bashdocker-compose up -d
Replication & HA
- Sentinel tự phát hiện master lỗi và chuyển slave lên master. Các app phải hỗ trợ Sentinel client hoặc re-connect.
- Tăng số instance slave/sentinel để tăng độ sẵn sàng.
4. MongoDB với Docker Compose
Giới thiệu
MongoDB nổi bật với khả năng tài liệu (document), thích hợp cho dữ liệu phi cấu trúc, scale-out. Docker Compose giúp mô phỏng replica set ngay cả trên 1 máy.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/mongo/{node1,node2,node3}
Bước 2: File docker-compose.yml replica set
textversion: "3.7"
services:
mongo1:
image: mongo:latest
container_name: mongo1
ports:
- "27011:27017"
volumes:
- ./node1:/data/db
command: mongod --replSet rs0
networks:
- mongo-net
mongo2:
image: mongo:latest
container_name: mongo2
ports:
- "27012:27017"
volumes:
- ./node2:/data/db
command: mongod --replSet rs0
networks:
- mongo-net
mongo3:
image: mongo:latest
container_name: mongo3
ports:
- "27013:27017"
volumes:
- ./node3:/data/db
command: mongod --replSet rs0
networks:
- mongo-net
networks:
mongo-net:
Bước 3:
bashdocker-compose up -d
Bước 4: Khởi tạo replica set
bashdocker exec -it mongo1 mongo
# Đặt lệnh:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" },
{ _id: 2, host: "mongo3:27017" }
]
})
Replication & HA
- Khi 1 node lỗi, node còn lại vẫn hoạt động, 1 node sẽ tự động lên primary.
- Kết hợp sharding để mở rộng, nhưng trên lab nhiều người chỉ dùng replica set.
5. Kafka & Zookeeper với Docker Compose
Giới thiệu
Zookeeper quản lý cluster Kafka, trong khi Kafka là hệ thống message streaming/high-throughput. Compose thuận tiện cho thử nghiệm hoặc prototype.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/kafka/{kafka1,kafka2,zookeeper}
Bước 2: File docker-compose.yml (2 broker, 1 zookeeper)
textversion: "3.7"
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
networks:
- kafka-net
kafka1:
image: wurstmeister/kafka
container_name: kafka1
ports:
- "9091:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9091
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
networks:
- kafka-net
depends_on:
- zookeeper
kafka2:
image: wurstmeister/kafka
container_name: kafka2
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
networks:
- kafka-net
depends_on:
- zookeeper
networks:
kafka-net:
Bước 3:
bashdocker-compose up -d
Replication & HA
- Mỗi topic có thể replication trên nhiều broker (tuỳ config replication factor).
- Khi node lỗi, consumer/producer tự chuyển leader topic sang node còn lại.
6. RabbitMQ với Docker Compose
Giới thiệu
RabbitMQ đơn giản nhưng mạnh mẽ, hữu dụng trong giao tiếp giữa các thành phần microservice.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/rabbitmq/node1 ~/docker/rabbitmq/node2
Bước 2: File docker-compose.yml cluster 2 node
textversion: '3'
services:
rabbit1:
image: rabbitmq:3-management
hostname: rabbit1
environment:
RABBITMQ_ERLANG_COOKIE: 'SECRET_COOKIE'
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: password
volumes:
- ./node1:/var/lib/rabbitmq
ports:
- "15672:15672"
- "5672:5672"
networks:
- rabbit-net
rabbit2:
image: rabbitmq:3-management
hostname: rabbit2
environment:
RABBITMQ_ERLANG_COOKIE: 'SECRET_COOKIE'
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: password
volumes:
- ./node2:/var/lib/rabbitmq
ports:
- "15673:15672"
- "5673:5672"
networks:
- rabbit-net
depends_on:
- rabbit1
networks:
rabbit-net:
Bước 3:
bashdocker-compose up -d
Bước 4:
Vào container node2:
bashdocker exec -it rabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
exit
Bước 5:
Truy cập UI http://localhost:15672, thiết lập policies mirror queue để replica/HA.
Replication & HA
- Khi 1 node lỗi, node còn lại giữ dữ liệu và phục vụ.
- Mirror queues đảm bảo dữ liệu queue được đồng bộ sang node khác.
- Thêm nhiều node để tăng durability và throughput.
7. Elasticsearch & Kibana với Docker Compose
Giới thiệu
Elasticsearch cho phép bạn lưu trữ, tìm kiếm dữ liệu lớn, Kibana hỗ trợ visualize dữ liệu đó.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/elasticsearch/es01/data ~/docker/elasticsearch/es02/data ~/docker/kibana
Bước 2: File docker-compose.yml
textversion: '3'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./elasticsearch/es01/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01
- cluster.initial_master_nodes=es01,es02
- bootstrap.memory_lock=true
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./elasticsearch/es02/data:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- esnet
kibana:
image: docker.elastic.co/kibana/kibana:8.11.1
environment:
ELASTICSEARCH_HOSTS: http://es01:9200
ports:
- 5601:5601
networks:
- esnet
networks:
esnet:
Bước 3:
bashdocker-compose up -d
Replication & HA
- Khi 1 node ES down, cluster vẫn hoạt động, replica shard sẽ tự động chuyển sang node khác.
- Để load balancing, nên bổ sung nginx/haproxy phía trước cluster.
8. PHP với Docker Compose
Giới thiệu
PHP phổ biến trong xây dựng website, với Docker Compose, bạn dễ kết hợp PHP-FPM và Nginx thành native stack.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/php-app ~/docker/nginx/conf
Bước 2: Tạo file docker-compose.yml:
textversion: '3'
services:
php:
image: php:8.1-fpm
volumes:
- ./php-app:/var/www/html
networks:
- phpnet
nginx:
image: nginx:latest
ports:
- "8080:80"
depends_on:
- php
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./php-app:/var/www/html
networks:
- phpnet
networks:
phpnet:
Bước 3:
- Viết file config nginx PHP (nginx/conf/default.conf), ví dụ:
textserver {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Bước 4:
bashdocker-compose up -d
Replication & HA
- Tạo thêm nhiều service php (php1, php2…) phía sau nginx reverse proxy.
- Dùng nginx load balancing hoặc sticky session khi triển khai thật lớn.
9. NodeJS với Docker Compose
Giới thiệu
NodeJS stack hiện đại, realtime… Docker Compose giúp scale và quản lý nhiều instance dễ dàng.
Triển khai từng bước
Bước 1:
bashmkdir -p ~/docker/node-app
Bước 2: File docker-compose.yml
textversion: '3'
services:
node1:
image: node:latest
working_dir: /usr/src/app
command: npm start
volumes:
- ./node-app:/usr/src/app
ports:
- "3001:3000"
networks:
- nodenet
node2:
image: node:latest
working_dir: /usr/src/app
command: npm start
volumes:
- ./node-app:/usr/src/app
ports:
- "3002:3000"
networks:
- nodenet
nginx:
image: nginx:latest
depends_on:
- node1
- node2
ports:
- "8088:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- nodenet
networks:
nodenet:
File nginx.conf ví dụ load balance 2 NodeJS app:
texthttp {
upstream nodeapp {
server node1:3000;
server node2:3000;
}
server {
listen 80;
location / {
proxy_pass http://nodeapp;
proxy_set_header Host $host;
}
}
}
Bước 3:
bashdocker-compose up -d
Replication & HA
- Thêm nhiều instance node app, nginx sẽ chia tải.
- Sử dụng pm2 module trong node app để tự khôi phục khi crash process.
10. Apache với Docker Compose
Giới thiệu
Apache HTTP Server là web server mã nguồn mở nổi tiếng, lâu đời và cực kỳ linh hoạt, được sử dụng rộng rãi để phục vụ website, proxy, cân bằng tải (load balancing), và cũng phù hợp để tích hợp với PHP hoặc các stack khác. Áp dụng Docker Compose giúp bạn quản lý, mở rộng và tái tạo môi trường Apache một cách hiện đại, tiện lợi.
Dưới đây là ví dụ Docker Compose chạy Apache HTTP Server tích hợp với PHP (PHP-FPM). Kiểu này phù hợp triển khai các website PHP hiện đại, tách biệt web server và PHP xử lý backend nhằm tối ưu hiệu năng, bảo mật, và dễ mở rộng/replication.
Cấu trúc thư mục cần thiết:
bash~/docker/apache-php/
├── apache/
│ ├── conf/
│ │ └── httpd.conf
│ └── log/
├── php-app/
│ └── ... mã nguồn php ...
└── docker-compose.yml
File docker-compose.yml mẫu:
textversion: '3'
services:
php-fpm:
image: php:8.1-fpm
container_name: php-fpm
volumes:
- ./php-app:/var/www/html
networks:
- appnet
apache:
image: httpd:latest
container_name: apache
depends_on:
- php-fpm
ports:
- "8086:80"
volumes:
- ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
- ./php-app:/var/www/html
- ./apache/log:/usr/local/apache2/logs
networks:
- appnet
networks:
appnet:
File cấu hình Apache proxy PHP-FPM (apache/conf/httpd.conf) ví dụ:
textServerRoot "/usr/local/apache2"
Listen 80
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
AllowOverride All
Require all granted
</Directory>
# Proxy PHP qua php-fpm container
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/html"
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php-fpm:9000"
</FilesMatch>
ErrorLog "/usr/local/apache2/logs/error.log"
CustomLog "/usr/local/apache2/logs/access.log" common
</VirtualHost>
Hướng dẫn sử dụng:
Bước 1: Tạo đầy đủ thư mục, code php vào php-app/ (ví dụ file index.php với nội dung:
php<?php echo "Hello from Apache + PHP-FPM via Docker Compose!"; ?>
Bước 2:
Khởi động toàn bộ stack:
bashdocker-compose up -d
Bước 3:
Truy cập http://localhost:8086 xem kết quả.
Replication & HA
- Có thể tăng số lượng
php-fpmvàapachetrong compose (php-fpm-1, php-fpm-2, apache-1, apache-2…), đặt phía sau load balancer Apache (hoặc Nginx/Haproxy tùy setup). - Cấu hình Apache proxy balancer để load balancing nhiều php-fpm phía sau (sử dụng mod_proxy_balancer).
- Nếu cần deploy đa server, kết hợp nhiều node/compose + HAProxy/Keepalived ở tầng trên để tự động failover khi web hoặc PHP node gặp sự cố.
Giải pháp này giúp bạn triển khai website PHP với Apache cực kỳ tối ưu, có thể áp dụng cho cả dev và production, dễ mở rộng, backup, scale, và tích hợp các giải pháp HA/replication chuyên nghiệp.
Kết luận
Triển khai Docker Compose giúp SLAs cao hơn, quản lý dễ dàng hơn, phục vụ scaling, replication, HA và load balancing hiệu quả hơn cho môi trường thực tế lẫn phát triển!
Trên đây là nội dung hướng dẫn triển khai 10 dịch vụ hay dùng bằng Docker Compose từng bước được viết chi tiết, dễ thực hành cho người mới bắt đầu. Nếu muốn phát triển lên hệ thống nhiều máy chủ, hãy tìm hiểu thêm về Docker Swarm/Kubernetes.







