처음 Docker를 사용했을 때 가장 헷갈렸던 부분 중 하나가 바로 네트워크였습니다. 컨테이너를 실행하면 프로그램 자체는 잘 작동하는 것 같은데, 막상 다른 컨테이너와 연결하려고 하면 localhost와 IP 주소, 포트 번호 같은 개념이 한꺼번에 등장하기 때문입니다. 저 역시 처음에는 컨테이너마다 하나의 작은 컴퓨터가 따로 존재한다고 생각해서 네트워크 설정을 어렵게 느꼈습니다. 하지만 Docker 네트워크의 기본 구조를 이해하고 나니 컨테이너가 서로 어떻게 연결되는지 훨씬 쉽게 이해할 수 있었습니다. 이번 글에서는 Docker 네트워크가 무엇인지부터 브리지 네트워크, 포트 연결, 컨테이너 간 통신까지 홈서버를 처음 운영하는 분들도 이해하기 쉽게 정리해 보겠습니다.
Docker 네트워크란 무엇일까?
Docker 네트워크는 컨테이너가 서로 통신하거나 외부 네트워크와 연결될 수 있도록 만들어 주는 기능입니다.
하나의 서버에서 여러 컨테이너를 실행하다 보면 각각의 프로그램이 데이터를 주고받아야 하는 상황이 생깁니다. 예를 들어 웹 애플리케이션 컨테이너와 데이터베이스 컨테이너를 함께 운영한다면 두 컨테이너 사이에 통신이 필요합니다.
Docker는 이러한 연결을 관리하기 위해 네트워크 기능을 제공합니다.
쉽게 생각하면 Docker 네트워크는 여러 컨테이너를 연결해 주는 가상의 네트워크 공간이라고 볼 수 있습니다.
컨테이너가 각각 독립적인 환경에서 실행되더라도 같은 Docker 네트워크에 연결하면 서로 통신할 수 있습니다.
이 구조를 이해하면 Docker Compose로 여러 서비스를 함께 실행할 때도 설정 내용을 훨씬 쉽게 이해할 수 있습니다.
Docker에서 가장 많이 사용하는 브리지 네트워크
Docker 네트워크를 이야기할 때 가장 먼저 알아둘 개념이 브리지(bridge)입니다.
브리지 네트워크는 같은 Docker 호스트에서 실행되는 컨테이너들을 연결하는 대표적인 네트워크 방식입니다.
예를 들어 하나의 서버에 웹 서버, 데이터베이스, 파일 관리 프로그램이 각각 컨테이너로 실행되고 있다고 생각해 보겠습니다.
이 컨테이너들을 같은 브리지 네트워크에 연결하면 서로 통신할 수 있습니다.
여기서 중요한 점은 컨테이너가 반드시 서로의 실제 IP 주소를 직접 기억해야 하는 것은 아니라는 것입니다. Docker가 제공하는 네트워크 기능을 이용하면 컨테이너 이름을 기반으로 다른 컨테이너를 찾는 방식도 사용할 수 있습니다.
이 때문에 Docker Compose 환경에서는 서비스 이름을 이용한 통신 설정을 자주 볼 수 있습니다.
컨테이너의 localhost는 무엇을 의미할까?
Docker 네트워크를 처음 배울 때 가장 많이 혼동하는 부분 중 하나가 localhost입니다.
일반적인 컴퓨터에서는 localhost라고 하면 현재 사용하고 있는 컴퓨터 자신을 의미합니다.
Docker에서도 기본적인 개념은 같습니다. 하지만 컨테이너 안에서 사용하는 localhost는 해당 컨테이너 자신을 가리킵니다.
예를 들어 웹 서버 컨테이너와 데이터베이스 컨테이너가 있다고 해보겠습니다.
웹 서버 컨테이너에서 데이터베이스에 연결하면서 localhost를 사용하면 Docker 입장에서는 웹 서버 컨테이너 자신을 찾게 됩니다. 데이터베이스가 별도의 컨테이너에서 실행되고 있다면 원하는 연결이 이루어지지 않습니다.
이때 두 컨테이너가 같은 Docker 네트워크에 연결되어 있다면 데이터베이스 컨테이너의 서비스 이름을 이용해 연결할 수 있습니다.
이 차이를 이해하는 것만으로도 Docker 네트워크에서 발생하는 많은 문제를 쉽게 해결할 수 있습니다.
컨테이너 간 통신은 어떻게 이루어질까?
컨테이너 간 통신은 생각보다 간단한 구조로 이해할 수 있습니다.
예를 들어 다음과 같은 환경을 생각해 보겠습니다.
웹 애플리케이션 컨테이너와 데이터베이스 컨테이너가 하나의 Docker 네트워크에 연결되어 있습니다.
웹 애플리케이션이 데이터베이스에 접속해야 한다면 데이터베이스의 컨테이너 이름 또는 Compose에서 정의한 서비스 이름을 사용해 연결할 수 있습니다.
Docker의 내부 DNS 기능이 이름을 해당 컨테이너의 네트워크 주소와 연결해 주기 때문에 사용자가 컨테이너의 IP 주소를 직접 관리할 필요가 줄어듭니다.
이 방식의 장점은 컨테이너가 다시 생성되면서 내부 IP 주소가 바뀌더라도 서비스 이름을 이용하는 통신 구조라면 설정을 유지하기 쉽다는 것입니다.
따라서 Docker 환경에서는 가능하면 컨테이너의 고정 IP에 의존하기보다는 서비스 이름을 활용하는 것이 관리하기 편합니다.
포트와 Docker 네트워크는 다릅니다
Docker를 처음 사용할 때 포트와 네트워크를 같은 개념으로 생각하기 쉽습니다.
하지만 둘은 역할이 다릅니다.
네트워크는 컨테이너끼리 어떻게 연결되는지를 결정하는 개념이고, 포트는 컨테이너에서 실행 중인 서비스를 외부에서 접근할 수 있도록 연결하는 역할을 합니다.
예를 들어 웹 프로그램이 컨테이너 내부의 특정 포트에서 실행되고 있다고 가정해 보겠습니다.
Docker의 포트 매핑을 설정하면 호스트 컴퓨터의 특정 포트와 컨테이너의 포트를 연결할 수 있습니다.
사용자가 웹 브라우저에서 서버의 주소와 포트 번호로 접속하면 Docker가 해당 요청을 적절한 컨테이너로 전달합니다.
반면 같은 Docker 네트워크에 있는 다른 컨테이너가 해당 서비스에 접근하는 경우에는 외부에 포트를 공개하지 않고 컨테이너 내부 네트워크를 이용할 수도 있습니다.
이 차이를 알고 있으면 “왜 이 컨테이너는 포트를 공개하지 않았는데 다른 컨테이너에서 접속할 수 있을까?”라는 의문도 자연스럽게 해결됩니다.
하나의 서버에서 여러 네트워크를 사용할 수도 있습니다
홈서버에서는 여러 프로그램을 실행하는 경우가 많기 때문에 하나의 Docker 네트워크만 사용하는 것보다 목적에 따라 네트워크를 나누는 경우도 있습니다.
예를 들어 웹 서비스와 데이터베이스가 서로 통신해야 한다면 두 컨테이너를 같은 네트워크에 연결할 수 있습니다.
반면 서로 통신할 필요가 없는 서비스는 별도의 네트워크에 두어 관리 범위를 나눌 수도 있습니다.
이렇게 네트워크를 분리하면 컨테이너 간 연결 관계를 보다 명확하게 만들 수 있습니다.
처음부터 복잡하게 네트워크를 여러 개 만들 필요는 없습니다. Docker를 처음 사용하는 단계에서는 기본적인 브리지 네트워크와 컨테이너 간 통신 구조를 이해하는 것만으로도 충분합니다.
Docker Compose에서 네트워크를 이해하면 더 쉬워집니다
Docker Compose를 사용하면 여러 컨테이너를 하나의 프로젝트처럼 관리할 수 있습니다.
Compose 환경에서는 여러 서비스가 같은 프로젝트에 포함되면서 서로 통신해야 하는 경우가 많습니다.
예를 들어 웹 애플리케이션, 데이터베이스, 캐시 서버가 함께 실행되는 환경이라면 각 서비스 사이에 네트워크 연결이 필요합니다.
Docker Compose는 이러한 서비스들이 통신할 수 있도록 네트워크를 구성하는 데 도움을 줍니다.
특히 서비스 이름을 이용한 통신 방식을 이해하고 있다면 Compose 설정 파일을 봤을 때 각 항목이 어떤 역할을 하는지 훨씬 쉽게 파악할 수 있습니다.
홈서버에서 여러 오픈소스 프로그램을 Docker로 운영할 계획이라면 Docker Compose와 네트워크 개념을 함께 익혀두는 것을 추천합니다.
네트워크 문제를 만났을 때 확인할 부분
컨테이너끼리 통신이 되지 않을 때는 무작정 설정을 변경하기보다 몇 가지를 순서대로 확인하는 것이 좋습니다.
먼저 두 컨테이너가 같은 Docker 네트워크에 연결되어 있는지 확인합니다.
그다음 접속 대상의 주소를 올바르게 사용하고 있는지 살펴봅니다. 컨테이너 간 통신이라면 localhost를 사용하고 있지는 않은지 확인하는 것이 중요합니다.
또한 프로그램이 실제로 실행 중인지, 해당 서비스가 컨테이너 내부에서 정상적으로 연결을 받을 수 있는 상태인지 확인해야 합니다.
외부에서 접속하는 문제라면 포트 매핑도 함께 확인해야 합니다.
이처럼 네트워크 문제는 크게 컨테이너가 어느 네트워크에 연결되어 있는지, 어떤 주소로 통신하는지, 포트가 어떻게 연결되어 있는지 세 가지 관점에서 살펴보면 원인을 찾기가 쉬워집니다.
Docker 네트워크는 어렵게 생각할 필요가 없습니다
Docker 네트워크를 처음 보면 브리지, 포트 매핑, DNS, 컨테이너 이름 등 생소한 용어가 한꺼번에 등장해서 어렵게 느껴질 수 있습니다.
하지만 기본적인 구조는 생각보다 단순합니다.
Docker 네트워크는 컨테이너를 연결해 주는 가상의 네트워크이고, 브리지 네트워크는 같은 Docker 호스트에서 컨테이너를 연결하는 대표적인 방식입니다. 같은 네트워크에 연결된 컨테이너는 서로 통신할 수 있으며, 컨테이너 간 통신에서는 localhost가 상대 컨테이너를 의미하지 않는다는 점을 기억하면 됩니다.
또한 포트 매핑은 외부에서 컨테이너의 서비스에 접근하기 위한 연결이라는 점도 중요합니다.
처음 홈서버를 운영하면서 저도 컨테이너 간 연결이 제대로 되지 않아 설정을 몇 번씩 확인했던 기억이 있습니다. 당시에는 IP 주소와 포트 번호만 계속 확인했지만, 나중에 Docker 네트워크의 구조를 이해하고 나니 문제를 바라보는 방식 자체가 달라졌습니다. Docker는 단순히 프로그램을 실행하는 도구가 아니라 여러 서비스를 서로 연결해 하나의 시스템으로 구성할 수 있는 환경이라는 점을 이해하면 훨씬 재미있게 사용할 수 있습니다.
처음부터 복잡한 네트워크 구성을 만들기보다는 컨테이너 두 개를 같은 브리지 네트워크에 연결하고 서로 통신하는 과정을 직접 경험해 보는 것부터 시작해 보세요. 작은 실습을 반복하다 보면 Docker 네트워크의 구조가 자연스럽게 익숙해지고, 이후 Docker Compose를 이용한 다양한 홈서버 구성도 훨씬 수월하게 이해할 수 있습니다.