Mục lục bài viết

Docker

Hướng dẫn cài đặt WordPress bằng Docker Compose

phongdh
phongdh
Chia sẻ:
Zalo
Hướng dẫn cài đặt WordPress bằng Docker Compose

Giới thiệu

WordPress là một phần mềm nguồn mở dùng để tạo và quản lý nội dung website. Nó hoạt động như một hệ thống quản lý nội dung (CMS) cho phép người dùng tạo, chỉnh sửa, đăng và quản lý các bài viết, trang web một cách đơn giản thông qua giao diện trực quan. Để cài đặt WordPress một cách hiệu quả và linh hoạt, Docker là một công cụ mạnh mẽ giúp triển khai ứng dụng trong môi trường container hóa. Docker Compose là một phần mở rộng của Docker, cho phép bạn định nghĩa và chạy nhiều container cùng lúc chỉ bằng một file cấu hình.

Hướng dẫn này sẽ chỉ cho bạn cách cài đặt WordPress trên Docker với sự hỗ trợ của Nginx và Mariadb, cho phép chạy cả HTTP và HTTPS.

Tổng quát các phần cài đặt

Cấu trúc dữ án cài đặt wordpress
  • db/: Thư mục này dùng để lưu trữ dữ liệu của MariaDB. Nó giúp duy trì dữ liệu ngay cả khi container MariaDB bị xóa hoặc khởi động lại.
  • nginx/: Chứa các file cấu hình cho Nginx, bao gồm file cấu hình chính nginx.conf, và các file chứng chỉ SSL (fullchain.pem và privkey.pem) nếu có.
    • nginx.conf: File cấu hình của Nginx, xác định cách Nginx xử lý các yêu cầu đến và chuyển tiếp đến WordPress.
    • fullchain.pem và privkey.pem: Các file chứng chỉ SSL để hỗ trợ HTTPS. Nếu chưa có chứng chỉ, có thể sử dụng Let’s Encrypt để tạo.
  • wordpress/: Thư mục chứa mã nguồn của WordPress. Tất cả các file WordPress được lưu tại đây, bao gồm các theme, plugin, và nội dung tùy chỉnh.
  • docker-compose.yml: Đây là file cấu hình chính của Docker Compose, định nghĩa các dịch vụ (services) như wordpress, mariadb, và nginx, cùng với các mạng (networks) và volume.
  • .env: chứa các biến môi trường để cấu hình các dịch vụ trong docker-compose.yml.

Cài đặt

Chuẩn bị môi trường

  1. Cài đặt Docker và Docker Compose trên máy chủ của bạn.
  2. Tạo một thư mục mới cho dự án: mkdir wordpress-docker && cd wordpress-docker
mkdir wordpress-docker && cd wordpress-docker

Tạo file cấu hình docker-compose.yml

Tạo file docker-compose.yml với nội dung sau:

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
    volumes:
      - ./wordpress:/var/www/html
    depends_on:
      - db
    networks:
      - wordpress_network

  db:
    image: mariadb:latest
    container_name: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - wordpress_network

  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./wordpress:/var/www/html
      - ./nginx/fullchain.pem:/etc/nginx/fullchain.pem
      - ./nginx/privkey.pem:/etc/nginx/privkey.pem
    ports:
      - "80:80"
      - "443:443"
    networks:
      - wordpress_network

networks:
  wordpress_network:
    driver: bridge

  • wordpress:
    • Image: Sử dụng image WordPress mới nhất (wordpress:latest).
    • Container Name: Container sẽ có tên là wordpress.
    • Restart Policy: Tự động khởi động lại container khi bị dừng hoặc gặp lỗi (restart: always).
    • Environment Variables:
      • WORDPRESS_DB_HOST: Đặt địa chỉ của cơ sở dữ liệu là db:3306, nghĩa là dịch vụ db sẽ được sử dụng qua cổng 3306.
    • WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME: Các biến này lấy giá trị từ các biến môi trường tương ứng (${MYSQL_USER}, ${MYSQL_PASSWORD}, ${MYSQL_DATABASE}) trong file .env để kết nối đến cơ sở dữ liệu.
    • Volumes: Gắn thư mục ./wordpress từ máy chủ vào đường dẫn /var/www/html trong container, giúp lưu trữ dữ liệu WordPress bên ngoài container.
    • Dependencies:
      • depends_on: Xác định rằng dịch vụ wordpress phụ thuộc vào db, đảm bảo MariaDB khởi động trước.
    • Networks: Kết nối vào wordpress_network, cho phép các container giao tiếp với nhau trong cùng một mạng.
  • db (MariaDB)
    • Image: Sử dụng image MariaDB mới nhất (mariadb:latest).
    • Container Name: Container sẽ có tên là mariadb.
    • Restart Policy: Tự động khởi động lại container khi cần (restart: always).
    • Environment Variables:
      • MYSQL_ROOT_PASSWORD: Đặt mật khẩu cho tài khoản root của MariaDB.
      • MYSQL_DATABASE: Tạo cơ sở dữ liệu ban đầu có tên theo giá trị của ${MYSQL_DATABASE}.
      • MYSQL_USER, MYSQL_PASSWORD: Tạo tài khoản người dùng cơ sở dữ liệu với tên và mật khẩu lấy từ các biến môi trường.
    • Volumes: Gắn thư mục ./db từ máy chủ vào đường dẫn /var/lib/mysql trong container, giúp lưu trữ dữ liệu của MariaDB bên ngoài container.
    • Networks: Kết nối vào wordpress_network để giao tiếp với dịch vụ wordpress.
  • nginx:
    • Image: Sử dụng image Nginx mới nhất (nginx:latest).
    • Container Name: Container sẽ có tên là nginx.
    • Restart Policy: Tự động khởi động lại container khi cần (restart: always).
    • Volumes:
      • /nginx/nginx.conf:/etc/nginx/nginx.conf : Gắn file cấu hình Nginx nginx.conf từ ./nginx/nginx.conf vào đường dẫn /etc/nginx/nginx.conf trong container.
      • /wordpress:/var/www/html : Gắn thư mục ./wordpress từ máy chủ vào /var/www/html, cho phép Nginx truy cập vào nội dung của WordPress.
      • /nginx/fullchain.pem:/etc/nginx/fullchain.pem, /nginx/privkey.pem:/etc/nginx/privkey.pem : Gắn chứng chỉ SSL fullchain.pem và privkey.pem để sử dụng HTTPS.
    • Ports: Mở cổng 80 (HTTP) và 443 (HTTPS) trên máy chủ để trỏ đến Nginx.
    • Networks: Kết nối vào wordpress_network, giúp Nginx giao tiếp với WordPress.

Tạo file cấu hình nginx.conf

Tạo thư mục nginx và file nginx.conf với cấu hình sau:

mkdir nginx
cd nginx/
vi nginx.conf

# nginx.conf

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Thiết lập log
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    # Thiết lập server block
    server {
        listen 80;  # Lắng nghe trên cổng HTTP 80
        server_name <tên-miền> <www.tên-miền>;

        listen 443 ssl;
        ssl_certificate /etc/nginx/fullchain.pem;
        ssl_certificate_key /etc/nginx/privkey.pem;
	
    # Chuyển tiếp yêu cầu tới WordPress container
        location / {
            proxy_pass https://api.phongdinh.info.vn:80;  # Địa chỉ 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;
        }

    # Đường dẫn để phục vụ yêu cầu xác minh từ Let's Encrypt (nếu cần cho SSL sau này)
        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }
    }
}

Đặt các file chứng chỉ SSL fullchain.pemprivkey.pem trong thư mục nginx/

Tạo file .env

Tại thư mục gốc chứa dữ án là wordpress-docker/ tạo file .env với nội dung sau:

vi .env

# Cấu hình WordPress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=phongdh_wordpress
WORDPRESS_DB_PASSWORD=<password>
WORDPRESS_DB_NAME=phongdh_wordpress

