Docker Compose — deploy WordPress + MySQL + NGINX 1 lệnh

Tài liệu » Quản trị VPS - Server » Docker Compose — deploy WordPress + MySQL + NGINX 1 lệnh

Vì sao cần Docker Compose ngay? — Quản lý multi-container app chưa bao giờ dễ đến thế

Việc deploy một ứng dụng phức tạp với nhiều thành phần (như WordPress với database và web server riêng) thủ công tốn rất nhiều thời gian và công sức. Mỗi lần thay đổi cấu hình hay di chuyển môi trường là một cơn ác mộng. Docker Compose ra đời để giải quyết triệt để vấn đề này.

  • 😩 Thiết lập thủ công tốn thời gian: Cài đặt, cấu hình từng service riêng lẻ.
  • 📦 Quản lý dependency phức tạp: Đảm bảo các service hoạt động đúng với nhau.
  • 🔄 Khó khăn khi di chuyển môi trường: Cấu hình khác nhau giữa dev, staging, prod.
  • 🐛 Debug lỗi liên quan đến kết nối: Tìm nguyên nhân khi các service không “nói chuyện” được.
  • 🚀 Triển khai chậm: Mỗi lần update là một quy trình dài.

Tóm gọn: Docker Compose là gì? — Công cụ định nghĩa và chạy ứng dụng multi-container

Docker Compose là một công cụ giúp bạn định nghĩa và quản lý các ứng dụng Docker multi-container. Bạn sử dụng một file docker-compose.yml để cấu hình tất cả các dịch vụ của ứng dụng, sau đó chỉ với một lệnh duy nhất, bạn có thể khởi tạo, chạy, dừng và xây dựng lại tất cả các dịch vụ đó.

File docker-compose.yml — Ngôn ngữ của Docker Compose

File docker-compose.yml là trái tim của Docker Compose. Nó sử dụng cú pháp YAML để mô tả các dịch vụ, mạng và volume cần thiết cho ứng dụng của bạn.

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: your_wordpress_password
    networks:
      - app_network

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: your_wordpress_password
      WORDPRESS_DB_NAME: wordpress
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

volumes:
  db_data:
  • version: Chỉ định phiên bản của cú pháp Docker Compose. 3.8 là phiên bản phổ biến và hỗ trợ nhiều tính năng mới.
  • services: Định nghĩa các container (dịch vụ) của ứng dụng.
    • db: Tên của dịch vụ database (MySQL).
      • image: Sử dụng image mysql:8.0 từ Docker Hub.
      • container_name: Đặt tên cố định cho container.
      • volumes: Mount một volume tên là db_data để lưu trữ dữ liệu database.
      • restart: always: Tự động khởi động lại container khi nó bị dừng hoặc khi Docker daemon khởi động.
      • environment: Thiết lập các biến môi trường cần thiết cho MySQL (root password, database name, user, password).
      • networks: Kết nối service này vào network app_network.
    • wordpress: Tên của dịch vụ WordPress.
      • depends_on: Đảm bảo dịch vụ db được khởi động trước dịch vụ wordpress.
      • image: Sử dụng image wordpress:latest từ Docker Hub.
      • container_name: Đặt tên cố định cho container.
      • ports: Map port 8080 trên máy host tới port 80 trong container WordPress.
      • restart: always: Tự động khởi động lại.
      • environment: Thiết lập các biến môi trường cho WordPress để kết nối tới database.
      • networks: Kết nối service này vào network app_network.
  • networks: Định nghĩa các network mà các service sẽ sử dụng. app_network là một network bridge tùy chỉnh, giúp các container giao tiếp với nhau.
  • volumes: Định nghĩa các volume để lưu trữ dữ liệu. db_data sẽ được Docker quản lý.

💡 Mẹo: Luôn sử dụng mật khẩu mạnh cho database và các biến môi trường nhạy cảm khác. Bạn có thể cân nhắc sử dụng file .env để quản lý các biến này.

