docker 네트워크

2020. 1. 22. 20:29devops/docker

docker 네트워크 

docker에서 컨테이너를 만든 다음 자동으로 내부에서 사용할 수 있는 ip가 할당된다. 172.17.0.2부터 차례대로 순차적으로 배치된다. 이 값은 재시작할 때 마다 다르게 배치된다. 

container가 생성될 때 마다 외부와의 네트워크 연결을 위해 호스트에서는 자동으로 veth라는 네트워크 인터페이스가 생성된다. veth는 도커가 자동으로 생성된다. veth는 자동으로 docker0라는 브리지와 바인딩돼 외부와 통신할 수 있습니다. 

 

컨테이너가 생성되면 자동으로 docker0브릿지와 연결되지만 자체적으로 제공하는 네트워크 드라이브를 선택하여 사용할 수 있다. 

네트워크 드라이브로는 bridge, host, none, container, overlay등이 있다. 기본적으로 사용할 수 있는 네트워크를 확인하기위해 

 

docker network ls                                                                                                                                                                                                   ✔  9322  19:51:13
NETWORK ID          NAME                DRIVER              SCOPE
b39c0db7df8c        backend_default     bridge              local
511e50155a8f        bridge              bridge              local
6484a4c7768e        ecommerce_default   bridge              local
7acae709d5c7        host                host                local
03f7d747bca3        none                null                local

이미 브리지 및 호스트, null이 있음을 알 수 있다. 

 

브리지 네트워크 

새로 생성해 각 컨테이너에 연결하는 네트워크 구조입니다. 컨테이너는 연결된 브리지를 통해 외부와 연결할 수 있다. 

docker network create --driver bridge mybridge // 새로운 bridge 생성
docker run -i -t --name network-ubuntu --net mybridge

network create를 통해서 새로운 bridge를 만들 수 있고 컨테이너를 생성할 때는 --net을 사용하여 brideg를 선택할 수 있습니다. docker0와는 전혀 다른 ip가 할당된 것을 알 수 있습니다.

이렇게 생성된 네트워크는 disconnect, connect를 통해 컨테이너에 붙였다 뗐다가 선택할 수 있습니다. 

docker network disconnect mybridge ubuntu-network                                                                                                                                                                   ✔  9329  20:08:08
docker network connect mybridge ubuntu-network

단 null이랑 호스트 네트워크에서는 사용할 수 없습니다. 또한 ip주소, 서브넷, 게이트웨이 등을 임의로 설정하기위해서는 --subnet, --ip-range,  --gateway를 사용하면 됩니다. 

docker network create --driver bridge \                                                                                                                                                                             ✔  9331  20:08:44
--subnet=172.72.0.0/16 \
--ip-range=172.72.0.0/24 \
--gateway=172.72.0.1 \
my_custom_network

호스트 네트워크

네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 사용할 수 있습니다. 위의 브릿지 네트워크와 달리 별도로 생성할 필요 없습니다. 

docker run -i -t --name ubuntu-host ubuntu:14.04 \
--net host

컨테이너를 실행 후 ifconfig로 확인해보면 host의 ifconfig와 동일한 값이 나오는 것을 확인할 수 있습니다. 호스트 네트워크로 만들어주면 -p  옵션 포트포워딩 없이 바로 서비스할 수 있습니다. 

 

논네트워크 

none 말그대로 아무 네트워크를 사용하지 않는다는 의미입니다. 

docker run -i -t --name network_none \
--net none \
ubuntu:14.04

ifconfig로 확인하면 아래와 같이 local환경만 있는 것을 확인할 수 있다. 

 

컨테이너 네트워크 

--net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있습니다. 공유되는 속성은 내부 IP, 네트워크 인터페이스의 MAC 주소등입니다. 

 

사용법

--net container:[공유받을 컨테이너 이름 및 id]
docker run -i -t -d \
--name ubuntu_network_1 \
ubuntu:14.04

docker run -i -t -d \
--name ubuntu_network_2 \
--net container:ubuntu_network_1 \
ubuntu:14.04

docker exec ubuntu_network_1 ifconfig
docker exec ubuntu_network_2 ifconfig

위와 같이 실행한 후 마지막 명령어를 실행해주면 아래와 같이 공유된 ip및 mac주소 결과를 확인할 수 있습니다. 

 

브리지 네트워크와 --net-alias

--net-alias 옵션을 함께쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있습니다. bridge네트워크 mybridge를 새롭게 만들어서 진행해보겠습니다. 

docker network create --driver bridge mybridge

docker run -i -t -d --name network_alias_container1 \
--net mybridge \
--net-alias hoonyk ubuntu:14.04

docker run -i -t -d --name network_alias_container2 \
--net mybridge \
--net-alias hoonyk ubuntu:14.04

docker run -i -t -d --name network_alias_container3 \
--net mybridge \
--net-alias hoonyk ubuntu:14.04

위와 같은 경우에는 hoonyk라는 이름으로 세개의 컨테이너에 접근할 수 있습니다. 

docker run -i -t \
--name network_alias \
--net mybridge \
ubuntu:14.04

새로운 컨테이너를 만든 다음 ping을 보내 확인해보겠습니다. ping을 통해 초기에 기록되는 172.20.0.3, 172.20.0.4, 172.20.0.5등에 접근할 수 있습니다. ping마다 매번 다른 결과가 나오는 것은 세개의 컨테이너가 라운드로빈 알고리즘 방식이기 때문입니다. 라운드로빈(프로세스들 사이에 우선순위를 두지 않고 순서대로 시간단위로 CPU를 할당하는 방법입니다.)

이렇게 alias를 사용하여 ip를 확인할 수 있는 이유는 docker 내부의 dns서버 덕분입니다. dns는 호스트의 이름을 유동적인 컨테이너를 찾을 때 주로 사용됩니다. 별명을 통해 ip주소를 찾는 것은 --net-alias 뿐만 아니라 --link도 비슷한 원리를 갖고 있습니다. 도커는 사용자가 정의한 브리지 네트워크에 사용되는 내장 DNS 서버를 가집니다. DNS의 IP는 127.0.0.11입니다. --net-alias 옵션에 hoonyk라는 브릿지가 생성되면 dns에 hoonyk라는 호스트 이름이 등록됩니다.

브릿지에 연결된 container의 정보를 확인하기 위해 ubuntu에 dnsutils를 설치하여 확인해보겠습니다.

apt-get update
apt-get install dnsutils

dig hoonyk

위의 사진과 같이 hoonyk 브릿지에 연결된 컨테이너의 ip를 확인할 수 있습니다. 

 

'devops > docker' 카테고리의 다른 글

docker 컨테이너 자원 할당 제한  (0) 2020.01.29
docker 컨테이너 log 남기기  (0) 2020.01.26
container를 외부에 노출하기  (0) 2020.01.22
docker 컨테이너 사용해보기  (0) 2020.01.21
docker image, container  (0) 2020.01.20