도커 네트워크 이해해보기

반응형

도커를 학습하면서 가장 어렵게 느껴졌던 부분이 무엇이냐고 묻는다면, 저는 단연 네트워크라고 말할 것 같습니다.

Dockerfile은 컨테이너가 실행될 환경을 정의하는 파일이고, Docker Compose는 여러 개의 컨테이너를 하나의 서비스처럼 구성해주는 도구입니다. Volume은 컨테이너의 데이터를 영속적으로 저장하기 위해 호스트와 연결되는 저장 공간으로 이해하고 있습니다.

이처럼 각 요소의 역할은 비교적 명확하게 정리할 수 있었지만, 도커 네트워크는 개념을 아는 것과 실제로 이해하는 것 사이에 간극이 있었습니다.

'도커 안에 네트워크를 만든다'는 것은 알고 있었지만,

  • 왜 굳이 네트워크를 분리해야 하는지
  • 언제 기본 bridge를 쓰고, 언제 사용자 정의 네트워크를 써야 하는지
  • 컨테이너들은 어떻게 서로를 찾고 통신하는지

이 부분들은 쉽게 와닿지 않았습니다.

그래서 이번 글에서는 단순히 "네트워크를 만든다"는 수준이 아니라, 도커 네트워크를 실제로 어떻게 사용해야 하는지를 정리해보려 합니다.

컨테이너들은 어떻게 서로를 찾고 통신하는지

컨테이너가 서로 통신하기 위해서는 동일한 Docker 네트워크에 연결되어 있어야 합니다.
각 컨테이너는 기본적으로 격리된 환경에서 실행되기 때문에, 같은 네트워크에 속해 있지 않다면 서로를 찾을 수 없습니다.

Docker는 하나의 네트워크만 사용하는 것이 아니라, 여러 개의 네트워크를 생성하고 관리할 수 있습니다. 이를 통해 서비스 단위로 네트워크를 분리하거나, 특정 컨테이너들만 서로 통신하도록 구성할 수 있습니다.

같은 네트워크에 속한 컨테이너들은 Docker 내부 DNS를 통해 컨테이너 이름을 기반으로 서로를 찾고 통신하게 됩니다.
대략적으로 그리면 다음과 같이 그릴 수 있죠.

Docker는 설치 시 기본 네트워크(bridge, host, none)를 자동으로 생성합니다.
하지만 서비스 간 네트워크를 분리하거나, 이름 기반 통신을 사용하기 위해서는 사용자 정의 네트워크를 직접 생성해야 합니다.

만약에, 네트워크를 설정하지 않는다면, 컨테이너는 서로 정보를 공유 할 수 있을까요?

처음에는 네트워크를 설정하지 않으면 통신할 수 없다고 생각할 수 있습니다. 하지만 실제로는 그렇지 않습니다. Docker는 컨테이너를 실행할 때 별도의 설정이 없더라도 기본 bridge 네트워크에 자동으로 연결합니다. 따라서 완전히 고립되는 것은 아니며, 같은 bridge 네트워크에 속한 컨테이너끼리는 통신이 가능합니다.

다만 여기서 중요한 차이가 있습니다. 우리가 실무에서 말하는 "통신"은 단순히 IP로 접근하는 것이 아니라, 컨테이너 이름을 기반으로 한 통신을 의미하는 경우가 많습니다. 사용자 정의 네트워크에서는 Docker 내부 DNS가 동작하여 컨테이너 이름으로 서로를 찾을 수 있습니다. 반면 기본 bridge 네트워크에서는 이러한 이름 기반 통신이 제한적이거나 불편합니다.

즉, 기본 bridge 네트워크에서도 IP를 통해 통신은 가능하지만, 이름 기반 통신이 자연스럽게 지원되지 않기 때문에 실무에서는 사용자 정의 네트워크를 사용하는 경우가 많습니다.

그렇다면, bridge 네트워크는 어째서 DNS를 제공하지 않을까요?

초기 Docker는 단순히 컨테이너를 실행하고 포트를 매핑하는 데 초점이 맞춰져 있었습니다. 이후 사용자 정의 네트워크와 내부 DNS 기능이 도입되었지만, 기존 환경과의 호환성을 위해 기본 bridge 네트워크의 구조는 그대로 유지되었습니다. 따라서 이름 기반 DNS는 기본 bridge가 아닌, 사용자 정의 네트워크에서 제공됩니다.

결론

도커를 사용하면서 가장 막연하게 느껴졌던 부분은 네트워크였습니다.
컨테이너를 실행하고, 이미지를 빌드하고, Compose로 묶는 것까지는 비교적 명확했지만, 네트워크는 어딘가 추상적으로 느껴졌습니다. 그래서 언젠가는 한 번 정리해봐야겠다고 생각했고, 이번에 차근차근 개념을 짚어보게 되었습니다.

막상 정리해보니 생각보다 복잡하지는 않았습니다.
같은 네트워크에 있어야 통신할 수 있다는 점, 사용자 정의 네트워크에서 이름 기반 DNS가 동작한다는 점, 그리고 Compose가 네트워크를 어떻게 관리하는지까지 이해하고 나니 전체 구조가 비교적 명확해졌습니다.

물론 여기서 더 깊게 들어가면 리눅스 네트워크 네임스페이스, 브리지, iptables 같은 영역까지 확장될 수 있겠지만, 적어도 Docker를 사용하는 개발자 관점에서는 이 정도 이해만으로도 충분히 네트워크를 설계하고 활용할 수 있을 것 같습니다.

내일부터는 무중단 배포 실습을 진행해볼 예정인데, 오늘 정리한 내용이 분명 도움이 될 것이라 기대해봅니다.

 

반응형

댓글

Designed by JB FACTORY