Tóm gọn: Cài đặt Docker và Docker Compose — Chuẩn bị môi trường

Trước khi sử dụng Docker Compose, bạn cần cài đặt Docker Engine và Docker Compose trên hệ thống của mình. Hướng dẫn này giả định bạn đang sử dụng Ubuntu 22.04/24.04.

Cài đặt Docker Engine

  1. Cập nhật danh sách gói:
    bash
    sudo apt update
    sudo apt upgrade -y
  2. Cài đặt các gói cần thiết:
    bash
    sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
  3. Thêm GPG key chính thức của Docker:
    bash
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. Thêm kho lưu trữ Docker:
    bash
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. Cài đặt Docker Engine:
    bash
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io -y
  6. Kiểm tra cài đặt Docker:
    bash
    sudo systemctl status docker

    Bạn sẽ thấy active (running).
  7. Cho phép người dùng không phải root chạy lệnh Docker (tùy chọn):
    bash
    sudo usermod -aG docker $USER
    newgrp docker

    Sau lệnh newgrp docker, bạn cần mở một terminal mới hoặc chạy bash để áp dụng thay đổi.

Cài đặt Docker Compose

Docker Compose đã được tích hợp vào Docker Desktop trên Windows/macOS. Tuy nhiên, trên Linux, bạn thường cần cài đặt nó riêng.

  1. Tải xuống phiên bản Docker Compose mới nhất:
    bash
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    (Lưu ý: Thay v2.27.0 bằng phiên bản mới nhất nếu có)
  2. Áp dụng quyền thực thi:
    bash
    sudo chmod +x /usr/local/bin/docker-compose
  3. Kiểm tra phiên bản Docker Compose:
    bash
    docker-compose --version

    Output mẫu:
    Docker Compose version v2.27.0

⚠️ Cảnh báo: Đảm bảo bạn tải đúng phiên bản Docker Compose cho kiến trúc hệ thống của mình. Nếu không, lệnh docker-compose có thể không hoạt động.

Tóm gọn: Deploy WordPress + MySQL + NGINX với 1 lệnh duy nhất

Sau khi đã chuẩn bị xong môi trường, việc deploy ứng dụng WordPress chỉ còn là vấn đề của một vài bước đơn giản.

  1. Tạo thư mục dự án:
    bash
    mkdir my-wordpress-app
    cd my-wordpress-app
  2. Tạo file docker-compose.yml:
    Tạo một file tên là docker-compose.yml trong thư mục my-wordpress-app và dán nội dung đã cung cấp ở phần trước vào đó.
    bash
    nano docker-compose.yml

    (Dán nội dung YAML vào và lưu file)

  3. Khởi tạo và chạy các dịch vụ:
    Trong thư mục chứa file docker-compose.yml, chạy lệnh sau:
    bash
    docker-compose up -d

    • up: Lệnh này sẽ tạo và khởi động các container dựa trên file docker-compose.yml.
    • -d: Chạy các container ở chế độ nền (detached mode), không chiếm giữ terminal.

    Docker sẽ tải về các image cần thiết (nếu chưa có) và khởi tạo các container. Quá trình này có thể mất vài phút tùy thuộc vào tốc độ mạng của bạn.

  4. Kiểm tra trạng thái các container:
    bash
    docker ps

    Output mẫu:
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    a1b2c3d4e5f6 wordpress:latest "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp wordpress_app
    f7e6d5c4b3a2 mysql:8.0 "docker-entrypoint.s…" 10 seconds ago Up 9 seconds 3306/tcp, 33060/tcp mysql_db

    Bạn sẽ thấy cả hai container (wordpress_appmysql_db) đang chạy (Up).

  5. Truy cập WordPress:
    Mở trình duyệt web và truy cập vào địa chỉ http://localhost:8080 (hoặc http://<IP_CUA_MAY_CHUT>/:8080 nếu bạn chạy trên VPS). Bạn sẽ thấy màn hình cài đặt WordPress.

