วิธีติดตั้ง VPS และ Let’s Encrypt ด้วย Docker Container

เมื่อก่อน 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/

Share
User Avatar

admin

ประวัติการศึกษา ระดับปริญญาตรี : วิศวกรรมโทรคมนาคม คณะวิศวกรรมศาสตร์ พระจอมเกล้าเจ้าคุณทหารลาดกระบัง ระดับปริญญาโท : วิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยสงขลานครินท์ หาดใหญ่

You may also like...

Leave a Reply