Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


도메인 경로를 각각의 도커에 할당하기 위한 최소 구성도

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramNamenginxproxy
simpleViewerfalse
width
diagramWidth1001
revision2


복수개의 도커에 다양한 도메인이 할당되어 도커에 접근이 되어야하기때문에 , 라우팅을 잘 관리하는 것은 중요한요소입니다.

접근과정 : 도메인 → 공유기 → 포트포워딩 → VMOS → PROXY → 도커 인스턴스

홈 네트워크라고, 하면 위와같은 순서로 도커가 제공하는 서비스에 접근을 할것이며, 

VMOS에 유입되는 Endpoint를 패턴별로 ,  Proxy(Nginx)를 통해 도커 인스터로 유도해야할것입니다.



도메인을 공유기에 연결

가정인터넷일 경우 유동IP일 경우가 대부분이며 IP가 변경되어도 도메인이 대상을 찾을수 있게 고정해주는 기능이

DDNS 기능입니다. 

Image Added

-IPTIME DDNS


Image Added

도메인을 생성해주는 도메인생성 대행 플랫폼(여기의 샘플은 가비아)을 통해 도메인 생성이 가능하며

도메인 생성후 CNAME규칙으로 서브도메인을 모두 동일한 DDNS의  도메인으로 연결합니다.



Image Added

외부 웹으로 연결되는 포트(80,443)를 내부IP로 모두 포트포워드를 합니다.

다음에 설명될 NGINX가 띄워질 포트입니다

Rancher 에서 복수개의 컨테이너 관리를 할수 있지만,  도메인 규칙에따라 컨테이너에 연결하는 기능은 포함되어 있지않다.

로드 밸런싱이 포함하여 이러한 기능은 하드웨어 혹은 소프트웨어 레벨에서 처리할수 있으며  (  하드웨어 레벨 L5 , 소프트웨어 레벨 L7 으로 구분되기도 한다.) 

L5에 대표적인 솔류션으로 BigIP가 있으며 L7에는 Nginx/Haproxy 등이 있다. AWS에서는 ELB 가 제공되기도 한다.

여기서는 온프레미스에서 소규모 네트워크이기때문에 Nginx 에 Admin기능을 입힌 Nginx Proxy Manager를 사용할것이다.

소규모 개발환경에서도 Proxy가 중요한 이유는 ,먼저 Proxy관리가 없는 환경을 생각해보자

  • 도메인 설정이 산발적으로 되어, 개발환경의 전체 레이아웃을 볼수가 없다. -Bad
  • 개발 도메인 신청에서 적용까지 , 정책과 신청과정으로 개발보다 더 많이 걸리는 경우도 허다하게 경험하였다 - Bad
  • 관리가 어렵다고 해서, 도메인 개발환경을 포기한 경우,  그냥 Ip:port기반으로 제공하고 Hostfile을 수정하여 Qa 환경을 셋팅하는것은 처음에는 유용한것같지만,가장 최악의 상황이된다. - Too Bad

3번째 상황이 왜 가장 최악의 상황이되냐하면, Hostfile은 로컬에서 지정하여 구동되는 환경이여서 관리및 통제가 안되며 크로스도메인 문제를 해결하기위해 운영과 다른 코드처리까지 필요한 상황이된다.


Nginx Proxy Manager

  • 인입되는 도메인의 패턴(PROXY감지)에 따라 특정 IP로(도커 컨테이너) 유도 


Code Block
themeEmacs
version: '2'
services:
  nginxapp:
    image: jlesagejc21/nginx-proxy-manager:2.9.11
    environment:
      DB_MYSQL_HOST: db
      DB_MYSQL_NAME: npm
      DB_MYSQL_PASSWORD: npm
      DB_MYSQL_PORT: '3306'
      restartDB_MYSQL_USER: alwaysnpm
    volumes:
    - /mnt/datac/docker/nginx/data:/data
    - /mnt/datac/docker/appdata/nginx-proxy-manager:/config:rw/nginx/letsencrypt:/etc/letsencrypt
    ports:
    - 9980:80/tcp
    - 9981:81/tcp
    - 9443:443/tcp
    labels:
      io.rancher.scheduler.affinity:host_label: server_name=main
    ports:
   io.rancher.container.hostname_override: container_name
  db:
    image: jc21/mariadb- 8080:8181/tcp
  aria:latest
    environment:
      MYSQL_DATABASE: npm
      MYSQL_PASSWORD: npm
      MYSQL_ROOT_PASSWORD: npm
      MYSQL_USER: npm
    volumes:
    - 8081:8080/tcp/mnt/datac/docker/nginx/mysql:/var/lib/mysql
    labels:
      io.rancher.scheduler.affinity:host_label: server_name=main
      io.rancher.container.hostname_override: container_name


초기 계정

더자세한 기능 참고 : https://github.com/jlesage/docker-nginx-proxy-manager


위 도커 슼크립트를 추가하게 스크립트를 실행 하게 되면, Rancher에서 server가 main 인 인스턴스 한곳에 server의 main영역에 1 인스턴스로 proxy 서버가 구동되게 된다.

참고로 label에따라 2중화를 포함하여 무중단 배포도 가능하다. 명령예> apitype이 api인곳에 2 인스턴스를 뛰워라 

이제 서브도메인 규칙에따라 다양한 서비스의 도커에 연결이 가능합니다.



웹노리 도메인화면 샘플

Image Added


  •  서브도메인 규칙에의해 다양한 도커로 작성된 서비스로 연결이 가능합니다.


Image Added

자동갱신되는 무료 SSL(Let's Encrypt) 도 지원하기때문에 서비스를 띄울때  각 웹서비스마다 SSL을 탑재하여 띄울필요없이 Nginx에서 SSL을 자동관리합니다.