본문 바로가기

운영체제 및 플랫폼/Docker(도커)

도커 네트워크 개념 정리 — 컨테이너끼리 통신하는 방법과 포트 공개

728x90
반응형

한 줄 요약

도커 네트워크는 컨테이너끼리, 그리고 외부와 통신하는 길을 정하는 기능이에요. 직접 만든 브리지 네트워크를 쓰면 컨테이너 이름으로 서로 찾을 수 있어요.

도커 네트워크


1. 핵심 개념

1.1 도커 네트워크란

컨테이너는 기본적으로 격리된 환경에서 실행돼요. 도커 네트워크는 격리된 컨테이너가 누구와, 어떤 경로로 통신할지 정해 줘요.

네트워크 드라이버: 도커 네트워크의 동작 방식을 정하는 종류예요. 드라이버에 따라 통신 범위가 달라져요.

드라이버 설명
bridge 기본 드라이버예요. 같은 호스트 안의 컨테이너끼리 통신해요
host 컨테이너가 호스트의 네트워크를 그대로 사용해요. 네트워크 격리가 없어요
none 네트워크를 연결하지 않아요
overlay 여러 도커 호스트에 있는 컨테이너를 연결해요
macvlan 컨테이너에 MAC 주소를 부여해 물리 네트워크 장비처럼 보이게 해요

호스트: 도커가 설치되어 컨테이너가 실제로 돌아가는 컴퓨터예요.

 

1.2 왜 중요한가

웹 서버 컨테이너가 DB 컨테이너에 접속하려면 네트워크 설정이 맞아야 해요. 또 포트를 잘못 공개하면 외부에서 DB에 접근할 수 있는 상태가 돼요. 도커 네트워크를 이해하면 연결 문제와 보안 문제를 함께 줄일 수 있어요.


2. 쉽게 이해하기

도커 네트워크를 아파트 단지에 비유해 볼게요.

  • 사용자 정의 브리지 네트워크는 같은 동이에요. 같은 동 주민은 호수(컨테이너 이름)만 알면 인터폰으로 연락할 수 있어요.
  • 기본 브리지 네트워크는 호수 안내가 없는 동이에요. 연락하려면 정확한 번호(IP 주소)를 알아야 해요.
  • 포트 공개(-p)는 정문 경비실이에요. 외부 방문객이 오면 약속된 세대로 안내해 줘요.

3. 기본 브리지 vs 사용자 정의 브리지

도커를 시작하면 bridge라는 기본 네트워크가 자동으로 만들어져요. 별도로 지정하지 않은 컨테이너는 여기에 연결돼요.

공식 문서는 사용자 정의 브리지 네트워크가 기본 브리지보다 낫다고 설명해요.

항목 기본 브리지 사용자 정의 브리지
이름으로 접속 불가 (IP로만 접속) 가능 (컨테이너 이름, 별칭)
이름 연결 방법 --link 옵션 필요 (레거시) 자동 DNS 제공
같은 네트워크 내 포트 - 서로 모든 포트에 접근 가능

DNS: 이름을 IP 주소로 바꿔 주는 시스템이에요.

중지된 컨테이너는 IP 주소를 잃어요. 다시 시작하면 IP가 바뀔 수 있어서, IP보다 이름으로 접속하는 방식이 안정적이에요.


4. 실습: 컨테이너 이름으로 통신하기

 

4.1 네트워크 만들기

docker network create app-net
docker network ls

 

4.2 컨테이너 연결하기

# DB 컨테이너
docker run -d --name db --network app-net \
  -e MYSQL_ROOT_PASSWORD=<비밀번호> \
  mysql:8.4

# 앱 컨테이너
docker run -d --name web --network app-net \
  -p 8080:8080 \
  <이미지 이름>:<태그>

이제 web 컨테이너는 db:3306 주소로 DB에 접속할 수 있어요. 같은 네트워크 안에서는 DB 포트를 -p로 공개할 필요가 없어요.

 

4.3 연결 확인하기

docker network inspect app-net

출력 결과의 Containers 항목에서 연결된 컨테이너를 확인할 수 있어요.


5. 포트 공개(Port Publishing)

외부에서 컨테이너에 접속하려면 포트를 공개해야 해요.

docker run -d -p 8080:80 nginx
  • 8080: 호스트 포트예요. 외부에서 이 포트로 접속해요.
  • 80: 컨테이너 포트예요. 앱이 실제로 요청을 받는 포트예요.

 

5.1 기본값은 모든 네트워크 인터페이스

공식 문서에 따르면 공개된 포트는 기본적으로 호스트의 모든 네트워크 인터페이스(0.0.0.0)에서 열려요. 즉 호스트에 접근할 수 있는 누구나 접속할 수 있어요.

내 컴퓨터에서만 접속하게 하려면 IP를 앞에 붙여요.

docker run -d -p 127.0.0.1:8080:80 nginx

DB처럼 민감한 서비스는 외부 공개 여부를 먼저 확인해야 해요.


6. 핵심 정리

  • 도커 네트워크는 컨테이너의 통신 범위와 경로를 정해요.
  • 사용자 정의 브리지 네트워크를 쓰면 컨테이너 이름으로 서로 접속할 수 있어요.
  • 같은 네트워크 안의 컨테이너끼리는 -p 없이 통신해요.
  • -p로 공개한 포트는 기본적으로 모든 인터페이스에 열려요. 필요하면 127.0.0.1로 제한해요.
  • EXPOSE는 문서 표시일 뿐, 포트를 열지 않아요.

7. 추가 정보

주의사항

  • 리눅스 방화벽(ufw) 사용 시: 공식 문서에 따르면 도커로 공개한 포트의 트래픽은 ufw 규칙을 거치기 전에 처리돼요. ufw만으로 차단했다고 판단하면 안 돼요. 서버에서 운영한다면 공식 문서의 방화벽(Packet filtering and firewalls) 항목에서 ufw 관련 내용을 확인하세요.
  • host 드라이버의 동작은 운영체제 환경에 따라 다를 수 있어요. 사용 전 공식 문서의 지원 범위를 확인하세요.

관련 글

 

반응형