Mở Đầu
Trong phần 7 của hành trình chúng ta trong Docker, chúng ta sẽ bắt đầu tìm hiểu về Docker Compose. Docker Compose là một công cụ mạnh mẽ cho phép bạn định nghĩa và quản lý nhiều dịch vụ Docker khác nhau trong một file cấu hình duy nhất. Với Docker Compose, bạn có thể dễ dàng triển khai và quản lý các ứng dụng đa-container một cách hiệu quả.
Docker Compose là gì?
Docker Compose là một công cụ giúp bạn định nghĩa và quản lý nhiều container trong một ứng dụng đa-container. Thay vì phải chạy từng lệnh Docker riêng lẻ để triển khai các dịch vụ khác nhau, bạn có thể sử dụng Docker Compose để định nghĩa toàn bộ môi trường của ứng dụng trong một file cấu hình duy nhất.
Tạo và Chạy Các Dịch Vụ Docker Với Docker Compose
Chúng ta sẽ tìm hiểu cách sử dụng Docker Compose để tạo và chạy các dịch vụ Docker một cách đồng thời. Với Docker Compose, bạn có thể xác định các dịch vụ, cài đặt các tham số và môi trường cho mỗi dịch vụ, và sau đó chỉ cần một lệnh duy nhất để khởi động toàn bộ ứng dụng.
Chia nhỏ ứng dụng của bạn thành các Service Docker
Khi phân phối các ứng hoàn thành, từng phần của ứng dụng đó ở dạng sản phẩm gọi nó là các service (dịch vụ). Những thành phần này khi phân phối ứng dụng chúng đều được gọi là các dịch vụ service. Như vậy các service thực chất là các container chạy đáp ứng chức năng thành phần tạo nên ứng dụng. Bạn cần hiểu sơ qua về khái niệm này vì ta sẽ sử dụng nó trong docker-compose giúp tạo ra các service trên một cách tự động.
Docker Compose với file docker-compose.yml
File docker-compose.yml gần giống ý nghĩa với file Dockerfile đã tìm hiểu trong Sử dụng Dockerfile, là một file text, viết với định dạng YAML là cấu hình để tử đó lệnh docker compose sinh ra và quản lý các service (container), các network, các ổ đĩa … cho một ứng dụng hoàn chỉnh.
Cài đặt Docker Compose.
Tham khảo bài https://wiki.hoanghd.com/cai-dat-docker-compose/
và https://wiki.hoanghd.com/bash-script-tu-dong-cai-dat-docker-va-docker-compose-cho-he-dieu-hanh-ubuntu/
Lệnh docker-compose
Về nội dung bên trong file docker-compose.yml sẽ tìm hiểu phía sau, giờ giả sử đang có file này, từ thư mục chứa file này gõ lệnh docker-compose với tham số phù hợp để thi hành những tác vụ như:
Tạo và chạy các thành phần định nghĩa trong docker-compose.yml (các dịch vụ, image, container, mạng, đĩa …).
docker-compose up
Dừng và xóa: image, container, mạng, đĩa tạo ra bởi docker-compose up
docker-compose down
Theo dõi Logs từ các dịch vụ
docker-compose logs [SERVICES]
Ngoài ra còn có các lệnh nhỏ khác như exec ps restart … sẽ tìm hiều dần khi cần dùng đến.
Thực hành
Phần thực hành mình sẽ sử dụng docker compose để dựng 1 website wordpress chỉ cần 1 cú enter, và bây giờ các bạn hãy thực hành theo mình để hiểu rõ hơn về docker compose.
Hãy tạo 1 file docker.compose.yaml, đây chính là file dùng để run ứng dụng bằng docker compose.
vi ./docker.compose.yaml
Dán vào các nội dung bên dưới
services:
wordpress:
image: wordpress
container_name: wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: mariadb
WORDPRESS_DB_USER: hoanghd
WORDPRESS_DB_PASSWORD: hoanghd
WORDPRESS_DB_NAME: wordpressdb
mariadb:
image: mariadb
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpressdb
MYSQL_USER: hoanghd
MYSQL_PASSWORD: hoanghd
MYSQL_ROOT_PASSWORD: hoanghd
ports:
- 3306:3306
volumes:
- mariadb:/var/lib/mysql
stdin_open: true
tty: true
nginx:
image: nginx
container_name: nginx
restart: unless-stopped
ports:
- 443:443
- 80:80
volumes:
- /home/nginx/nginx.conf:/etc/nginx/nginx.conf
- /home/nginx/ssl:/etc/nginx/ssl
- /home/nginx/conf.d:/etc/nginx/conf.d
links:
- wordpress
volumes:
mariadb:
Tạo thư mục ssl để lưu ssl, thư mục nginx và nginx.d để lưu các config của Nginx
mkdir -p /home/nginx/ssl
mkdir -p /home/nginx/conf.d
Copy file ssl của bạn vào thư mục /home/nginx/ssl, file ssl của mình là hoanghd.com.pem
Tạo ra file /home/nginx/nginx.conf, file này là file config chính của Nginx, mình đã chỉnh sửa lại 1 chút để cho file gọn hơn.
vi /home/nginx/nginx.conf
Dán vào nội dung ở dưới
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
Tạo file /home/nginx/conf.d/redirect_ssl.conf, file này giúp website của bạn tự động chuyển hướng từ http sang https tự động.
vi /home/nginx/conf.d/redirect_ssl.conf
Dán vào nội dung bên dưới
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Hãy tạo file /home/nginx/conf.d/wp_hoanghd.conf, đây là file config chính wordpress của bạn bao gồm trỏ ssl, khai báo domain, proxy_pass,…
vi /home/nginx/conf.d/hoanghd.com.conf
Hãy dán nội dung bên dưới vào file trên
server {
listen 443 ssl;
server_name hoanghd.com;
proxy_redirect off;
ssl_certificate /etc/nginx/ssl/hoanghd.com.pem; #fullchain.pem
ssl_certificate_key /etc/nginx/ssl/hoanghd.com.pem; #privkey.pem
ssl_trusted_certificate /etc/nginx/ssl/hoanghd.com.pem; #chain.pem
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
client_max_body_size 10m;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Content-Security-Policy upgrade-insecure-requests;
proxy_pass http://wordpress;
deny 172.16.0.0/24;
allow all;
}
}
Sau khi tạo các file xong, bạn sẽ có 1 cây thư mục như vậy
├── docker.compose.yaml
└── nginx
├── conf.d
│ ├── hoanghd.com.conf
│ └── redirect_ssl.conf
├── nginx.conf
└── ssl
└── hoanghd.com.pem
3 directories, 5 files
Sử dụng lệnh docker-compose với cú pháp docker-compose -f <docker-compose-filename.yaml>l up -d
Sau khi chạy lệnh trên, quá trình tải và build các container theo kịch bản đã được lên sẵn trong file docker-compose.yml.
$ docker-compose -f ./docker.compose.yaml up -d
[+] Running 4/4
⠿ Network home_default Created 0.0s
⠿ Container wordpress Started 1.2s
⠿ Container mariadb Started 3.1s
⠿ Container nginx Started 1.8s
Sau khi build xong, dùng lệnh docker ps bạn đã thấy 3 container đã được tạo xong
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60389c9e1629 nginx "/docker-entrypoint.…" 19 seconds ago Up 17 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx
9e40af065fac wordpress "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 80/tcp wordpress
91f072c0d971 mariadb "docker-entrypoint.s…" 19 seconds ago Up 16 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mariadb
Sử dụng máy client để test, hãy trỏ domain hoanghd.com về máy host
$ cat /etc/hosts | grep hoanghd.com
192.168.13.206 hoanghd.com
Kiểm tra kết nối giữa máy host và client
$ ping hoanghd.com
PING hoanghd.com (192.168.13.206): 56 data bytes
64 bytes from 192.168.13.206: icmp_seq=0 ttl=64 time=0.513 ms
64 bytes from 192.168.13.206: icmp_seq=1 ttl=64 time=0.562 ms
64 bytes from 192.168.13.206: icmp_seq=2 ttl=64 time=0.498 ms
64 bytes from 192.168.13.206: icmp_seq=3 ttl=64 time=0.495 ms
--- hoanghd.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.495/0.517/0.562/0.027 ms
Chúng ta có kết quả
Nếu muốn huỷ các container chạy dịch vụ wordpress vừa triển khai xong, đơn giản bạn chỉ cần chạy Sử dụng lệnh docker-compose với cú pháp docker-compose -f <docker-compose-filename.yaml>l down
$ docker-compose -f ./docker.compose.yaml down
[+] Running 4/4
⠿ Container mariadb Removed 0.7s
⠿ Container nginx Removed 0.5s
⠿ Container wordpress Removed 1.3s
⠿ Network home_default Removed
Kết quả khi kiểm tra bằng lệnh docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Kết Luận
Trong phần này, chúng ta đã bắt đầu tìm hiểu về Docker Compose và tại sao nó là một công cụ quan trọng trong việc quản lý các dịch vụ Docker đa-container. Chúng ta đã xem xét cách sử dụng Docker Compose để định nghĩa và chạy các dịch vụ Docker một cách hiệu quả.