2020. 1. 22. 20:29ㆍdevops/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 |