Docker Compose에서 Container를 실행한 후 실제 사용자가 서비스에 접속하려면 Port 연결 설정이 필요합니다.
Container는 기본적으로 외부에서 직접 접근할 수 없습니다.
기본 구조:
외부 사용자
X
↓
Container
Port를 연결하면:
외부 사용자
↓
Host Port
↓
Container Port
↓
Application
예:
services:
web:
image: nginx
ports:
- "8080:80"
접속:
http://localhost:8080
동작:
사용자 요청
↓
8080 Port
↓
Container 80 Port
↓
Nginx 실행
이번 글에서는 Docker Compose Port의 기본 개념부터 ports와 expose 차이, 여러 Port 연결, Production 서버 설정까지 자세히 알아보겠습니다.
Docker Compose Port란 무엇인가?
Port는 Container 내부의 서비스를 외부와 연결하는 통로입니다.
Docker Container는 독립된 네트워크 환경에서 실행됩니다.
구조:
Host Server
↓
Docker Network
↓
Container
↓
Application Port
예:
Nginx 기본 Port:
Container Port: 80
Host 연결:
Host Port: 8080
설정:
ports:
- "8080:80"
의미:
8080
↓
80
Docker Compose ports 기본 문법
기본 형식:
ports:
- HOST_PORT:CONTAINER_PORT
예:
ports:
- "3000:3000"
의미:
Host 3000
↓
Container 3000
Node.js Application:
Container 내부
3000 Port 실행
외부:
http://서버주소:3000
Docker Compose Port 여러 개 연결하기
하나의 Service에 여러 Port를 지정할 수 있습니다.
예:
services:
app:
image: my-app
ports:
- "3000:3000"
- "8080:8080"
구조:
3000
↓
Application
8080
↓
Admin Page
활용:
- Web 서비스
- API 서버
- 관리 페이지
Docker Compose Port와 expose 차이
많이 헷갈리는 부분입니다.
ports
외부 공개:
ports:
- "8080:80"
구조:
Internet
↓
Host
↓
Container
사용:
- 사용자 접속
- 외부 API
expose
Container 내부 공개:
expose:
- "80"
구조:
Container A
↓
Docker Network
↓
Container B
사용:
- 내부 통신
- Database 연결
예:
Nginx
↓
Backend
↓
Database
외부 공개 필요 없음.
Docker Compose Port 충돌 해결 방법
문제:
Port 8080 이미 사용 중
오류:
Bind for 0.0.0.0:8080 failed
확인:
netstat -tulpn
또는:
lsof -i :8080
해결:
다른 Host Port 사용:
ports:
- "8081:80"
변경:
8081
↓
Container 80
Docker Compose Port 특정 IP 연결
모든 IP 공개:
ports:
- "8080:80"
특정 IP만 허용:
ports:
- "127.0.0.1:8080:80"
차이:
전체 공개:
외부 접속 가능
Local만:
서버 내부만 접속
Docker Compose Port UDP 설정
기본:
ports:
- "53:53"
UDP:
ports:
- "53:53/udp"
활용:
- DNS
- Game Server
- 실시간 통신
Docker Compose Port 확인 방법
실행 상태 확인:
docker compose ps
예:
PORTS
0.0.0.0:8080->80/tcp
의미:
Host 8080
↓
Container 80
상세 확인:
docker inspect container-name
Docker Compose Port 운영 예제
실제 서버 구조:
services:
nginx:
image: nginx
ports:
- "80:80"
app:
image: my-app
expose:
- "3000"
database:
image: mysql
expose:
- "3306"
구조:
사용자
↓
Nginx :80
↓
Application :3000
↓
MySQL :3306
외부에는:
80 Port만 공개
내부 서비스:
Docker Network 통신
Production 서버 Port 설계 방법
운영 환경에서는 모든 Port를 공개하면 보안 문제가 발생할 수 있습니다.
좋은 구조:
Internet
↓
80 / 443
↓
Nginx
↓
Application
↓
Database
나쁜 구조:
Internet
↓
3306 MySQL 공개
↓
Database
Database Port는 외부 공개하지 않는 것이 일반적입니다.
Docker Compose Port와 Nginx 구성
실무에서는 Reverse Proxy를 많이 사용합니다.
구조:
사용자
↓
Nginx
80/443
↓
Docker Container
↓
Application
docker-compose.yml:
services:
nginx:
image: nginx
ports:
- "80:80"
app:
image: my-app
expose:
- "3000"
장점:
- SSL 적용 가능
- 여러 서비스 연결
- 보안 강화
Docker Compose Port 관리 Best Practice
추천:
✅ 필요한 Port만 공개
✅ Database 외부 공개 금지
✅ Nginx Reverse Proxy 사용
✅ Production Port 문서화
✅ Port 충돌 확인
운영 예:
80
↓
Web
443
↓
HTTPS
3000
↓
Internal App
3306
↓
Internal Database
자주 묻는 질문
ports와 expose 차이는 무엇인가요?
ports는 외부 공개, expose는 Container 내부 통신용입니다.
Database Port를 공개해도 되나요?
가능하지만 Production에서는 권장하지 않습니다.
같은 Port를 여러 Container가 사용할 수 있나요?
Container 내부 Port는 가능하지만 Host Port는 중복 사용할 수 없습니다.
Docker Compose에서 HTTPS도 설정할 수 있나요?
가능합니다.
일반적으로 Nginx와 SSL 인증서를 함께 구성합니다.
마무리
Docker Compose Port 설정은 Container 서비스를 외부와 연결하는 핵심 기능입니다.
HOST_PORT:CONTAINER_PORT 구조를 이해하면 Web Server, API Server, Database 등 다양한 서비스를 안정적으로 연결할 수 있습니다.
실제 Production 환경에서는 모든 Container Port를 공개하지 않고 Nginx를 통해 필요한 서비스만 외부에 노출하는 구조를 많이 사용합니다.
다음 글에서는 서버 운영에서 필수적인 Docker Compose Environment 환경 변수 관리 방법을 다루겠습니다.