Docker Compose Port 설정 완벽 가이드! Container 외부 접속과 네트워크 연결 방법 알아보기

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 환경 변수 관리 방법을 다루겠습니다.

댓글 남기기