nginx 설치 경로에 대한 의문점
Nginx를 설정하려고 인터넷을 찾아보다 보면 묘하게 헷갈리는 지점이 하나 있다. 어떤 글에서는 Nginx를 리눅스 호스트에 직접 설치해서 Docker 컨테이너들 앞단에 두고 있고, 또 어떤 글에서는 Nginx 자체를 Docker 컨테이너로 실행하고 있다. 둘 다 꽤 흔하게 보이는 방식이라, 처음 접하면 "도대체 어느 쪽이 정답이지?"라는 생각이 들 수밖에 없다. 더 헷갈리는 건 두 방식 모두 실제로 잘 동작한다는 점이다. 호스트에 설치한 Nginx도 안정적이고, Docker로 올린 Nginx 역시 문제없이 리버스 프록시 역할을 해낸다. 그러다 보니 단순히 따라 하기만 하면 구조는 만들어지지만, 왜 이런 선택이 나뉘는지에 대해서는 명확하게 이해하지 못한 채 넘어가게 된다. 그래서 "무조건 이게 더 낫다"는 결론을 내리기보다는, 호스트에 Nginx를 설치하는 방식과 Docker 위에 Nginx를 올리는 방식이 구조적으로 어떻게 다른지, 나중에 다시 봐도 한 번에 떠올릴 수 있도록 정리를 한번 하려고 한다.
Host에 설치하는 nginx
[ Client ]
[ Host OS Nginx (80) ]
[ Docker Container : API (8080) ]
- Nginx는 호스트 OS의 프로세스
- systemctl start nginx 로 관리
- 컨테이너는 단순히 뒤에서 요청을 받음
실제로 나는 우분투 리눅스를 설치한 컴퓨터에, 앞에서 설명한 방식대로 Nginx를 호스트에 직접 설치해 사용하고 있었다. 처음에는 생각했던 대로 구조가 단순했고, 설정도 비교적 수월했다. 리눅스에 Nginx를 설치하고 포트만 맞춰주면 바로 컨테이너로 트래픽을 넘길 수 있었기 때문이다. 하지만 사용하다 보니 작은 불편함들이 하나둘 보이기 시작했다. 돌아가는 컨테이너의 개수가 점점 늘어나고, Docker를 본격적으로 사용하게 되면서 자연스럽게 이런 생각이 들었다. 이미 Docker 내부에는 컨테이너 간 통신을 위한 네트워크가 잘 갖춰져 있는데, 굳이 Nginx만 호스트에 남겨둔 채 따로 관리할 필요가 있을까? Docker를 사용한다는 건, 애플리케이션과 그 실행 환경을 함께 묶어서 관리하겠다는 의미인데, Nginx만 예외처럼 호스트에 설치되어 있다는 점이 뭔가 애매한 느낌을 받았다.
Docker 위의 nginx
[ Client ]
[ Nginx Container (80) ]
(Docker Network)
[ API Container (8080) ]
- Nginx도 컨테이너
- 호스트에는 Docker만 있으면 됨
- 컨테이너 이름으로 서로 통신
- systemctl을 쓰지 않음
Docker 위의 nginx 셋팅 전 준비 단계
nginx/
├── docker-compose.yml
└── nginx.conf
- Nginx는 보통 특정 애플리케이션 하나에 종속되지 않는다.
- API 서버가 하나일 수도 있고
- 여러 개로 늘어날 수도 있으며
- 나중에는 인증 서버나 프론트엔드까지 앞단에 붙을 수 있다.
- 독립된 위치에서 관리하는 편이 개인적으로 편했다.
Docker 위의 nginx 시작
폴더 구조
nginx/
├── docker-compose.yml
└── nginx.conf
docker-compose.yml
version: "3.8"
services:
nginx:
image: nginx:1.25
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- app-network
restart: unless-stopped
networks:
app-network:
external: true
nginx.conf
events {}
http {
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
도커 네트워크 생성 명령어
docker network create app-network
Docker 내부에서 컨테이너 간 통신을 구성하려면, 먼저 공용 네트워크를 만들어 두어야 한다. 이 네트워크에 연결된 컨테이너들은 서로를 서비스 이름으로 접근할 수 있으며, nginx와 같은 리버스 프록시 컨테이너도 다른 애플리케이션 컨테이너들과 자연스럽게 연결된다. 이렇게 네트워크 생성을 끝낸 후 이제 도커를 돌려보자.

참고
https://hub.docker.com/_/nginx
nginx - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links 1.29.4, mainline, 1, 1.29, latest, 1.29.4-trixie, mainline-trixie, 1-trixie, 1.29-trixie, trixie 1.29.4-perl, mainline-perl, 1-perl, 1.29-perl, perl, 1.29.4-trixie-perl, mainline-trixie-perl
hub.docker.com
https://adjh54.tistory.com/414
[Docker] Docker 이해하기 -3 : Dockfile 이해하고 Nginx 구성 및 실행방법
해당 글에서는 Dockerfile에 대해 이해하고 이를 기반으로 Nginx를 구성하고 실행하는 방법에 대해 알아봅니다. 💡 [참고] Docker 파일을 설치하는 방법과 기본적인 흐름에 대해 궁금하시면 아래
adjh54.tistory.com