[파이썬] 도커 컨테이너와 호스트 간 네트워크 설정

도커 컨테이너는 가상 네트워크 인터페이스를 할당받아 호스트와 통신할 수 있습니다. 이를 통해 여러 개의 컨테이너가 동일한 호스트에서 실행되어도 각각 독립적인 네트워크 환경을 가질 수 있습니다. 이렇게 하면 호스트와 컨테이너 간에 발생할 수 있는 네트워크 충돌을 피할 수 있고, 애플리케이션 간에 안전하게 통신할 수 있습니다.

Docker는 기본적으로 “bridge” 네트워크 드라이버를 사용하여 컨테이너를 호스트와 연결합니다. 그러나 “bridge” 네트워크 드라이버는 기본적으로 내부적으로 NAT(Network Address Translation)을 사용하여 컨테이너를 호스트와 연결하므로, 컨테이너 외부에서 호스트의 IP 주소로 직접 접근하는 것이 어렵습니다.

따라서, 컨테이너가 호스트와 동일한 네트워크에 위치하고 있는 경우, 컨테이너가 호스트의 IP 주소를 사용하여 외부와 통신할 수 있습니다. 이를 위해 도커에서는 “host” 네트워크 모드를 제공합니다. “host” 네트워크 모드를 사용하면 컨테이너의 네트워크 인터페이스를 호스트와 동일한 네트워크에 연결할 수 있습니다.

Python을 사용하여 도커 컨테이너와 호스트 간의 네트워크 설정을 구현해보겠습니다. 예제 코드는 다음과 같습니다.

import docker

client = docker.from_env()

# 호스트와 동일한 네트워크 설정을 가진 컨테이너 실행
container = client.containers.run('ubuntu', detach=True, network_mode='host')

# 컨테이너에 명령 실행
output = container.exec_run('hostname')
print(output.output.decode())

# 컨테이너 종료
container.stop()

이 예제 코드에서는 docker 모듈을 사용하여 도커와 상호 작용합니다. docker.from_env() 함수를 사용하여 도커 클라이언트 객체를 생성하고, client.containers.run() 메서드를 사용하여 ubuntu 이미지를 실행합니다. detach=True로 설정하여 컨테이너를 백그라운드에서 실행하고, network_mode='host'로 설정하여 호스트와 동일한 네트워크에 연결합니다.

그 후, container.exec_run() 메서드를 사용하여 컨테이너 내부에서 hostname 명령을 실행하고, 결과를 출력합니다. 마지막으로, container.stop() 메서드를 사용하여 컨테이너를 종료합니다.

이 예제 코드를 실행하면, 호스트와 동일한 네트워크에 위치한 컨테이너가 실행되고, 컨테이너 내부에서 hostname 명령을 실행한 결과를 출력할 수 있습니다.

이처럼, 도커 컨테이너와 호스트 간의 네트워크 설정은 도커의 다양한 네트워크 모드를 활용하여 구현할 수 있습니다. 애플리케이션의 요구사항에 맞게 적절한 네트워크 모드를 선택하여 사용하는 것이 중요합니다.