Nginx Reverse Proxy Example with Node.js Express
- https://github.com/jmyoon4488/docker-nginx-reverse-proxy
- docker-compose 사용
- nginx-proxy 컨테이너 실행
- Dockerfile 로 Node.js 이미지 파일 빌드
- 빌드한 이미지로 Node.js 웹서버 실행
- 잘 적용되었는지 확인!
nginx-proxy container 실행해줍니다.
- /your/path/nginx-proxy - 해당 부분은 자신의 서버에 맞는 경로로 바꿔주세요.
- proxy/nginx-proxy-letsencrypt.yml
version: '3' services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 restart: always volumes: - /your/path/nginx-proxy/log:/var/log/nginx - /your/path/nginx-proxy/html:/usr/share/nginx/html - /your/path/nginx-proxy/certs:/etc/nginx/certs - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/config:/etc/nginx/conf.d - /var/run/docker.sock:/tmp/docker.sock:ro labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy etsencrypt-nginx-proxy: container_name: leten-nginx-proxy image: jrcs/letsencrypt-nginx-proxy-companion restart: always depends_on: - nginx-proxy volumes: - /your/path/nginx-proxy/certs:/etc/nginx/certs - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro networks: default: external: name: nginx-proxy
$ docker-compose -f nginx-proxy-letsencrypt.yml up -d
- $ docker ps 명령어로 컨테이너가 정상적으로 실행되고 있는지 확인.
Dockerfile 로 Node.js 이미지 빌드
- node/Dockerfile
FROM node:carbon ENV SRCDIR /src RUN mkdir -p $SRCDIR/app && chown -R node:node $SRCDIR WORKDIR $SRCDIR COPY ./package.json $SRCDIR RUN npm install COPY . $SRCDIR EXPOSE 3000 WORKDIR $SRCDIR/app CMD ["node", "app.js"]
- package.json
{ "name": "node", "version": "0.0.0", "private": true, "scripts": { "start": "node ./app/app.js" }, "dependencies": { "debug": "~2.6.9", "ejs": "~2.5.7", "express": "~4.16.0", "request": "^2.88.0", "uuid": "^2.0.2" } }
- build image
$ docker build --tag nodejs:test .
- $ docker images 로 이미지 확인
REPOSITORY TAG IMAGE ID CREATED SIZE nodejs test 000000000000 24 minutes ago 902 MB
빌드한 이미지로 Node.js 컨테이너 실행
- 4개 항목은 꼭 자신에게 맞는 값으로 변경 - VIRTUAL_HOST, VIRTUAL_PORT, LETSENCRYPT_HOST, LETSCRYPT_EMAIL
- 포트를 변경하려면 Dockerfile 에서 EXPOSE 포트를 변경하고 다시 빌드해 줍니다.
- node/node-test.yml
version: '3' services: nodejs-test: container_name: node-test image: nodejs:test volumes: - ./app:/src/app environment: - VIRTUAL_HOST=sub.domain.com - VIRTUAL_PORT=3000 - LETSENCRYPT_HOST=sub.domain.com - LETSCRYPT_EMAIL=your@email.com networks: default: external: name: nginx-proxy
- 컨테이너 확인
$ docker ps
프록시 및 letsencrypt 적용 확인
- 브라우저를 통해 설정에 적용한 서브도메인으로 접속해봅니다.
- nginx 설정파일을 확인해 봅니다.
$ docker exec nginx-proxy cat /etc/nginx/conf.d/default.conf
or
$ sudo cat ./config/default.conf
- default.conf
~~~~~~~ # sub.domain.com upstream sub.domain.com { ## Can be connected with "nginx-proxy" network # node-test server 172.5.0.1:3000; } server { server_name sub.domain.com; listen 80 ; access_log /var/log/nginx/access.log vhost; return 301 https://$host$request_uri; } server { server_name sub.domain.com; listen 443 ssl http2 ; access_log /var/log/nginx/access.log vhost; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers 'CODE~~~~~~~~~~~~~'; ssl_prefer_server_ciphers on; ~~~ many options include /etc/nginx/vhost.d/default; location / { proxy_pass http://sub.domain.com; } }
만약 다른 웹서버 컨테이너를 추가하고 싶다면...
- 추가할 웹서버는 도커를 이용해 실행해야 합니다.
- 컨테이너는 반드시 프록시 컨테이너와 같은 도커 네트워크 상에 위치해야 합니다. (nginx-proxy)
- 위에서 지정한 4가지 옵션을 꼭 입력해 주세요.
'Programming > Docker' 카테고리의 다른 글
[Docker] Nginx 를 사용한 SubDomain(서브도메인) 분기 (0) | 2019.02.19 |
---|---|
[Docker] 사용법 정리 (0) | 2018.10.25 |
[Docker] CnetOS 7 에서 도커 설치 시 사용하는 스크립트 (0) | 2018.09.19 |
[Network] 컨테이너간 네트워크 (포트 관련) (0) | 2018.07.09 |
[Docker] (2018.06.21) mysql + redmine 설치 후 실행 시 오류 (0) | 2018.06.21 |