Docker 컨테이너 네트워킹
Docker 환경에서 컨테이너들이 통신하고 외부와 연결되는 방식을 다루는 중요한 주제입니다. 다음은 Docker 컨테이너 네트워킹에 대한 핵심 개념과 기능에 대한 설명입니다.
- Docker 네트워킹 모델: Docker는 기본적으로 네트워크를 사용하여 컨테이너 간 통신과 외부와의 통신을 관리합니다. Docker는 기본적으로 네트워크 드라이버를 사용하여 컨테이너들을 가상 네트워크에 연결합니다.
- 가상 네트워크: Docker는 가상 네트워크를 사용하여 컨테이너들을 논리적으로 그룹화하고 격리된 환경을 제공합니다. 각 가상 네트워크는 고유한 네트워크 이름과 범위를 가지며, 컨테이너들은 가상 네트워크에 연결되어 통신할 수 있습니다.
- 컨테이너 간 통신: 동일한 가상 네트워크에 연결된 컨테이너들은 내부 IP 주소를 통해 서로 통신할 수 있습니다. 이를 통해 여러 컨테이너들이 독립적인 서비스로 작동하면서도 서로간에 통신할 수 있습니다.
- 네트워크 드라이버: Docker는 다양한 네트워크 드라이버를 제공하여 다양한 네트워킹 모델을 지원합니다. 기본적으로 "bridge" 네트워크 드라이버를 사용하며, 추가적으로 "host", "overlay", "macvlan" 등의 드라이버도 사용할 수 있습니다.
- 다중 호스트 네트워킹: Docker는 다중 호스트 환경에서 컨테이너 간 통신을 가능하게 하는 다중 호스트 네트워킹을 지원합니다. 이를 통해 여러 호스트에 분산된 컨테이너들이 서로 통신할 수 있습니다. 다중 호스트 네트워킹을 위해 "overlay" 네트워크 드라이버를 사용할 수 있습니다.
Docker는 다양한 네트워킹 모델을 제공하여 컨테이너들 간의 통신 및 외부와의 통신을 관리합니다. 주요 Docker 네트워킹 모델은 다음과 같습니다:
- Bridge 모드: Bridge 모드는 Docker의 기본 네트워킹 모델로, 호스트와 독립된 가상 네트워크를 생성하여 컨테이너를 연결합니다. 각 컨테이너는 고유한 IP 주소를 할당받고 가상 브리지에 연결됩니다. Bridge 모드는 컨테이너 간 통신을 용이하게 하며, 호스트와 컨테이너 간의 포트 포워딩도 가능합니다.
- Host 모드: Host 모드는 컨테이너를 호스트의 네트워크 스택에 직접 연결하는 모드입니다. 컨테이너는 호스트의 IP 주소와 포트를 그대로 사용하므로 호스트와 동일한 네트워크 환경에서 실행됩니다. 이 모드는 컨테이너의 네트워크 격리를 제공하지 않지만, 네트워크 오버헤드가 적습니다.
- Overlay 모드: Overlay 모드는 여러 호스트에 걸쳐 분산된 컨테이너 간 통신을 가능하게 하는 모드입니다. Overlay 네트워크는 여러 호스트 간에 가상 네트워크를 생성하고 컨테이너를 연결하는 방식으로 동작합니다. 이 모드는 멀티호스트 환경에서 컨테이너 간 통신을 용이하게 하기 위해 사용됩니다.
- Macvlan 모드: Macvlan 모드는 호스트의 물리 네트워크 인터페이스에 직접 연결하는 모드입니다. 각 컨테이너는 호스트와 동일한 네트워크 상에서 고유한 MAC 주소와 IP 주소를 할당받습니다. Macvlan 모드는 컨테이너가 호스트 네트워크와 동일한 수준의 네트워크 기능을 가질 수 있도록 합니다.
이외에도 Docker는 사용자 정의 네트워크를 생성하고 컨테이너를 해당 네트워크에 연결하는 기능을 제공합니다. 이를 통해 사용자는 자체적인 네트워크를 구성하고 컨테이너 간에 격리된 통신을 수행할 수 있습니다.
다음은 Docker의 Bridge 모드를 사용하여 컨테이너를 생성하고 연결하는 예제입니다. [아래 더보기 클릭]
- Bridge 네트워크 생성:
- 첫 번째 컨테이너 생성 및 실행:
docker run -d --name container1 --network mynetwork nginx
- 두 번째 컨테이너 생성 및 실행:
docker run -d --name container2 --network mynetwork nginx
위 예제에서는 mynetwork라는 이름의 Bridge 네트워크를 생성하고, 두 개의 Nginx 컨테이너를 해당 네트워크에 연결합니다. 이로써 컨테이너들은 동일한 네트워크 상에 있으며, 서로 통신할 수 있습니다.
이제 container1과 container2는 동일한 네트워크에 속하므로 서로의 IP 주소로 통신할 수 있습니다. 예를 들어, container1에서 container2로 HTTP 요청을 보내려면 다음과 같이 실행할 수 있습니다:
docker exec container1 curl container2
위 명령은 container1에서 container2로 HTTP 요청을 보내고 응답을 받는 예시입니다. Bridge 네트워크를 사용하여 컨테이너를 생성하면 컨테이너 간의 통신이 가능해집니다.
다음은 Docker의 Host 모드를 사용하여 컨테이너를 생성하고 실행하는 예제입니다. [아래 더보기 클릭]
컨테이너 생성 및 실행:
docker run -d --name container1 --network host nginx
위 예제에서는 --network host 옵션을 사용하여 컨테이너를 Host 모드로 실행합니다. 이렇게 하면 컨테이너는 호스트의 네트워크 네임스페이스를 공유하게 되며, 호스트의 IP 주소와 포트를 그대로 사용할 수 있습니다.
Host 모드로 실행된 컨테이너는 호스트와 동일한 네트워크 인터페이스를 사용하므로 포트 바인딩을 따로 설정하지 않아도 호스트의 포트와 동일한 포트로 컨테이너의 서비스에 접근할 수 있습니다. 따라서, container1은 호스트의 IP 주소와 포트로 직접 접근할 수 있습니다.
Host 모드는 컨테이너와 호스트 간의 네트워크 격리를 해제하므로, 컨테이너 내부에서 호스트의 리소스에 직접 액세스할 수 있게 됩니다. 그러나 호스트 모드는 네트워크 격리를 해제하기 때문에 보안 측면에서 주의해야 합니다.
Host 모드로 실행된 컨테이너는 다른 컨테이너와 격리되지 않으므로, 동일한 포트를 사용하는 다른 컨테이너나 호스트의 서비스와 충돌할 수 있습니다. 따라서, 포트 충돌을 피하기 위해 Host 모드는 신중하게 사용해야 합니다.
다음은 Docker의 Overlay 네트워크 모드를 사용하여 컨테이너를 생성하고 실행하는 예제입니다. [아래 더보기 클릭]
- Overlay 네트워크 생성:
docker network create -d overlay my-network
위 명령을 통해 my-network라는 이름의 Overlay 네트워크를 생성합니다.
- 컨테이너 생성 및 실행:
docker run -d --name container1 --network my-network nginx docker run -d --name container2 --network my-network nginx
위 예제에서는 --network my-network 옵션을 사용하여 컨테이너를 Overlay 네트워크에 연결합니다. container1과 container2라는 두 개의 컨테이너를 생성하고 실행합니다.
Overlay 네트워크는 여러 호스트 간에 컨테이너를 연결하기 위해 사용되며, 컨테이너 간의 통신은 Overlay 네트워크를 통해 이루어집니다. 컨테이너들은 동일한 Overlay 네트워크에 속해 있기 때문에 서로 통신이 가능합니다.
Overlay 네트워크는 여러 호스트 간에 컨테이너를 분산시킬 수 있으며, 컨테이너 간의 통신은 가상의 Overlay 네트워크를 통해 이루어집니다. Overlay 네트워크는 네트워크 가상화 기술을 사용하여 여러 호스트 간에 컨테이너를 연결하고 격리하는 기능을 제공합니다.
이 예제에서는 두 개의 컨테이너가 my-network라는 Overlay 네트워크에 속하게 됩니다. 따라서, container1은 container2에 대해 Overlay 네트워크를 통해 통신할 수 있습니다.
Macvlan 모드는 Docker의 네트워크 모드 중 하나로, 호스트와 동일한 네트워크 상에서 컨테이너를 직접 호스트와 동일한 네트워크로 연결하는 기능을 제공합니다. 다음은 Macvlan 모드를 사용하여 컨테이너를 생성하고 실행하는 예제입니다. [아래 더보기 클릭]
- Macvlan 네트워크 생성:
docker network create -d macvlan \ --subnet=192.168.0.0/24 \ --gateway=192.168.0.1 \ -o parent=eth0 macvlan-network
위 명령을 통해 macvlan-network라는 이름의 Macvlan 네트워크를 생성합니다. --subnet과 --gateway 옵션을 사용하여 네트워크의 IP 대역과 게이트웨이를 설정합니다. -o parent=eth0 옵션은 Macvlan 네트워크가 호스트의 eth0 인터페이스와 연결되도록 지정합니다.
- 컨테이너 생성 및 실행:
docker run -d --name container1 --network macvlan-network \ --ip=192.168.0.2 nginx docker run -d --name container2 --network macvlan-network \ --ip=192.168.0.3 nginx
위 예제에서는 --network macvlan-network 옵션을 사용하여 컨테이너를 Macvlan 네트워크에 연결합니다. --ip 옵션을 사용하여 각 컨테이너에 고정 IP 주소를 할당합니다.
Macvlan 모드를 사용하면 컨테이너가 호스트와 동일한 네트워크 상에서 독립적인 IP 주소를 가질 수 있으며, 호스트와 동일한 네트워크의 다른 장치와도 통신이 가능합니다. 이를 통해 컨테이너는 외부 네트워크와 직접 통신하고 호스트와 같은 수준의 네트워크 기능을 사용할 수 있습니다.
위 예제에서는 두 개의 컨테이너가 macvlan-network라는 Macvlan 네트워크에 속하게 됩니다. 각 컨테이너는 호스트와 동일한 네트워크 상에서 고유한 IP 주소를 가지며, 호스트와 다른 장치와 통신할 수 있습니다.