일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- snmp test
- influxdb 설치
- c3 second
- c3 축 없애기
- g++ 업데이트
- InfluxDB
- python popen
- telegraf
- 1697
- 정규식 컴파일
- subporcess path
- grafana dashboard
- linux시간으로 변경
- 정규식 활용
- c3 step graph
- gcc 업데이트
- CentOS7
- snmp
- centos pyhon 설치
- python os
- 정규식 문자열 출력
- c3 축 가리기
- c3 초
- regex_search
- semanage
- 백준
- gcc regex
- python subprocess
- c++ 정규식
- selinux port 등록
- Today
- Total
리셋 되지 말자
[NodeJS] nodejs nginx 연동 본문
테스트하는 이유
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번 포트로 접근이 가능하다.
$ 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/ussers
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 |