
Tổng quan các bước để xây dựng Docker cho dự án WordPress sử dụng Nginx làm Reverse Proxy
Quy trình chính
- Tạo Docker MySQL
- Setup môi trường local
- Setup GitLab
- Setup Ubuntu Server
- Build Docker local và push lên GitLab
- Pull source code WordPress về
- Pull image từ GitLab và chạy container
- Tạo Docker cho Database MySQL
Truy cập thư mục dự án DB trên Ubuntu Server:
cd /ctech/mysql5
Tạo file docker-compose.yml với nội dung:
version: ‘3’
services:
db:
image: mysql:5.7.44
container_name: ctech_mysql
restart: always
ports:
– “3306:3306”
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: your_db
MYSQL_USER: your_user
MYSQL_PASSWORD: your_password
# Vô hiệu hóa strict mode
MYSQL_SQL_MODE: “NO_ENGINE_SUBSTITUTION”
# Cho phép sử dụng zero dates
MYSQL_INIT_COMMAND: “SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,’NO_ZERO_IN_DATE,NO_ZERO_DATE’,”));”
volumes:
– /ctech/mysql5/data:/var/lib/mysql
command: –sql-mode=”NO_ENGINE_SUBSTITUTION” –explicit_defaults_for_timestamp=1
networks:
– ctech_mysql
networks:
ctech_mysql:
name: ctech_mysql
Build Docker để hệ thống kéo Docker mặc định về:
docker-compose build
Chạy Docker:
docker-compose up
Mở cổng 3306 để kết nối dữ liệu từ xa (đóng lại sau khi hoàn thành)
Sử dụng Navicat Tools kết nối qua SSH Tunnel để tạo database và import dữ liệu
- Setup Môi Trường Local (Windows)
Tải Docker Desktop Installer.exe (chọn phiên bản phù hợp với chip của máy)
Cài đặt Docker cho Windows (cần khởi động lại máy)
Khởi động Docker và các dịch vụ phụ trợ như memcache, redis (nếu có)
Trong thư mục dự án (ví dụ: E:\xampp\htdocs\vutechsmart), tạo file Dockerfile:
FROM php:7.4-fpm
# Cài đặt các gói phụ thuộc và extensions PHP cần thiết
RUN apt-get update && apt-get install -y \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
git \
curl
# Cài đặt các PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd mysqli soap
# Cấu hình PHP theo nhu cầu
RUN echo “upload_max_filesize = 64M” >> /usr/local/etc/php/conf.d/docker-php-uploads.ini \
&& echo “post_max_size = 64M” >> /usr/local/etc/php/conf.d/docker-php-uploads.ini \
&& echo “memory_limit = 256M” >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini
# Set working directory
WORKDIR /var/www/html
# Đảm bảo quyền truy cập phù hợp
RUN chown -R www-data:www-data /var/www/html
# Expose port 9000
EXPOSE 9000
CMD [“php-fpm”]
Tạo file docker-compose.yml trong thư mục dự án:
version: ‘3’
services:
wordpress:
image: ${CI_REGISTRY_IMAGE:-anhvucnt/vout-wp-php7x}:${CI_COMMIT_SHORT_SHA:-latest}
container_name: vutechsmart_wordpress
restart: always
volumes:
– /ctech/vutechsmart.com/wordpress:/var/www/html
environment:
– WORDPRESS_DB_HOST=ctech_mysql
– WORDPRESS_DB_USER=your_user
– WORDPRESS_DB_PASSWORD=your_pass
– WORDPRESS_DB_NAME=your_db
networks:
– ctech_mysql
ports:
– “9000:9000”
networks:
ctech_mysql:
external: true
name: ctech_mysql
Tạo file .gitlab-ci.yml trong thư mục dự án:
stages:
– build
– deploy
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: “”
build:
stage: build
image: docker:20.10.16
services:
– docker:20.10.16-dind
before_script:
– docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
– docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
– docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
– docker push $CI_REGISTRY_IMAGE:latest
only:
– main
deploy:
stage: deploy
image: alpine:latest
before_script:
– apk add –no-cache openssh-client
– mkdir -p ~/.ssh
– echo “$SSH_PRIVATE_KEY” > ~/.ssh/id_rsa
– chmod 600 ~/.ssh/id_rsa
– echo -e “Host *\n\tStrictHostKeyChecking no\n\n” > ~/.ssh/config
script:
– ssh root@YOUR_SERVER_IP “cd /ctech/vutechsmart.com && \
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && \
docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA && \
docker-compose down && \
docker-compose up -d”
only:
– main
III. Setup GitLab
Đăng ký tài khoản GitLab
Tạo SSH Key
Import SSH Key vào GitLab
Tạo dự án mới trên GitLab
Thiết lập các biến môi trường (CI/CD variables):
- SSH_PRIVATE_KEY: Khóa SSH private để kết nối đến server Ubuntu
- SERVER_USER: Tên người dùng SSH trên server
- SERVER_IP: Địa chỉ IP của server
Push dự án lên GitLab:
git clone <repository-url>
git add .
git commit -m “Initial commit”
git push
- Setup Ubuntu Server
Cài đặt NGINX trên Ubuntu
Truy cập cấu hình NGINX:
cd /etc/nginx/sites-available
Tạo file cấu hình vutechsmart.com:
server {
listen 80;
server_name vutechsmart.com www.vutechsmart.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name vutechsmart.com www.vutechsmart.com;
# SSL configuration
ssl_certificate /etc/letsencrypt/live/vutechsmart.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vutechsmart.com/privkey.pem;
root /ctech/vutechsmart.com/wordpress;
index index.php;
access_log /ctech/vutechsmart.com/logs/access.log;
error_log /ctech/vutechsmart.com/logs/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 192.168.16.3:9000;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Lưu ý quan trọng:
- fastcgi_pass 192.168.16.3:9000; – IP này phải trỏ đến PHP-FPM trong Docker container. Kiểm tra bằng docker network inspect ctech_mysql
- fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; – Đây là đường dẫn trong container, không phải trên host
Tạo symbolic link sang sites-enabled:
ln /etc/nginx/sites-available/vutechsmart.com /etc/nginx/sites-enabled/
Tạo thư mục logs:
mkdir -p /ctech/vutechsmart.com/logs
cd /ctech/vutechsmart.com/logs
touch access.log error.log
cd ..
chmod 0777 -R logs
Tạo file docker-compose.yml trên server:
version: ‘3’
services:
wordpress:
image: registry.gitlab.com/anhvucnt/vout-wp-php7x:latest
container_name: vutechsmart_wordpress
restart: always
volumes:
– /ctech/vutechsmart.com/wordpress:/var/www/html
environment:
– WORDPRESS_DB_HOST=your_db_host
– WORDPRESS_DB_USER=your_user_host
– WORDPRESS_DB_PASSWORD=your_db_pass
– WORDPRESS_DB_NAME=your_db_name
networks:
– ctech_mysql
ports:
– “9000:9000”
networks:
ctech_mysql:
external: true
- Build Docker Local và Push lên GitLab
Trên môi trường local, truy cập thư mục dự án:
cd E:\xampp\htdocs\vutechsmart
Đăng nhập vào GitLab Registry:
docker login registry.gitlab.com -u your_gitlab_username -p your_password_or_access_token
Build Docker để test:
docker build -t vutechsmart:test .
Nếu không có lỗi, build Docker chính thức:
docker build –no-cache -t registry.gitlab.com/anhvucnt/vout-wp-php7x:latest -f Dockerfile .
Push Docker image lên GitLab:
docker push registry.gitlab.com/anhvucnt/vout-wp-php7x:latest
- Pull Code và Docker Image về Server Ubuntu
Truy cập thư mục dự án trên server:
cd /ctech/vutechsmart.com/
Đăng nhập vào GitLab Registry:
docker login registry.gitlab.com -u your_gitlab_username -p your_password_or_access_token
Pull Docker image:
docker pull registry.gitlab.com/anhvucnt/vout-wp-php7x:latest
Pull source code WordPress về thư mục /ctech/vutechsmart.com/wordpress
Khởi chạy Docker container:
docker-compose up -d
Truy cập website của bạn (vutechsmart.com) để kiểm tra kết quả
Lưu ý quan trọng: Trong cấu hình Nginx, chú ý đặc biệt đến fastcgi_pass 192.168.16.3:9000 và fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name. IP phải là IP của network Docker container và đường dẫn phải chính xác với đường dẫn bên trong container.
Chúc bạn thành công! 😊
Để lại một bình luận