💡 Mẹo: Nếu bạn muốn xem log của các container, bạn có thể dùng lệnh docker-compose logs -f. Dấu -f sẽ theo dõi log theo thời gian thực.

Tóm gọn: Cấu hình NGINX làm Reverse Proxy (Nâng cao)

Mặc dù WordPress có thể chạy trực tiếp trên port 80, việc sử dụng NGINX làm reverse proxy mang lại nhiều lợi ích như SSL termination, caching, load balancing và bảo mật tốt hơn.

Thêm NGINX vào docker-compose.yml

Chúng ta sẽ thêm một dịch vụ NGINX vào file docker-compose.yml và cấu hình nó để chuyển tiếp request tới container WordPress.

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: your_wordpress_password
    networks:
      - app_network

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wordpress_app
    # Bỏ port mapping ở đây vì NGINX sẽ expose port 80
    # ports:
    #   - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: your_wordpress_password
      WORDPRESS_DB_NAME: wordpress
    networks:
      - app_network

  nginx:
    image: nginx:latest
    container_name: nginx_proxy
    ports:
      - "80:80" # Map port 80 của host tới port 80 của NGINX
      - "443:443" # Map port 443 của host tới port 443 của NGINX
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d # Mount thư mục cấu hình NGINX
      # - ./nginx/ssl:/etc/nginx/ssl # Mount thư mục chứa SSL certificate (nếu có)
    depends_on:
      - wordpress
    restart: always
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

volumes:
  db_data:

Tạo file cấu hình NGINX

  1. Tạo thư mục cấu hình NGINX:
    bash
    mkdir -p nginx/conf.d
  2. Tạo file cấu hình NGINX (nginx/conf.d/default.conf):
    bash
    nano nginx/conf.d/default.conf

    Dán nội dung sau vào file:
    “`nginx
    server {
    listen 80;
    server_name your_domain.com www.your_domain.com; # Thay bằng domain của bạn hoặc IP

    location / {
        proxy_pass http://wordpress:80; # Chuyển tiếp request tới container wordpress
        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_set_header X-Forwarded-Proto $scheme;
    }
    
    # Cấu hình cho SSL (nếu có)
    # listen 443 ssl;
    # ssl_certificate /etc/nginx/ssl/your_domain.com.crt;
    # ssl_certificate_key /etc/nginx/ssl/your_domain.com.key;
    # include /etc/nginx/options-ssl-nginx.conf;
    # ssl_dhparam /etc/nginx/ssl/ssl-dhparams.pem;
    
    # location / {
    #     proxy_pass http://wordpress:80;
    #     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_set_header X-Forwarded-Proto $scheme;
    # }
    

    }
    ``
    *
    listen 80;: NGINX lắng nghe trên port 80.
    *
    server_name your_domain.com www.your_domain.com;: Thay thế bằng tên miền hoặc địa chỉ IP của VPS của bạn.
    *
    location /: Định nghĩa cách xử lý các request tới gốc (/).
    *
    proxy_pass http://wordpress:80;: Chuyển tiếp request tới dịch vụwordpresstrên port 80. Docker Compose sẽ tự động phân giải tênwordpressthành IP nội bộ của container.
    *
    proxy_set_header …`: Chuyển tiếp thông tin quan trọng của request gốc tới backend (WordPress).

  3. Chạy lại Docker Compose:
    bash
    docker-compose up -d

    Docker Compose sẽ xây dựng lại image NGINX (nếu cần) và khởi động container NGINX.

  4. Truy cập WordPress qua NGINX:
    Bây giờ, bạn truy cập http://<IP_CUA_MAY_CHUT> hoặc http://your_domain.com (thay thế bằng tên miền/IP thực tế của bạn).

💡 Mẹo: Để cấu hình SSL, bạn cần tạo hoặc tải chứng chỉ SSL lên server và mount vào thư mục /etc/nginx/ssl trong container NGINX, sau đó bỏ comment và cập nhật các dòng cấu hình SSL trong default.conf.

