Làm thế nào để tạo môi trường Docker WordPress Nginx
Hướng dẫn bạn cách tạo môi trường develop Wordpress sử dụng webserver là Nginx bằng Docker Compose.
Bạn đang mong muốn tạo một môi trường webserver cho WordPress là php-fpm + nginx nhanh bằng Docker Compose trên tất cả các hệ điều hành Windows, MacOS, Linux, cùng mình tham khảo các bước dưới đây nhé
Yêu cầu tạo môi trường như sau
- Domain cho môi trường dev local là:
example.co:5000
- Webserver là nginx
- Dùng php-fpm
- Source code wordpress
- Mysql
- Tất cả đều được ánh xạ tới nơi chứa project ví dụ như source code wordpress được lưu trữ trong project mình có thể thêm sửa xóa
Điều kiện cần để tạo môi trường Docker WordPress Nginx
- Để làm được trước tiên bạn buộc phải cài Docker nhé, bài viết này sẽ hướng dẫn bạn cách cài đặt Docker trên các hệ điều hành Windows, MacOS, Linux
- Cần hiểu các kiến thức/lệnh cơ bản về Docker (image, container, docker hub,...)
- Hoặc chẳng cần biết gì, chỉ cần biết LAMP WordPress trước đây cũng được, bạn chỉ việc làm theo từng bước sau đó ngâm cứu tìm hiểu kỹ hơn sau cũng được, nhưng trong từng bước mình sẽ hướng dẫn thật dễ hiểu cho bạn hiểu
Tạo file docker-compose.yml cho WordPress + Nginx + Mysql
Trước khi tạo file docker-compose.yml
bạn chắc chắn con trỏ mình đang ở thư mục project bạn mong muốn tạo ví dụ ở đây mình sẽ dùng thư mục có tên là example
Khai báo service database
version: '3'
services:
db:
image: mysql:8.0
container_name: db-example
restart: unless-stopped
env_file: ./app/.env
environment:
- MYSQL_DATABASE=example
volumes:
- ./dbdata:/var/lib/mysql
#- ./db/db.sql:/docker-entrypoint-initdb.d/install_wordpress.sql #if you have db.sql of project input here
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
...
Giải thích vài điểm quan trọng cho bạn hiểu
- Database ở đây mình sẽ sử dụng image mysql:8.0
- Container name sẽ là đặt là db-example
- File .env khai báo biến môi trường trong thư mục app (ví dụ như MYSQL_ROOT_PASSWORD(mật khẩu root của mysql), MYSQL_USER, MYSQL_PASSWORD,...)
- Biến môi trường environment: MYSQL_DATABASE=example (tên database là example)
- Ánh xạ mysql tới folder dbdata ./dbdata:/var/lib/mysql
Khai báo service wordpress
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wordpress-example
restart: unless-stopped
env_file: ./app/.env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root
- WORDPRESS_DB_NAME=example
volumes:
- ./app:/var/www/html
networks:
- app-network
Service wordpress:
- Có liên kết tới db depends_on: db
- Image mình sẽ sử dụng wordpress:5.5.1-fpm-alpine
- Container mình đặt là: wp-example
- Cũng khai báo biến môi trường trong file ./app/.env
- Khai báo biến môi trường trực tiếp: (WORDPRESS_DB_HOST, WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD, WORDPRESS_DB_NAME)
- Ánh xạ source code wordpress tới thư mục app: ./app:/var/www/html
Khai báo service webserver
...
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver-example
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
- app-network
...
Service webserver Nginx
- Lệ thuộc buộc phải có sẵn wordpress: depends_on: - wordpress
- Image sử dụng là: nginx:1.15.12-alpine
- Đăt tên container webserver là webserver-example
- Port sử dụng trên máy host là 80 container là 5000: 5000:80
- Ánh xạ webroot tại thư mục app: ./app:/var/www/html
- Ánh xạ thư mục config nginx /etc/nginx/conf.d tới thư mục nginx-conf: ./nginx-conf:/etc/nginx/conf.d - Trong thư mục nginx-conf cần phải có file nginx.conf, mình sẽ hướng dẫn tạo file nginx.conf bên dưới
File docker-compose.yml hoàn thiện
version: '3'
services:
db:
image: mysql:8.0
container_name: db-example
restart: unless-stopped
env_file: ./app/.env
environment:
- MYSQL_DATABASE=example
volumes:
- ./dbdata:/var/lib/mysql
#- ./db/db.sql:/docker-entrypoint-initdb.d/install_wordpress.sql #if you have db.sql of project input here
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
wordpress:
depends_on:
- db
image: wordpress:5.1.1-fpm-alpine
container_name: wordpress-example
restart: unless-stopped
env_file: ./app/.env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root
- WORDPRESS_DB_NAME=example
volumes:
- ./app:/var/www/html
networks:
- app-network
webserver:
depends_on:
- wordpress
image: nginx:1.15.12-alpine
container_name: webserver-example
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
- app-network
volumes:
wordpress-example:
dbdata:
networks:
app-network:
driver: bridge
Tạo file nginx.conf
Tạo file config trong thư mục nginx-conf/nginx.conf
Mục đích tạo file này để config webser theo ý muốn mình:
- Domain sẽ là example.co
- Port host là 80
- Thực hiện chạy backend php-fpm port 9000
server {
listen 80;
#listen \[::\]:80;
server_name example.co www.example.co;
index index.php index.html index.htm;
root /var/www/html;
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src \* data: 'unsafe-eval' 'unsafe-inline'" always;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# enable strict transport security only if you understand the implications
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \\.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\\.php)(/.+)$;
fastcgi_pass wordpress-example:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~\* \\.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
Giải thích quan trọng ở dòng fastcgi_pass wp-example:9000;
có nghĩa là nginx sẽ thực hiện run backend wordpress-fpm thông qua port 9000 với container name đặt ở trên là wp-example
Kết
- Mở terminal
- Thực hiện lệnh
docker-compose up -d
để Docker bắt đầu khởi tạo wordpress php-fpm + webserver nginx + mysql 8.0 - Thử truy cập
http://example.co:5000
sẽ thấy kết quả ?
Chúc bạn thành công, nếu có gì thắc mắc hoặc có không đúng hãy comment bên dưới cho mình biết thêm nhé ? Ngoài ra mình còn đề link >>> Github để bạn có thể clone về local tham khảo thêm
Cảm ơn bài viết của tác giả. Mình có thắc mắc, bạn có thể giải thích từng dòng lệnh mà bạn cấu hình trong file nginx.conf? Cảm ơn
Nó cấu hình các tùy chọn cho truy cập website tại địa chỉ IP của máy chủ hoặc tên miền “example.co” và “www.example.co”. Nó đặt thư mục gốc của website tại “/var/www/html” và sử dụng “index.php”, “index.html”, “index.htm” như trang chủ. Nó cấu hình một số header bảo mật và tùy chọn cho tập tin đặc biệt (ví dụ: favicon, robots.txt) và xử lý tập tin .php bằng FastCGI.