เมื่อก่อน Config Virtual Private Server (VPS) และติดตั้ง SSL Certificate ไม่ใช่เรื่องง่าย ปัจจุบันการ Config VPS และติดตั้ง SSL Certificate (โดยเฉพาะ Let’s Encrypt Certificate) บน Docker Container นั้นทำได้ง่ายๆ โดย จะใช้ Feature Reverse proxy ของ Nginx เพื่อรับ Request จาก Client และ Forward ไปให้ Web Server Container ตามที่เรา Config ไว้
Reverse Proxy
ก่อนอื่นต้องทำความรู้จัก Forward Proxy ข้อดีของ Forward Proxy สามารถทำเป็น Cache Server ที่ช่วยลดเวลาในการเข้าถึง Content และยังเป็นการลด Internet Bandwidth
Reverse Proxy จะถูกใช้โดย Server ซึ่งเมื่อรับ Request จาก Client แล้วมันจะส่งต่อให้ Server ภายใน Internal Network
Nginx-Proxy
ด้วยความเร็วในการรองรับ Client Request จำนวนมากพร้อมกันของ Nginx จึงเหมาะหากนำมาทำ Reverse Proxy เพื่อความสะดวกในการ Config และประหยัด Memory ของ Server เราจะใช้ jwilder/nginx-proxy:alpine
ขั้นตอนการดำเนินการ Nginx proxy
$ mkdir nginx_proxy
$ cd nginx_proxy
$ nano docker-compose.yml
แก้ไขไฟล์ docker-compose.yml
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy:alpine
container_name: nginx-proxy
restart: always
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
default:
external:
name:
webproxy
จากโค๊ดด้านบน เป็นการติดตั้ง nginx-proxy เพื่อทำหน้าที่ revers proxy โดยกำหนดให้เชื่อมผ่าน external : network ที่ชื่อว่า webproxy กรณีไม่มี ให้ใช้คำสั่งด้านล่างในการสร้าง
$ docker network create webproxy
จากนั้นทำการ Run
$ docker-compose up -d
หมายเหตุ เมื่อสิ้นสุดขั้นตอนนี้ระบบยังไม่สามารถทำงานได้ ต้องทำในขั้นตอนต่อไป
ขั้นตอนการติดตั้ง LEMP Stack Container
ทำการติดตั้ง LEMP ให้ copy ไฟล์ ตามลิงค์นี้ www.zip ภายใน Folder -> www เพื่อทำการติดตั้ง PHP Nginx mariadb phpmyadmin memcached
โครงสร้างไฟล์ใน folder www
File : docker-compose.yml
version: '3'
services:
php:
container_name: lemp_php
build: php/
restart: unless-stopped
volumes:
- ./html/:/var/www/html
expose:
- "9000"
depends_on:
- db
nginx:
container_name: lemp_nginx
image: nginx:stable-alpine
restart: unless-stopped
networks:
- webproxy
- default
environment:
VIRTUAL_HOST: www.example.com
LETSENCRYPT_HOST: www.example.com
LETSENCRYPT_EMAIL : my@email.com
volumes:
- ./html/:/var/www/html
- ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
expose:
- "80"
db:
container_name: lemp_mariadb
image: mariadb:latest
restart: unless-stopped
volumes:
- ./mariadb/initdb/:/docker-entrypoint-initdb.d
- ./mariadb/data/:/var/lib/mysql/
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
pma:
container_name: lemp-phpmyadmin
image: phpmyadmin/phpmyadmin
restart: always
ports:
- "8000:80"
networks:
- webproxy
- default
memcached:
image: memcached:1.4.31-alpine
container_name: lemp_memcached
ports:
- "11211:11211"
networks:
default:
external:
name:
web_network
webproxy:
external:
name: webproxy
ในบันทัดตามด้านล่างนี้ให้ปรับค่าให้ถูกต้อง และให้ทำการลบ LETSENCRYPT ทั้ง 2 ออก
environment:
VIRTUAL_HOST: www.example.com
ให้ทำการ RUN คำสั่งดังนี้
ทำการ Build PHP ก่อนทำการติดตั้ง Container
$ docker-compose build
ติดตั้ง Container ที่ต้องการใช้
$ docker-compose up -d
ทำการทดสอบหน้าเว็บก็จะใช้งานได้ปกติ เสร็จสิ้นการทำ revers proxy เชื่อมกับ web server Nginx
ทำการติดตั้ง Let’s Encrypt
ขั้นตอนที่ผ่านมาเรียกว่าการทำ Web Server Container ต่อไปจะทำการ Let’s Encrypt ซึ่ง เป็นโครงการของ Internet Security Research Group (ISRG) ที่ทำให้เว็บสามารถออก SSL Certificate โดยที่ไม่มีค่าใช้จ่าย
สำหรับการจะต้องดำเนินการ Config nginx-proxy และ letsencrypt-nginx-proxy-companion ระบบจะทำให้มีการแชร์ Volume ร่วมกัน 4 Volume
/etc/nginx/vhost.d
/usr/share/nginx/html
/etc/nginx/certs
/etc/nginx/dhparam
ก่อนอื่นให้เข้าไปยัง folder -> nginx_proxy ที่ได้ดำเนินการในขั้นตอนที่หนึ่ง เพื่อทำการลบค่าที่ได้สร้างเอาไว้ทั้งหมด
$ docker-compose down --rmi all
จากนั้นทำการแก้ไขไฟล์ docker-compost.yml ใหม่ดังนี้
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy:alpine
container_name: nginx-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs:ro
- dhparam:/etc/nginx/dhparam
- /var/run/docker.sock:/tmp/docker.sock:ro
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nginx-proxy-lets
volumes_from:
- nginx-proxy
volumes:
- certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- nginx-proxy
volumes:
vhost:
html:
certs:
dhparam:
networks:
default:
external:
name:
webproxy
จากนั้นทำการ Run
$ docker-compose up -d
จากนั้นทำการ Stop การใช้งาน www เพื่อปรับค่าให้รองรับ การทำงานแบบ https
เข้าไปยัง folder ->www จากนั้นใช้คำสั่ง
$ docker-compose stop
จากนั้นปรับค่าdocker-compose ตามรูป
environment:
VIRTUAL_HOST : www.example.com
LETSENCRYPT_HOST : www.example.com
LETSENCRYPT_EMAIL : my@email.com
จากนั้นทำการ Run docker-compose.yml
$ docker-compose up -d
ทำการทดสอบก็จะพบว่าเว็บไซด์ก็สามารถใช้งานผ่านโปรโตคอล https ได้แล้ว
เว็บไซด์อ้างอิง
https://blog.pjjop.org/how-to-config-vps-and-letsencrypt-with-docker-container/