Thursday, November 21, 2024

[Docker] Phần 7 – Docker Compose là gì? Tạo và chạy các dịch vụ Docker

-

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/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ả.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories