Skip to main content

Hướng Dẫn Cài đặt WordPress với Docker

Ở bài viết này chúng ta sẽ hướng dẫn tạo một website Wordpress thông qua Docker Compose, Nginx, Apache, PHP 8.1, MariaDB và Let’s Encrypt trên Ubuntu 22.04. 

Giới thiệu về Docker

Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên Linux. Docker sử dụng những tài nguyên cô lập của Linux như cgroups, kernel, quản lý tệp để cho phép các container chạy độc lập bên trong một thực thể Linux.

Các thay đổi được lưu trữ trong các Docker image, các lớp tệp hệ thống được tạo ra và lưu lại dựa theo từng lớp (layer). Điều này giúp cho Docker Image giảm dung lượng đáng kể so với máy ảo (VM).

Các ứng dụng muốn chạy bằng Docker phải là ứng dụng chạy được trên Linux. Gần đây, Docker có hỗ trợ thêm việc chạy ứng dụng Windows trong các Windows container.

Các thành phần chính của Docker

  • Docker Engine: dùng để tạo ra Docker image và chạy Docker container.
  • Docker Hub: dịch vụ lưu trữ giúp chứa các Docker image.
  • Docker Machine: tạo ra các Docker engine trên máy chủ.
  • Docker Compose: chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hình YAML
  • Docker image: một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các
  • Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.
  • Docker container: một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.

Cài đặt Docker và Docker Compose

Bước 1: Cập nhập hệ thống Ubutu

sudo apt update -y && apt upgrade -y

Bước 2: Cài đặt docker

Cài đặt một số gói cho phép sử dụng HTTPS

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Thêm khóa GPG của kho lưu trữ Docker.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Bây giờ hãy thêm kho lưu trữ Docker của Ubuntu 22.04

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

Cập nhật packages và thiết lập để cài đặt Docker từ kho lưu trữ chính thức

sudo apt update
sudo apt-cache policy docker-ce
Image
Cập nhật packages và thiết lập để cài đặt Docker từ kho lưu trữ chính thức

Cài đặt Docker

sudo apt install docker-ce -y

Kiểm tra trạng thái của Docker

sudo systemctl status docker

Kết quả

Image
Kiểm tra trạng thái của Docker

Bước 3: Cấu hình quyền Sudo cho user sử dụng Docker

Các Docker yêu cầu chỉ được thực thi với tư cách người dùng root theo mặc định. Do đó nếu các bạn sử dụng các user khác thì cần phải thêm user đó vào nhóm Docker thì mới có quyền thao tác.

sudo usermod -aG docker username  (Nhớ thay username bằng user của bạn)

Để xem các thông tin về Docker

docker info

Bước 4: Cài đặt Docker Compose

Để cài đặt phiên bản Docker Compose mới nhất từ ​​kho lưu trữ GitHub thì bạn sử dụng lệnh sau

sudo curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Phần quyền cho file vừa tái xuống

sudo chmod +x /usr/local/bin/docker-compose

Kiểm tra sau khi cài đặt

docker-compose --version

Kết quả

Image
Kiểm tra sau khi cài đặt Docker Compose

Như vậy Docker Compose đã được cài đặt thành công

Khởi tạo thư mục cho dự án WordPress

Bước 1: Tạo thư mục chứa dự án có tên là wp-demo

cd /home
mkdir wp-demo

Bước 2: Tạo Docker Compose file YML

cd wp-demo
nano docker-compose.yml

Và thêm nội dung bên dưới vào file vừa tạo

version: "3.9"
services:
    wordpress:
        container_name: wordpress
        image: wordpress:php8.1-apache
        restart: always
        stdin_open: true
        tty: true
        environment:
            WORDPRESS_DB_HOST: mariadb
            WORDPRESS_DB_USER: db_user
            WORDPRESS_DB_PASSWORD: db_user_pass
            WORDPRESS_DB_NAME: db_name
        volumes:
            - wordpress_data:/var/www/html
            - ./wordpress:/var/www/html
    mariadb:
        container_name: mariadb
        image: mariadb
        restart: always
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_user
            MYSQL_PASSWORD: db_user_pass
            MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
        volumes:
            - db_data:/var/lib/mysql
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./certbot/conf:/etc/nginx/ssl
            - ./certbot/data:/var/www/html
    certbot:
        container_name: certbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email youremail@domain.com --agree-tos --no-eff-email -d domain.com -d www.domain.com
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./certbot/data:/var/www/html
volumes:
    db_data:
    wordpress_data:

Lưu Ý: Bạn thay đổi các thông tin db_user, db_user_pass, db_name, root_pass , youremail@domain.com, domain.com cho phù hợp với dự án của bạn

Cấu hình Nginx

Theo như nội dung cấu hình của File docker-compose.yml , thì chúng ta sẽ cần tạo file default.conf bên trong đường dẫn nginx/conf, do đó các bạn sử dụng cách lệnh sau để tạo folder/file mình cần.

mkdir -p /root/nginx/conf

tạo file default.conf

nano /root/nginx/conf/default.conf

Và thêm nội dung bên dưới vào file vừa tạo.

server {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain.com;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
        allow all; 
        root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~/. {
        deny all;
        access_log off;
        log_not_found off;
    }
} 

Lưu ý đổi domain.com thành domain của bạn

Khởi động dự án demo Wordpress với Docker Compose

cd wp-demo
docker-compose up -d

Quá trình chạy sẽ diễn ra như hình dưới, các bạn cần chờ quá trình chạy hoàn tất nhé.

Nếu thành công bạn sẽ nhận được thông báo

Image
Khởi động dự án demo Wordpress với Docker Compose

Khi tất cả các containers được khởi động, bạn sẽ thấy hai thư mục certbot và wordpress được tạo ra và nằm cùng với file docker-compose.yml như hình. Trong đó:

  • cerbot: Chứa các file liên quan đến chứng chỉ SSL của bạn.
  • wordpress: Chứa mã nguồn website WordPress của bạn.

Để xem các containers, bạn có thể thực hiện lệnh sau.

docker-compose ps

Cấu hình Let’s Encrypt SSL với Nginx

Khi bạn có chứng chỉ SSL Let’s Encrypt, bạn có thể cấu hình HTTPS và chuyển hướng trang web sang HTTPS bằng cách chỉnh sửa file cấu hình default.conf như sau:

nano /root/nginx/conf/default.conf

và thay đổi nội dung 

server {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain;

    return 301 https://domain.com$request_uri;
}

 server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    return 301 https://www.domain.com$request_uri; 
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name www.domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all; 
         root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~/. {
        deny all;
        access_log off;
        log_not_found off;
    }
} 

Sau khi chỉnh sửa File xong các bạn lưu lại và khởi động lại Nginx với lệnh

docker-compose restart nginx

Bây giờ bạn hãy vào trình duyệt bất kỳ và truy cập theo địa chỉ website bạn đã thiết lập domain.com, lúc này bạn sẽ thấy website của mình đã tự chuyển hướng sang https và hiển thị trang cài đặt WordPress mặc định.

Bạn tiến hành nhập thông tin Database đã khai báo ở file docker-compose.yml vào là hoàn tất.

Và giao diện Wordpress sau khi thiết lập xong sẽ như hình.

Image
Hướng Dẫn Cài đặt WordPress với Docker

Nguồn: azdigi.com