ในที่สุดก็เขียนได้สักที เย้!!! หลังจากเขียนอยู่ 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