리셋 되지 말자

[NodeJS] nodejs nginx 연동 본문

Docker

[NodeJS] nodejs nginx 연동

kyeongjun-dev 2021. 3. 31. 16:17

테스트하는 이유

nginx를 프록시 서버로 쓴 적은 많지만 전부 다 docker-compose 안에서 사용했다. 갑자기 그냥 뜬금없이 docker-compose 없이는 어떻게 사용하나 싶어서 해봤다.

 

결론

그냥 docker-compose에서 쓰는게 맞다. 설정하기가 어려워진다. 정확히는 프록시 타겟으로할 서버의 ip주소를 일일히 직접 알아내서 nginx의 conf파일에 정해줘야 한다. 하지만 이또한 경험이니라...

 

구성

nodejs 컨테이너 한개와 nginx 컨테이너 한개로 구성된다.

 

이미지

1. node 이미지

hub.docker.com/r/rudwns273/node

위의 이미지를 사용한다. 어떤 이미지인가 하면, node 12버젼에 express, express-generator를 설치하고 express-generator가 생성해주는 디렉토리 및 파일들을 생성한 뒤 도커로 패키징한 이미지다.

- 패키징에 사용한 Dockerfile

$ cat Dockerfile
FROM node:12

WORKDIR /app
COPY app.js app.js
COPY bin bin
COPY package.json package.json
COPY package-lock.json package-lock.json
COPY public public
COPY routes routes
COPY views views

RUN npm install

CMD ["npm", "run", "start"]

 

2. nginx 이미지

nginx:latest 이미지를 사용했다.

 

컨테이너 실행

1. node 컨테이너 실행

# node 이미지 받기
docker pull rudwns273/node:latest

# 받은 이미지로 컨테이너 실행
docker run -d --expose 3000 --name node rudwns273/node:latest

node 컨테이너를 실행할 때, --expose 옵션을 사용했는데 이렇게 설정하면 host에서 node 컨테이너의 3000번 포트로 접속할 수 없다. 대신 다른 컨테이너에서는 3000번 포트로 접근이 가능하다.

3000번 포트 접속 불가

 

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                            NAMES
bca35ddb6a4c   rudwns273/node:latest   "docker-entrypoint.s…"   24 minutes ago   Up 24 minutes   3000/tcp                         node

현재 위처럼 node 라는 이름으로 컨테이너가 실행주이다. 그러면 이 컨테이너의 ip주소를 확인한다.

 

$ docker container inspect node | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

inspect 커맨드로 컨테이너의 IP주소를 얻을 수 있다. 더 엣지한 방식으로 깔끔하게 알아내는 방법은 

 

$ docker inspect -f "{{ .NetworkSettings.IPAddress }}" CONTAINER_ID

출처: https://bluese05.tistory.com/36 [ㅍㅍㅋㄷ]

ㅍㅍㅋㄷ님 감사합니다

 

2. nginx 컨테이너 실행

$ docker run -d -p 80:80 --name nginx nginx:latest

 

3. nginx 접속 및 conf 파일 생성

- nginx 컨테이너 접속

$ docker exec -it nginx bash

 

- 디렉토리 이동

# cd /etc/nginx/conf.d/

 

- node.conf 파일 생성 및 작성

server {
        listen 80;
        listen [::]:80;

        server_name node;

        location / {
                proxy_pass http://172.17.0.2:3000/;
        }
}

이거를 작성하려면 vim 같은 편집기가 있어야 하는데, 사용이 불가하니 echo 명령어를 이용한다. 

# echo "server {
        listen 80;
        listen [::]:80;
        server_name node;
        location / {
                proxy_pass http://172.17.0.2:3000/;
        }
}" > node.conf

만약 1번에서 확인한 node 컨테이너의 ip주소가 다르다면, ip주소를 따로 적어줘야 한다.

 

4. default.conf 삭제

# rm default.conf

 

5. nginx 재시작

# /etc/init.d/nginx reload
[ ok ] Reloading nginx: nginx.

 

 

접속 테스트

- localhost

localhost 접속

 

- localhost/ussers

localhost/users 접속

node 컨테이너는 expose를 통해 3000번 포트만 컨테이너들 끼리 공유하게 했음에도, 외부(localhost)에서 node 컨테이너에 접속할 수 있는걸 확인할 수 있다.
이러한 프록시 역할을 Nginx가 수행한다. 끝!!

'Docker' 카테고리의 다른 글

DinD vs DooD  (0) 2021.05.08
[buildkit] cache 기록  (0) 2021.04.14
[docker] local registry 만들기  (0) 2021.03.25
[docker-compose] tty: true 옵션  (0) 2021.03.25
[docker] 사용 현황 확인하기  (0) 2021.03.24
Comments