Tóm gọn: Quản lý ứng dụng với các lệnh Docker Compose

Docker Compose cung cấp một bộ lệnh mạnh mẽ để quản lý toàn bộ vòng đời của ứng dụng multi-container.

Khởi động ứng dụng

  • Chạy ở chế độ nền:
    bash
    docker-compose up -d
  • Chạy ở chế độ foreground (xem log trực tiếp):
    bash
    docker-compose up

    Nhấn Ctrl+C để dừng.

Dừng và xóa ứng dụng

  • Dừng tất cả các container, mạng, volume và image:
    bash
    docker-compose down
  • Dừng container nhưng giữ lại mạng và volume:
    bash
    docker-compose stop
  • Xóa container và mạng (giữ lại volume):
    bash
    docker-compose rm

    Lệnh này sẽ hỏi xác nhận trước khi xóa. Thêm cờ -f để xóa không cần xác nhận.

Xem trạng thái và log

  • Liệt kê các container đang chạy:
    bash
    docker-compose ps
  • Xem log của tất cả các dịch vụ:
    bash
    docker-compose logs
  • Theo dõi log theo thời gian thực:
    bash
    docker-compose logs -f
  • Xem log của một dịch vụ cụ thể (ví dụ: wordpress):
    bash
    docker-compose logs wordpress

Xây dựng lại image

  • Xây dựng lại image từ Dockerfile (nếu có):
    bash
    docker-compose build
  • Xây dựng lại image và bỏ qua cache:
    bash
    docker-compose build --no-cache

Các lệnh hữu ích khác

  • Kiểm tra cấu hình file docker-compose.yml:
    bash
    docker-compose config
  • Chạy một lệnh trong container:
    bash
    docker-compose exec wordpress bash

    Lệnh này sẽ mở một shell bash bên trong container wordpress.

⚠️ Cảnh báo: Lệnh docker-compose down sẽ xóa các container và mạng. Nếu bạn muốn giữ lại dữ liệu của database, hãy đảm bảo volume db_data không bị xóa hoặc bạn đã sao lưu dữ liệu trước đó.

Pitfalls & lỗi thường gặp

  1. Lỗi kết nối database (Error establishing a database connection)

    • Nguyên nhân: Biến môi trường WORDPRESS_DB_HOST, WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME trong docker-compose.yml bị sai, hoặc dịch vụ db chưa chạy khi wordpress khởi động.
    • Cách fix:
      • Kiểm tra kỹ các biến môi trường.
      • Đảm bảo depends_on: - db được thiết lập đúng cho dịch vụ wordpress.
      • Chạy docker-compose up -d lại để khởi động lại các dịch vụ.
      • Kiểm tra log của cả hai container (docker-compose logs dbdocker-compose logs wordpress).
  2. WordPress không truy cập được (404, 502, 503)

    • Nguyên nhân: Cấu hình NGINX sai, port mapping không đúng, hoặc container WordPress bị lỗi.
    • Cách fix:
      • Kiểm tra port mapping trong docker-compose.yml (host port và container port).
      • Kiểm tra file cấu hình NGINX (nginx/conf.d/default.conf), đảm bảo proxy_pass trỏ đúng tới tên dịch vụ wordpress và port của nó.
      • Kiểm tra log của container NGINX (docker-compose logs nginx) và WordPress.
  3. Lỗi “Cannot connect to the Docker daemon”

    • Nguyên nhân: Docker daemon không chạy, hoặc người dùng hiện tại không có quyền truy cập Docker.
    • Cách fix:
      • Khởi động Docker daemon: sudo systemctl start docker.
      • Kiểm tra trạng thái: sudo systemctl status docker.
      • Nếu bạn chưa thêm người dùng vào nhóm docker, hãy chạy lại lệnh sudo usermod -aG docker $USER và mở lại terminal hoặc chạy newgrp docker.
  4. Lỗi phiên bản Docker Compose (command not found: docker-compose)

    • Nguyên nhân: Docker Compose chưa được cài đặt hoặc không nằm trong PATH của hệ thống.
    • Cách fix:
      • Kiểm tra lại các bước cài đặt Docker Compose.
      • Đảm bảo bạn đã thực thi sudo chmod +x /usr/local/bin/docker-compose.
      • Thử chạy bằng docker compose (với khoảng trắng) thay vì docker-compose (nếu bạn cài phiên bản mới hơn được tích hợp vào CLI Docker).

