728x90
📌 도커로 nginx 설치하기
wonyonghwang@Wonyongs-MacBook-Pro ~ % docker run -d --name nginx -p 8081:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
578acb154839: Pull complete
e398db710407: Pull complete
85c41ebe6d66: Pull complete
7170a263b582: Pull complete
8f28d06e2e2e: Pull complete
6f837de2f887: Pull complete
c1dfc7e1671e: Pull complete
Digest: sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
Status: Downloaded newer image for nginx:latest
d7b9c696f7a37885287d9d7555fe54af5c0a827b48adf26b443e417a81a43cb0
- 도커 run 명령어를 통해 nginx 이미지를 도커 허브에서 가져와 컨테이너를 실행했다.
- 도커는 기본적으로 로컬에 이미지가 없으면 도커 허브를 뒤진다.
- -d는 백그라운드 실행을 의미한다.
- --name은 실행할 컨테이너의 이름이다.
- -p 8081:80에서 8081은 로컬 PC에서 접근할 포트이며, 80은 8081과 매핑되어 도커 컨테이너로 접속할 포트이다.
- 즉, 로컬에서 8081 포트를 사용하면 도커 컨테이너의 80 포트로 연결되어 컨테이너 내부의 nginx에 도달할 수 있다.
- 로컬 PC에서 포트번호를 8081로 설정한 이유는 보통 스프링부트의 Tomcat 서버가 8080으로 실행되기 때문에 로컬에서 스프링부트 서버 돌리다가 충돌 나는 것을 막기 위한 것이다.
- docker ps 명령어를 실행하면 nginx 컨테이너가 정상적으로 실행되고 있음을 확인할 수 있다.
- 로컬 PC에서 8081로 접속하였고, 포트 매핑을 통해 도커 컨테이너까지 연결되어 nginx 기본 화면을 볼 수 있었다.
⚒️ nginx config
- 로컬 PC와 nginx 컨테이너와의 연결을 확인했으니 이제 nginx config를 구성해 보자.
- config 구성을 위해서는 nginx 컨테이너 내부로 접속해야 한다.
- 이 부분이 이해가 가지 않는다면 도커 컨테이너 개념을 다시 공부해야 한다.
🤔 nginx config 찾기
- 구글링을 통해 나오는 nginx 컨테이너 내 config 파일의 경로는 제각각이었다.
- 아마 버전에 따라 위치가 변경되는 것으로 보인다.
- 하지만 비슷한 경로에 있으니 직접 찾아보자.
🚪 nginx 컨테이너 접속
wonyonghwang@Wonyongs-MacBook-Pro ~ % docker exec -it nginx /bin/bash
root@d7b9c696f7a3:/#
- docker exec 명령어로 컨테이너 내부 접속이 가능하다.
- i (interactive): 이 옵션은 컨테이너와 상호작용할 때 표준 입력(stdin)을 유지하기 위해 사용된다. 즉, 컨테이너 내부에서 사용자의 입력을 받을 수 있게 한다.
- t (tty): 이 옵션은 컨테이너 내부와 터미널 간에 가상의 tty(터미널 장치)를 할당한다. 이를 통해 컨테이너 내부에서 명령어를 실행하거나 출력을 확인하는 등의 터미널 기반 작업을 수행할 수 있다.
- /bin/bash는 컨테이너 내부에서 실행할 프로그램으로서 bash 셸을 실행하도록 지정한 것이다.
- bash는 대표적인 유닉스 셸이며, 대부분의 리눅스 시스템에서 기본 셸로 사용된다.
root@d7b9c696f7a3:/# ls
bin dev docker-entrypoint.sh home lib32 libx32 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib lib64 media opt root sbin sys usr
- ls 명령어를 입력하면 루트 디렉터리 내부의 폴더와 파일이 보인다.
- etc로 들어가 보자.
root@d7b9c696f7a3:/etc# ls
adduser.conf cron.daily fonts host.conf ld.so.conf mtab passwd- rc5.d shadow- timezone
alternatives debconf.conf fstab hostname ld.so.conf.d nginx profile rc6.d shells update-motd.d
apt debian_version gai.conf hosts libaudit.conf nsswitch.conf profile.d rcS.d skel vim
bash.bashrc default group init.d localtime opt rc0.d resolv.conf ssl xattr.conf
bindresvport.blacklist deluser.conf group- issue login.defs os-release rc1.d rmt subgid
ca-certificates dpkg gshadow issue.net logrotate.d pam.conf rc2.d security subuid
ca-certificates.conf e2scrub.conf gshadow- kernel mke2fs.conf pam.d rc3.d selinux systemd
cron.d environment gss ld.so.cache motd passwd rc4.d shadow terminfo
root@d7b9c696f7a3:/etc#
- 여러 폴더 및 파일이 보이는데 OS 기본 구성과 nginx를 동작시키는데 필요한 파일이 있는 듯하다.
- 여기서 nginx 폴더에 들어간다.
root@d7b9c696f7a3:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@d7b9c696f7a3:/etc/nginx#
- 여기서 다시 목록을 확인하면 nginx.conf를 확인할 수 있다.
- 이런 식으로 찾아보자!
⚒️ config 파일을 편집하기 위한 준비
root@d7b9c696f7a3:/etc/nginx# apt-get update
Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8780 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [6668 B]
Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [101 kB]
Fetched 9139 kB in 1s (7295 kB/s)
Reading package lists... Done
root@d7b9c696f7a3:/etc/nginx# apt-get install vim
...
root@d7b9c696f7a3:/etc/nginx# vim nginx.conf
- config 파일 편집을 위해서는 vi와 같은 명령어를 사용해야 하는데 기본적으로 도커 컨테이너에서 안 먹는 경우가 많다.
- 그 이유는 당연하게도 깔려 있지 않아서이다.
- config 파일을 편집하기 위해 다운로드하여 주자.
- apt-get update와 apt-get install vim을 통해 다운로드할 수 있다.
- 다운이 끝나고 vim nginx.conf를 입력하면 텍스트 편집창으로 들어갈 수 있다.
- i를 누르면 편집이 가능하고 편집이 끝나면 esc를 누른 뒤 ':wq'를 입력하고 엔터를 치면 저장이 된다.
- 저장하지 않고 그냥 나가고 싶다면 ':q'를 누르면 그대로 저장되지 않고 나가진다.
🧑🏻🔬 테스트용 스프링부트 서버
- 테스트용 스프링부트 서버이다.
- 포트는 Tomcat 기본 포트인 8080이고, 로컬 환경에서 서버를 실행했다.
- localhost:8080으로 접속하면 위와 같이 텍스트 한 줄이 나온다.
📖 nginx 컨테이너를 스프링 부트 서버의 프록시 서버로 만들기
시나리오
- 클라이언트에서 위 스프링부트 서버에 접속을 시도하기 위해 localhost:8081로 들어온다.
- nginx 컨테이너가 컨테이너 내부포트인 80 포트로 매핑하여 nginx 컨테이너 내부로 들어온다.
- nginx에서 proxy_pass를 http://host.docker.internal:8080으로 설정하였으므로 다시 로컬 서버의 localshot:8080으로 연결된다.
- 결과적으로 Local Server -> NGINX Container -> Local Spring Boot Server로 연결되는 구조를 테스트해 볼 수 있다.
nginx.conf 수정
- vim nginx.conf 명령어로 conf 파일을 수정한다.
- http {} 부분만 새로 수정해 줬다.
- 기존에 있는 내용은 잘 모르는 내용이고, 그대로 두니 proxy_pass가 먹히지 않아 싹 지우고 만들었다.
- 80번 포트를 liseten 하고 있고, proxy_pass에 host.docker.internal을 넣어주면 컨테이너에서 로컬 PC를 가리키게 된다.
- 포트는 스프링 부트 톰캣 서버의 포트인 8080이다.
변경사항 적용
wonyonghwang@Wonyongs-MacBook-Pro ~ % docker restart nginx
nginx
- docker restart로 변경 사항이 반영될 수 있도록 nginx를 재실행해준다.
- 여기서 한 가지 유념해야 할 것은 지정해 준 conf 설정 파일 등이 컨테이너가 날아가면 전부 삭제되기 때문에 도커 볼륨이나 바인드 마운트 등을 사용하여 완전 삭제를 막는 것이 좋을 듯하다.
📜 결과
- 정상적으로 연결됨을 확인할 수 있었다.
참고
뤼튼
https://marklee1117.tistory.com/93
https://velog.io/@jjonggang//Spring-Boot-Nginx를-이용하여-Spring-Boot를-80번-포트로-프록시하기
728x90
'넓고 얕은 웹 지식' 카테고리의 다른 글
직접 만들어 보면서 이해하는 웹소켓 (2) - 크롬 확장프로그램을 이용하여 실시간 채팅방 구현하기 (0) | 2024.05.12 |
---|---|
직접 만들어 보면서 이해하는 웹소켓 (1) - 왜 웹소켓(WebSocket)인가? (0) | 2024.05.10 |
HTTPS 통신 흐름을 이해하고 NginX에 SSL/TLS를 적용해보자 (1) | 2023.05.17 |
Apache와 NginX 비교 및 차이점 (0) | 2023.05.15 |
Apache Tomcat에 대해 쉽고 빠르게 정리하기(with. httpd) (0) | 2023.05.15 |