본문 바로가기
넓고 얕은 웹 지식

로컬에서 도커로 nginx 설치 & 스프링 부트의 프록시 서버 테스트 해보기

by 팡펑퐁 2023. 11. 14.
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