Key takeaways

  • Docker Compose đơn giản hóa việc quản lý các ứng dụng multi-container bằng cách sử dụng file docker-compose.yml.
  • Một file docker-compose.yml có thể định nghĩa các dịch vụ, mạng, volume và cấu hình liên quan.
  • Lệnh docker-compose up -d là “cứu cánh” để khởi động toàn bộ ứng dụng chỉ với một thao tác.
  • NGINX có thể dễ dàng được tích hợp làm reverse proxy, cung cấp các tính năng nâng cao như SSL và caching.
  • Các lệnh như down, ps, logs giúp quản lý và gỡ lỗi ứng dụng một cách hiệu quả.

FAQ

### Docker Compose có cần cài đặt riêng không?

Trên Linux, bạn cần cài đặt Docker Compose riêng. Tuy nhiên, trên Docker Desktop (Windows/macOS), nó thường đi kèm sẵn.

### Tôi có thể chạy nhiều trang WordPress trên cùng một server bằng Docker Compose không?

Có, bạn có thể tạo nhiều thư mục dự án, mỗi thư mục có file docker-compose.yml riêng, và cấu hình port mapping khác nhau để chạy nhiều trang WordPress độc lập.

### Làm thế nào để backup dữ liệu WordPress và MySQL?

Đối với MySQL, bạn có thể sử dụng volume. Để backup, bạn có thể truy cập vào container MySQL và chạy lệnh mysqldump hoặc sao chép dữ liệu từ volume db_data trên host. Đối với file uploads của WordPress, bạn cần backup thư mục /var/www/html/wp-content bên trong container WordPress hoặc mount một volume riêng cho nó.

### Tôi có thể dùng image Docker khác cho MySQL hoặc WordPress không?

Chắc chắn rồi. Bạn chỉ cần thay đổi tên image trong docker-compose.yml sang image bạn muốn sử dụng (ví dụ: mariadb:latest thay vì mysql:8.0).

### Cờ -d trong docker-compose up -d có ý nghĩa gì?

Cờ -d viết tắt của “detached mode”, có nghĩa là các container sẽ chạy ở chế độ nền, không chiếm giữ terminal của bạn. Điều này cho phép bạn tiếp tục sử dụng terminal cho các lệnh khác.

### Làm sao để cập nhật WordPress lên phiên bản mới nhất?

  1. Dừng ứng dụng: docker-compose down
  2. Cập nhật tag image trong docker-compose.yml (ví dụ: từ wordpress:latest lên wordpress:6.5.3 hoặc tag mới nhất).
  3. Chạy lại ứng dụng: docker-compose up -d
  4. WordPress có thể yêu cầu cập nhật database khi bạn truy cập lần đầu.

Cần VPS chạy Docker Compose?

Để triển khai các ứng dụng Docker phức tạp như WordPress với NGINX và MySQL, bạn cần một môi trường máy chủ ổn định và hiệu năng cao. VPS tại VSIS.NET cung cấp cho bạn toàn quyền kiểm soát, tài nguyên mạnh mẽ và độ tin cậy cần thiết để chạy Docker và Docker Compose mượt mà.

Hãy trải nghiệm sự linh hoạt và sức mạnh của Docker Compose trên hạ tầng VPS chất lượng cao của chúng tôi.

Khám phá ngay các gói VPS tại: vsis.net/vps

Lên đầu trang