ในที่สุดก็เขียนได้สักที เย้!!! หลังจากเขียนอยู่ 3 วัน!!!
ใครที่ได้อ่านบล็อก วิธี nginx reverse proxy แบบหลายเว็บในเครื่องเดียว โดยใช้การกำหนด Virtual Host ได้ ก็จะเห็นว่า เคนยังทำการรัน docker run nginx-proxy ตามปกติ โดยแยกกันกับไฟล์ docker-compose.yml ของ wordpress เนื่องจากไม่มีวิธีทำ และไม่มีตัวอย่างให้ดู
และเคนก็ไม่รู้ต้องทำอย่างไร จนตอนนี้เคนสามารถประกอบมาจนทำให้ใช้งานได้แล้ว เยสสสสส โคตรดีใจ
คิดว่าน่าจะไม่ต้องอธิบายอะไรมากมาย เราไปดูไฟล์ docker-compose.yml ของ nginx-proxy + letsencrypt-nginx-proxy-companion แยกกันกับ docker-compose.yml ของไฟล์เว็บ WordPress ของเคนกันเลยดีกว่า
nginx-proxy/docker-compose.yml
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- nginx-proxy-volume:/etc/nginx/certs
- nginx-proxy-volume:/etc/nginx/vhost.d
- nginx-proxy-volume:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- nginx-proxy-network
nginx-proxy-letsencrypt:
depends_on:
- nginx-proxy
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
environment:
NGINX_PROXY_CONTAINER: nginx-proxy
volumes:
- nginx-proxy-volume:/etc/nginx/certs
- nginx-proxy-volume:/etc/nginx/vhost.d
- nginx-proxy-volume:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- nginx-proxy-network
volumes:
nginx-proxy-volume:
networks:
nginx-proxy-network:
driver: bridge
ตัวแปรพิเศษที่สามารถทำให้ตัว letsencrypt-nginx-proxy-companion มันเชื่อมกับ nginx-proxy ได้ คือ NGINX_PROXY_CONTAINER ครับ เคนหาตั้งนาน
คำสั่งปกติมันจะใช้ –volumes_from nginx-proxy เคนก็ไม่รู้จะให้มันเชื่อมกันยังไง พอได้ตัวนี้เข้าไป จบเลย ใช้งานได้เลยครับ
wp1/docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
restart: always
volumes:
- wordpress_docker_1_db_data:/var/lib/mysql
environment:
MYSQL_DATABASE: wordpress_docker_1
MYSQL_ROOT_PASSWORD: 1111
networks:
- wordpress_docker_1
docker-wp1:
depends_on:
- db
image: wordpress
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 1111
WORDPRESS_DB_NAME: wordpress_docker_1
VIRTUAL_HOST: docker-wp1.local # ชื่อเว็บที่เราจะใช้
VIRTUAL_PORT: 8080
LETSENCRYPT_HOST: docker-wp1.local # เหมือนชื่อเว็บที่เราจะใช้
LETSENCRYPT_EMAIL: [email protected]
volumes:
- /Applications/MAMP/htdocs/wordpress/docker/1/wp-content:/var/www/html/wp-content
- /Applications/MAMP/htdocs/wordpress/docker/1/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- nginx-proxy_nginx-proxy-network
- wordpress_docker_1
volumes:
wordpress_docker_1_db_data:
networks:
wordpress_docker_1:
nginx-proxy_nginx-proxy-network:
external: true
ส่วนสำคัญในไฟล์ wp1/docker-compose.yml ที่จะทำให้เชื่อมต่อกับ docker-compose ของ nginx-proxy ได้ก็คือที่เรากำหนด
<ชื่อโฟลเดอร์ที่ docker-compose อยู่>_<ชื่อ network ที่ใช้ในนั้น>
ในที่นี้เราสร้างไฟล์ docker-compose ที่ nginx-proxy/docker-compose.yml ดังนั้นระบบมันจะตั้งชื่อโฟลเดอร์ไว้ด้านหน้าชื่อ network ด้วย จึงได้ prefix ของ network เป็น nginx-proxy_
จากนั้นมันจะเอาชื่อ network ที่อยู่ในนั้นมาต่อท้าย สุดท้ายแล้วสำหรับ network ของ docker-compose ของ nginx-proxy/docker-compose.yml จึงได้ออกมาเป็น nginx-proxy_nginx-proxy-network
เราจึงต้องมาทำการกำหนดในไฟล์ wp1/docker-compose.yml ว่าเราจะเชื่อมไปที่ network ภายนอกชื่ออะไร จึงได้โค้ดมาเป็น
networks:
...
nginx-proxy_nginx-proxy-network:
external: true
เท่านี้มันก็จะเชื่อมกันได้แล้วครับ
รันได้เลย
ถึงเวลารันให้มันใช้งานจริงกันละครับ
เข้าไปแต่ละโฟลเดอร์ที่เราเก็บแล้วก็สั่ง docker-compose up -d ได้เลย ตัวอย่าง cd nginx-proxy docker-compose up -d cd ../wp1 docker-compose up -d
สุดท้ายไป Gen SSL ใน nginx-proxy
ตอนนี้จะเห็นว่าระบบพร้อมแล้ว สุดท้ายคือทำให้ VIRTUAL_HOST ของเราใช้งาน SSL (https) ได้
ซึ่งบอกก่อนว่าอันนี้จะเป็นในเครื่องเรานะ มันไม่มีการรองรับ ดังนั้นเวลาลองเข้าเว็บจริง ๆ มันจะมีการเตือน แต่อย่างไรก็ตามเคนเอาแค่มันเข้าได้ ไม่ Error ก็พอ เพราะถ้าเราไม่ gen ssl นี้เราจะไม่สามารถเข้าผ่าน https ได้เลย มันจะ Error 500
เข้าไปที่ container nginx-proxy เลยครับ ด้วยคำสั่ง
docker exec -it <container_name || container_id> <bash || sh> ตัวอย่างคือ jwiler/nginx-proxy ชื่อที่ได้มาคือ nginx-proxy_nginx-proxy_1 และไอดีคือ 749a63c3aeb1 เราจึงสามารถสั่งรันด้วย docker exec -it nginx-proxy_nginx-proxy_1 bash หรือ docker exec -it 749a63c3aeb1 bash เพื่อเข้าไปใน Container ได้
พอเข้ามาแล้วไปที่ไฟล์ที่เก็บ Certificates เลยคือ /etc/nginx/certs
cd /etc/nginx/certs
จากนั้นทำการสั่งสร้างใบ Cert ด้วย openssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout docker-wp1.local.key -out docker-wp1.local.crt
เสร็จแล้วก็ไปทำการรีสตาร์ท Container อีกรอบครับ
exit เพื่อออกมาจาก container cd nginx-proxy docker-compose restart
สุดท้ายจริง ๆ แล้ว ไปตั้งค่าไฟล์ hosts ในเครื่องเรา
ในเครื่อง macOS เคนมันอยู่ที่ /etc/hosts เคนไม่แน่ใจว่าใน windows มันอยู่ที่ไหนนะ ลองหากันดู
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 127.0.0.1 docker-wp1.local #ทำการเพิ่มโดเมนที่เราต้องการลงไป ซึ่งตรงกันกับ VIRTUAL_HOST
