• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글

Docker-Compose 사용 시 NPM으로 리버스 프록시하는 방법

ExpBox ExpBox 1348

4

7

안녕하세요 Expbox입니다.

 

https://svrforum.com/nas/165285

vaultwarden에 ssl를 적용해 보려고 하는데, 쉽지 않네요.  도커에서는 각각의 ip가 공유 안된다고 해서 동일 네트워크 맞쳐서 도커를 생성했는데요.  npm 설정을 ...
아나키 | 2022.02.18

NPM에 대해서 가이드가 있나 확인하던 도중 두달 정도 된 글인데 성공하신 후기가 없는 것 같아서 자기 전 간단하게 가이드 적습니다. 정말 간단하지만 보안도 어느정도 챙기는 효과까지 볼 수 있습니다.

 

먼저 NPM에서 리버스 프록시를 위해서는 같은 네트워크 상에 있어야합니다. 즉 nginx-proxy-manager 컨테이너와 같은 네트워크에 존재해야한다는 것입니다. 따라서 아나키 님께서는 따로 docker network create 명령어를 사용해 생성하신 것은 좋습니다. 그러나 db 컨테이너에는 네트워크를 적용했지만 npm 컨테이너에는 네트워크를 적용하지 않아서 생긴 문제라고 볼 수 있습니다.

또한 아나키 님께서는 따로 명령어로 생성하셨지만 저는 docker-compose에서 자동으로 생성되도록 했습니다.

 

Network bridge 생성

 

networks:
  expbox:
    driver: bridge

 

네트워크 브릿지를 docker-compose를 통해 자동으로 생성하기 위해서는 docker-compose.yml 파일의 하단 부분에 입력하면 됩니다. expbox는 다른 원하시는 network 이름으로 하시면 됩니다.

 

컨테이너에 Network 적용

 

이것도 너무나 쉽습니다. 도커 컨테이너를 웹으로 관리할 수 있도록 해주는 Portainer-CE로 예를 들어 설명드리겠습니다.

 

 

portainer-ce:
    image: 'portainer/portainer-ce:2.9.3'
    container_name: portainer-ce
    restart: always
    expose:
      - 9443

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer-ce/data:/data
    networks:
     - expbox

 

(글 쓰는 도중에는 괜찮은데 글 등록하니 expose와 network 사이에 띄워쓰기가 있는 것처럼 되는군요. 서버포럼 사이트 자체의 버그인 것 같습니다.)

 

이렇게 입력하시면 됩니다! 즉, 생성하려는 컨테이너에 빨간색 글씨처럼 networks:로 expbox 네트워크에 넣겠다고 선언하기만 하면 됩니다. npm에도 똑같이 넣어야 합니다. 그렇게 되면 npm과 portainer는 같은 네트워크에 존재하기 때문에 서로 통신이 가능하게 됩니다.

 

그런데 자주 쓰던 ports:가 없고 파란색 글자의 expose:로 -9443 포트를 선언했죠? 이것은 도커 컨테이너끼리 외부로 포트를 열지 않고 내부적으로만 포트를 열게하는 설정입니다. 즉, 아무리 외부에서 mydomain.com:9443으로 접속하더라도 내부적으로만 통신하기 때문에 외부로는 통신이 불가능하게 되어 보안을 한단계 높일 수 있습니다.

 

NPM에서 Reverse Proxy 설정하기

 

도커 설정만하면 끝일줄 알았지만 NPM에서의 설정 방법이 살짝 다릅니다. 일반적으로 포트만 열려있다면 호스트를 127.0.0.1로 지정하고 포트를 넣어주면 되겠지만 아닙니다. 127.0.0.1을 사용하게 되면 502 Bad Gateway가 뜨게 됩니다. 이 이유는 127.0.0.1은 엄밀하게 따지면 npm을 가리키는것이라 npm이 아닌 다른 컨테이너를 가리키기 위해서는 hostname에 컨테이너의 서비스명을 입력해야합니다.

 

image.png.jpg

이렇게 127.0.0.1이 아닌 서비스명을 호스트로 지정해줘야 합니다. expose로 9443 포트를 열어줬으니 9443 포트를 지정하고 SSL 인증서를 추가하면 끝입니다.

 


 

생각보다 간단하죠? 위에서 expose를 사용하지 않고 ports를 사용하면서 방화벽으로 그 포트를 막아버려도 괜찮습니다. 하지만 NPM을 사용해서 리버스 프록시를 사용할텐데 굳이 ports를 사용하면서 docker-compose.yml의 용량을 늘릴 필요가 있을까 싶습니다.

 

하지만 NPM은 expose를 사용하면 안됩니다! 외부에서 접속해야하는데 막혀서 사용이 불가능해지니 꼭 확인해주세요.

신고공유스크랩
7
profile image 1등
달소 2022.04.12. 09:49

와우 좋은 정보글 감사합니다.

이해가 쏙쏙되네요 보안적으로는 이거보다 안전한 방법은 없다고 보시면됩니다!!

 

중간에 버그관련해서는 어떤건지 한번 보고있는데.. 왜저렇게되는지 모르겠네요 ㅠㅠ

2등
뻘짓의초심자 2022.04.12. 10:15

저도 원래 이 방법(새로운 도커마다 특정 네트워크로 묶는 방법)을 사용했으나 어느 순간부터 네트워크로 묶는 작업을 생략하고 내부 ip를 입력해도 리버스프록시가 적용되더군요.

문제는 제가 뭔짓을 했는지 기억이 안납니다...

호스트의 내부ip와 포트로 연결되는 걸 보니 저도 모르게 뭔가 연결된거 같은데 도무지 모르겠네요...

profile image
달소 2022.04.12. 10:28
뻘짓의초심자

아마 도커에서 별도로 네트워크를 지정해주지않으면 자동으로 도커내부의 사설ip가 할당되는데 그 네트워크 대역대로 컨테이너가 계속 생겨서 그럴겁니다 ㅎㅎ

컨테이너별로도 영역을 구분하고싶다면 별도의 네트워크를 본문처럼만들면 되구요

뻘짓의초심자 2022.04.12. 10:52
달소

지금 다시 테스트 해보니 127.0.0.1은 안되는데 호스트의 내부ip(10.0.0.100 등등)은 작동하는 것 같습니다.

https://m.clien.net/service/board/cm_nas/16472754

여기서도 127.0.0.1을 언급하는 걸 보면 npm에서 127.0.0.1을 쓰면 호스트가 아니라 npm 컨테이너를 가리키나 보군요.

profile image
달소 2022.04.12. 10:59
뻘짓의초심자

네 ㅎㅎ 127.0.0.1이 로컬호스트이니 npm 자체 로컬을 바라보는게 맞는듯합니다

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story

등록된 글이 없습니다.