docker-compose nginx-proxy, letsencrypt-nginx-proxy-companion แยกกันกับไฟล์เว็บ


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

Leave a Reply

Please Login to comment
avatar
  Subscribe  
Notify of
Navigate