컨테이너 두 개를 띄웠는데 한쪽에서 다른 쪽으로 접속이 안 되는 경험, 도커를 쓰다 보면 한 번쯤 만납니다. 컨테이너는 각자 격리된 네트워크 공간을 갖기 때문에, 어떤 네트워크에 어떻게 붙어 있는지를 알아야 통신이 풀립니다. 도커 네트워킹의 기초는 bridge 네트워크와 이름 기반 DNS 두 가지로 거의 설명됩니다.
네트워크 드라이버 세 가지
도커는 컨테이너를 연결하는 방식(드라이버)을 여러 개 제공합니다. 입문 단계에서 알아야 할 것은 세 가지입니다.
| 드라이버 | 동작 | 쓰는 상황 |
|---|---|---|
| bridge | 호스트 내부 가상 스위치에 연결 | 한 호스트에서 컨테이너끼리 통신 (기본값) |
| host | 호스트 네트워크를 그대로 사용 | 격리 없이 포트를 직접 쓸 때 |
| none | 네트워크 없음 | 외부와 완전히 차단할 때 |
컨테이너를 별도 옵션 없이 띄우면 기본 bridge 네트워크에 붙습니다. 이 네트워크는 호스트 안의 작은 가상 스위치라고 보면 됩니다.
기본 bridge와 사용자 정의 bridge의 차이
중요한 함정이 하나 있습니다. 기본 bridge에서는 컨테이너 이름으로 서로를 찾지 못합니다. 반면 직접 만든 사용자 정의 네트워크에서는 컨테이너 이름이 DNS로 해석됩니다.
docker network create mynet
docker run -d --name api --network mynet myapi
docker run -it --network mynet alpine ping api
이 예시에서 ping api가 동작하는 이유는, 사용자 정의 네트워크 mynet에 도커 내장 DNS가 붙어 컨테이너 이름 api를 그 컨테이너 IP로 바꿔 주기 때문입니다. 그래서 실무에서는 거의 항상 사용자 정의 네트워크를 만들어 씁니다.
네트워크 상태 확인
어떤 컨테이너가 어떤 네트워크에 붙어 있는지, IP는 무엇인지는 명령으로 바로 확인합니다.
docker network ls
docker network inspect mynet
docker inspect -f '{{.NetworkSettings.Networks}}' api
docker network inspect의 출력에서 연결된 컨테이너 목록과 각자의 IP를 볼 수 있습니다. 통신이 안 될 때는 두 컨테이너가 같은 네트워크에 있는지부터 확인하는 것이 첫 단계입니다.
요점 정리
- 컨테이너는 격리된 네트워크를 가지며, 기본적으로 bridge 네트워크에 붙는다.
- 기본 bridge는 이름 DNS가 없지만, 사용자 정의 네트워크는 컨테이너 이름으로 통신된다.
- 그래서 실무에서는
docker network create로 네트워크를 만들어 컨테이너를 묶는다. - 통신 문제는 "같은 네트워크에 있는가"부터 점검한다.
컨테이너를 직접 연결하고 이름으로 통신하는 과정을 확인하는 실습은 도커 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.