阿公絕對不會!在Windows上建立Docker環境跑WordPress網站
利用Docker快速包裝好程式的開發環境,換電腦時不用再做煩人的前置設定
使用 Windows 的 Hyper-V 服務(記得從BIOS開啟)來建立 Linux 虛擬機跑 Docker
下載安裝檔
https://desktop.docker.com/win/stable/amd64/Docker%20Desktop%20Installer.exe
安裝好後,重新開機。
下載安裝 Linux 核心更新套件
執行命令將 WSL 2 設定為預設版本
wsl --set-default-version 2
下載安裝Ubuntu 20.04 LTS
啟動Docker Desktop
WSL 整合設定Ubuntu 20.04
確認 Docker 是否安裝成功,執行命令
docker --version
查詢目前存在那些 image
docker image list
WordPress架站示範(方式1)
docker pull wordpress
docker pull mysql:latest 參考
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
我下的指令是:docker run --name test123 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
docker run --name some-wordpress --link some-mysql:mysql -p 8080:80 -d wordpress
我下的指令是:docker run --name test --link test123:mysql -p 8080:80 -d wordpress
瀏覽器輸入 localhost:8080
WordPress架站示範(方式2)
安裝WSL
進入終端機
wsl
cd ~
mkdir wordpress
開啟資料夾,在位址列輸入\\wsl$......
可以看到我們建立的wordpress資料夾
進入終端機
cd wordpress
code .
會自動開啟vscode
進入終端機
mkdir ~/wordpress/nginx-conf
開啟vscode
server {
listen 80;
listen [::]:80;
server_name _;
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
index index.php index.html index.htm;
root /var/www/html/wordpress;
include conf.d/security.conf;
client_max_body_size 512M;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_read_timeout 600;
}
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;
}
}
server {
listen 8080 ssl http2;
listen [::]:8080 ssl http2;
server_name _;
index index.php index.html index.htm;
root /var/www/html/phpmyadmin;
include conf.d/security.conf;
client_max_body_size 512M;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpmyadmin:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_read_timeout 600;
}
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;
}
}
server_tokens off;
ssl_certificate /etc/nginx/certs/self-signed.crt;
ssl_certificate_key /etc/nginx/certs/private/self-signed.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
進入終端機
mkdir -p ~/wordpress/.docker/nginx
開啟vscode
FROM nginx:stable-alpine
RUN apk --update --no-cache add openssl
RUN mkdir -p /etc/nginx/certs/ /etc/nginx/certs/private/
RUN openssl req -x509 -nodes -days 365 -subj "/C=CA/ST=QC/O=Tplus, Inc./CN=localhost" \
-addext "subjectAltName=DNS:localhost" -newkey rsa:2048 \
-keyout /etc/nginx/certs/private/self-signed.key \
-out /etc/nginx/certs/self-signed.crt;
進入終端機
mkdir -p ~/wordpress/.docker/wordpress
FROM wordpress:5-fpm-alpine
RUN apk --no-cache add shadow && usermod -u 1000 www-data
file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
version: '3'
services:
db:
image: mysql:8.0
container_name: wp_db
restart: unless-stopped
env_file: .env
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
volumes:
- database:/var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
networks:
- app-network
wordpress:
build:
context: ./.docker/wordpress
dockerfile: Dockerfile
depends_on:
- db
image: wordpress/myproj
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: wordpress
WORDPRESS_TABLE_PREFIX: my_wp_
WORDPRESS_CONFIG_EXTRA: |
define( 'FS_METHOD', 'direct' );
volumes:
- ./wordpress:/var/www/html
- ./.docker/wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- app-network
webserver:
build:
context: ./.docker/nginx
dockerfile: Dockerfile
depends_on:
- wordpress
- phpmyadmin
image: nginx/ssl
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "${WP_PORT:-443}:443"
- "${MYADMIN_PORT:-8080}:8080"
volumes:
- ./wordpress:/var/www/html/wordpress
- phpmyadmin:/var/www/html/phpmyadmin
- ./nginx-conf:/etc/nginx/conf.d
networks:
app-network:
aliases:
- localhost
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin:fpm-alpine
container_name: phpmyadmin
restart: always
env_file: .env
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- phpmyadmin:/var/www/html
networks:
- app-network
volumes:
phpmyadmin:
driver: local
database:
driver: local
networks:
app-network:
driver: bridge
進入終端機
docker-compose up -d
瀏覽器輸入 localhost
https://localhost:8080/
發表評論
想要留言嗎?歡迎歡迎!