-
도커 네트워킹(Docker Networking)
- 컨테이너 간의 통신 및 컨테이너와 외부와의 네트워크 연결을 관리하는 핵심 개념
- 도커를 사용한 현대적인 애플리케이션 배포 및 관리에서 필수적인 역할을 수행함
- 독립된 환경(컨테이너화된 애플리케이션) 간 서로 통신할 수 있어야함도커 네트워크(Docker Network)
도커 컨테이너는 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작 할 때 마다 변경될 수 있다.
이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP 이므로 외부와 연결될 필요가 있다.
이 과정은 컨테이너를 시작할 때마다 호스트에 veth..라는 네트워크 인터페이스를 생성함으로써 이뤄진다.
도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너 마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth(virtual eth) 로 시작한다.
veth 인터페이스는 사용자가 직접 생성할 필요는 없으며 컨테이너가 가상화 될 때 도커 엔진이 자동으로 생성한다.도커가 설치된 호스트에서 ifconfig나 ip addr과 같은 명령어로 네트워크 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 알 수 있다.
--network=host를 사용할 경우
- 컨테이너는 호스트 네트워크 네임스페이스를 그대로 공유
- 별도 네임스페이스, 별도 veth 쌍이 필요 없음 → veth가 생성되지 않음


eth0(enp0s3)은 공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있는 호스트의 네트워크 인터페이스
최근 리눅스 배포판에서는 eth0 대신 enp0s3, enp0s8 같은 새로운 방식의 인터페이스 이름을 사용
veth로 시작하는 인터페이스는 컨테이너를 시작할 때 생성되었으며 각 컨테이너의 eth0과 연결
veth 인터페이스 뿐 아니라 docker0이라는 브리지도 존재하는 데 docekr0 브리지는 각 veth 인터페이스와 바인딩돼 호스트 eth0(enp0s3) 인터페이스와 이어주는 역할을 한다.
정리하면 컨테이너의 eth0 인터페이스는 호스트의 veth... 라는 인터페이스와 연결됐으며 veth 인터페이스는 docker0 브리지와 바인딩돼 외부와 통신할 수 있다.
도커 컨테이너와 호스트 간의 네트워크 연결 구조Docker 네트워크 구조 (기본 브리지 모드 기준)
[도커 컨테이너] ├── lo ← 루프백 (자기 자신) └── eth0 ← 컨테이너 내부 네트워크 인터페이스 │ ▼ [vethXXX] ← 호스트에 생성된 가상 인터페이스 (컨테이너 eth0과 쌍) │ ▼ [docker0] ← 호스트에 있는 브리지 네트워크 │ ▼ [호스트의 외부 NIC] ├─ enp0s3 ← NAT 네트워크 (VirtualBox에서 기본 생성) └─ enp0s8 ← 브리지 어댑터 (로컬 공유기에서 IP 받음)- eth0: 컨테이너 내부 네트워크 인터페이스 (컨테이너 입장에선 메인 인터페이스)
- vethXXX: eth0과 연결된 호스트 쪽 가상 인터페이스
- docker0: 기본 도커 브리지, veth들이 여기에 연결됨
- enp0s3: VirtualBox가 만든 NAT 인터페이스 (10.0.2.x)
- enp0s8: 브리지 모드에서 물리적 NIC처럼 작동 (192.168.x.x)
컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수 있다.
도커가 자체적으로 제공하는 대표적인 네트워크 드라이버로는 브리지, 호스트, none, 컨테이너, 오버레이가 있다.
브리지 네트워크는 컨테이너를 생성할 때 자동으로 연결되는 docker0 브리지를 활용하도록 설정되어있다.
이 네트워크는 172.17.0.X IP 대역을 컨테이너에 순차적으로 할당한다.# 네트워크 목록 확인 docker network ls
# 네트워크 상세 정보 확인 docker network inspect [네트워크]
브리지 네트워크
도커 엔진 내부에서 컨테이너 간 통신을 위한 기본 네트워크
기본적으로 컨테이너 간 통신을 허용하고 IP 주소를 할당함
브리지 네트워크는 docker0이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.
컨테이너는 연결된 브리지를 통해 외부와 통신할 수 있다.아무런 설정을 하지 않고 컨테이너를 생성하면 자동으로 docker0 브리지를 사용한다.



- 네트워크 연결 / 해제
- 브리지 네트워크와 오버레이 네트워크와 같이 특정 IP 대역을 갖는 네트워크 모드에만 이 명령어를 사용할 수 있다.
# 네트워크 연결 docker network connect [네트워크] [컨테이너]
# 네트워크 연결 해제 docker network disconnet [네트워크] [컨테이너]
- 도커 브리지 네트워크 생성

- bridge-network를 사용하는 nginx 컨테이너 생성
- docker run -d --network brige-network --name container1 nginx
- -p 옵션으로 포트 매핑을 하지 않으면 외부(호스트 또는 인터넷) 접속 불가
포트 매핑
컨테이너 내부 포트와 호스트 머신의 포트를 매핑하여 외부에서 컨테이너에 접근할 수 있게 하는 기능
-p 옵션 사용 : 포트 매핑을 설정
- docker network inspect brige-network

- docker exec -it container1 /bin/bash : 컨테이너 내부 접속


호스트 네트워크네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.
컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트포워딩 없이 바로 서비스 할 수 있다.호스트 네트워크를 사용하는 컨테이너라도 NAT 모드라면 127.0.0.1 접속 시 반드시 포트포워딩 필요,
브리지 모드에선 192.168.x.x IP로 바로 접속 가능하다!



- 브리지 어댑터

- NAT(Virtual Box 포트 포워딩 필요)




- 네트워크 상태 확인을 위해 컨테이너 내부에 net-tools 설치

- 컨테이너 내부에서 ifconfig를 치면 호스트와 똑같은 네트워크 인터페이스가 그대로 보인다.

- 호스트

- 리눅스 네트워크 상태를 확인하는 명령어 : ifconfig 와 ip addr 의 차이
항목 ifconfig ip addr (ip a) 사용 여부 구버전 도구 (Deprecated) 신버전 도구 (현재 표준) 패키지 net-tools iproute2 설치 여부 최신 OS에선 기본 미설치 대부분 기본 설치됨 기능 범위 기본적인 IP/인터페이스 확인만 가능 훨씬 많은 정보 제공 (link 상태, scope 등) 세부 제어 제한적 매우 세밀한 제어 가능 (route, link 등) host 네트워크를 사용하는 nginx 컨테이너 생성(-p 옵션을 사용하지 않아도 된다)
- -p 옵션 없이도 호스트 포트에 직접 바인딩되므로, 외부에서 접속 가능 (포트 충돌 주의)
- docker run -d --network host --name container3 nginx

- 80 포트 포트 포워딩


논(none) 네트워크
네트워크를 쓰지 않는 것 외부와의 연결이 단절된다.
오버레이 네트워크
여러 호스트에서 컨테이너 간 통신을 지원하기 위해 사용되며 가상 네트워크를 생성하여 컨테이너를 연결한다.
- ss -tnlp | grep :80 : 어떤 프로세스가 80 포트를 사용 중 인지 확인

- iptables -t nat -L -n : NAT(Network Address Translation) 규칙 확인

참고
시작하세요! 도커/쿠버네티스 및 ChatGPT
'Docker' 카테고리의 다른 글
docker 설치 - Rocky Linux8 (0) 2025.06.25