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

bash
mkdir -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:

text
version: '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:

bash
mkdir -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)

text
version: "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:

bash
docker-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:

bash
mkdir -p ~/docker/redis/{data,conf}

Bước 2: File docker-compose.yml (Redis Sentinel Cluster)

text
version: "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:

text
sentinel 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:

bash
docker-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:

bash
mkdir -p ~/docker/mongo/{node1,node2,node3}

Bước 2: File docker-compose.yml replica set

text
version: "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:

bash
docker-compose up -d

Bước 4: Khởi tạo replica set

bash
docker 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:

bash
mkdir -p ~/docker/kafka/{kafka1,kafka2,zookeeper}

Bước 2: File docker-compose.yml (2 broker, 1 zookeeper)

text
version: "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:

bash
docker-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:

bash
mkdir -p ~/docker/rabbitmq/node1 ~/docker/rabbitmq/node2

Bước 2: File docker-compose.yml cluster 2 node

text
version: '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:

bash
docker-compose up -d

Bước 4:
Vào container node2:

bash
docker 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:

bash
mkdir -p ~/docker/elasticsearch/es01/data ~/docker/elasticsearch/es02/data ~/docker/kibana

Bước 2: File docker-compose.yml

text
version: '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:

bash
docker-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:

bash
mkdir -p ~/docker/php-app ~/docker/nginx/conf

Bước 2: Tạo file docker-compose.yml:

text
version: '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ụ:
text
server {
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:

bash
docker-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:

bash
mkdir -p ~/docker/node-app

Bước 2: File docker-compose.yml

text
version: '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:

text
http {
upstream nodeapp {
server node1:3000;
server node2:3000;
}
server {
listen 80;
location / {
proxy_pass http://nodeapp;
proxy_set_header Host $host;
}
}
}

Bước 3:

bash
docker-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:

text
version: '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ụ:

text
ServerRoot "/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 webmaster@example.com
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:

bash
docker-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-fpm và apache trong 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.

X