# Cấu hình MariaDB
MYSQL_ROOT_PASSWORD=<password>
MYSQL_DATABASE=phongdh_wordpress
MYSQL_USER=phongdh_wordpress
MYSQL_PASSWORD=<password>

Khởi động các container

Sau khi tạo các file cấu hình hoàn tất, đứng tại thư mục chứa dữ án wordpress-docker/ chạy lệnh sau để khởi động các container:

docker-compose up -d

Cấu hình SSL miễn phí với Let’s Encrypt

Nếu bạn chưa có chứng chỉ SSL và muốn cài đặt, Bạn có thể sử dụng Let’s Encrypt để tạo chứng chỉ SSL miễn phí.

Tạo các thư mục certbot/conf certbot/www

mkdir -p ./certbot/conf ./certbot/www
  • certbot/conf:
    • Mục đích: Lưu trữ cấu hình và chứng chỉ SSL của Let’s Encrypt.
    • Nội dung:
      • Chứng chỉ SSL
      • Khóa riêng tư
      • Cấu hình renewal của Certbot
      • Logs của Certbot
  • certbot/www:
    • Mục đích: Sử dụng cho quá trình xác thực HTTP-01 của Let’s Encrypt.
    • Nội dung: Các file tạm thời được tạo ra trong quá trình xác thực domain

Thêm cấu hình cho certbot vào file docker-compose.yml

Thêm cấu hình cho service mới certbot vào file docker-compose.yml để quản lý chứng chỉ SSL với thông tin sau

certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

Sửa lại cấu hình phần service nginx theo thông tin sau:

  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./wordpress:/var/www/html
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    ports:
      - "80:80"
      - "443:443"
    networks:
      - wordpress_network

Thêm cấu hình cho nignx.conf

Mở file nginx/nginx.conf và chỉnh sửa cấu hình ở phần https thành cấu hình sau:

http {

    server {
        listen 80;
        server_name phongdinh.id.vn www.phongdinh.id.vn;
        
        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name phongdinh.id.vn www.phongdinh.id.vn;

        ssl_certificate /etc/letsencrypt/live/phongdinh.id.vn/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/phongdinh.id.vn/privkey.pem;


        location / {
            proxy_pass https://api.phongdinh.info.vn: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;
        }
    }
}

Hướng dẫn cài đặt SSL

Khổi động lại containers bằng lệnh sau:

docker-compose up -d

Dừng container Nginx:

docker-compose stop nginx

Chạy Certbot để lấy chứng chỉ SSL:

docker-compose run --rm certbot certonly --webroot -w /var/www/certbot -d phongdinh.id.vn -d www.phongdinh.id.vn --email [email protected] --agree-tos --no-eff-email

Khởi động lại Nginx:

docker-compose up -d --force-recreate nginx

Cấu hình WordPress

Sau khi khởi động các container thành công ở bước trên, bạn truy cập tên miền để kiểm tra và thiết lập các bước cài đặt wordpress ban đầu nhé!

Kết luận

Việc cài đặt WordPress bằng Docker Compose mang lại nhiều lợi ích, như dễ dàng triển khai, quản lý và bảo trì. Bằng cách phân chia các thành phần như WordPress, MariaDB và Nginx thành các container riêng biệt, bạn có thể tối ưu hóa hiệu suất và đảm bảo tính ổn định cho hệ thống.

Quy trình từng bước đã giúp thiết lập một môi trường WordPress an toàn và hiệu quả với chứng chỉ SSL, lưu trữ dữ liệu lâu dài, và dễ dàng cấu hình.

Chia sẻ:
Zalo
phongdh

phongdh

Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận

0 bình luận cho bài viết này

* Địa chỉ email của bạn sẽ được bảo mật và không hiển thị công khai.

Chưa có bình luận nào

Hãy là người đầu tiên chia sẻ góc nhìn của bạn về bài viết này nhé!

Zalo

Nhập từ khóa để tìm kiếm...

0 kết quả

CHUYÊN MỤC LIÊN QUAN