6장. 도커 네트워크 구조

기운찬곰·2020년 9월 1일
1

Docker

목록 보기
6/13
post-thumbnail

시작하기에 앞서서...

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)


네트워크 구조

앞서 언급한 바와 같이 도커는 IP를 172.17.0.X 형태로 순차적으로 나눠주게된다.

이 ip는 내부 ip로서 도커 컨테이너 내부에서만 쓸 수 있고, 외부와 연결될 필요가 있다. 그렇다면 어떻게 연결이 일어나는 걸까?

호스트에서 ifconfig 명령을 실행해보면 veth라고 시작하는 네트워크 인터페이스가 있다. virtual eth라는 의미인데 컨테이너가 생성 될 때 도커가 자동으로 생성해준다.

그 구조를 그림으로 살펴보면 아래와 같다.

도커 컨테이너 안에 eth0은 vethXX와 연결이 된다. 다시 vethXX들은 docker0이라는 브리지에 연결이 되고, 마지막으로 docker0은 호스트의 eth0와 연결이 되는 형태인 것이다.

docker0는 각 veth인터페이스와 바인딩돼 호스트의 eth0 인터페이스를 이어주는 역할을 한다.

도커 네트워크 기능

네트워크 드라이버로는 브리지 말고도 호스트, 논, 컨테이너 등이 있습니다.

먼저 도커에서 기본적으로 쓸수 있는 네트워크가 무엇인지 확인해봅니다. (docker network ls)

1. bridge 네트워크

docker0 브리지와는 비슷하지만 여기서는 사용자 정의 브리지를 새로 생성해 각 컨테이너와 연결하는 구조를 의미합니다.

한번 사용자 정의 브리지를 생성해보겠습니다.

$ docker network create --driver bridge mybridge

그리고 나서, mybridge로 연결하는 컨테이너를 생성해보겠습니다.

docker run -it --name mynetwork_container --net mybridge ubuntu:18.04

컨테이너 접속후, ifconfig를 통해 확인해본결과 이번에는 172.18.0.2라고 나왔습니다.

이렇게 생성된 사용자 정의 네트워크는 docker network disconnect, connect를 통해 컨테이너에 유동적으로 붙이고 뗄 수 있습니다.

$ docker network disconnect mybridge mynetwork_container
$ docker network connect mybridge mynetwork_container

추가적으로 네트워크의 서브넷, 게이트웨이, IP할당 범위를 설정하려면 docker network create 에서 옵션을 설정해주면 됩니다.

2. host 네트워크

host 네트워크는 쉽습니다. 말그대로 컨테이너에서 호스트의 네트워크 환경을 그대로 쓸 수 있습니다.

--net host 옵션을 준 컨테이너를 생성해봅니다.

$ docker run -it --name network_host --net host ubuntu:18.04

컨테이너에서 ifconfig를 해보면 host와 동일한 결과를 볼 수 있습니다. 따라서 별도 포트포워딩 없이 바로 서비스할 수 있게됩니다.

3. none 네트워크

말 그대로 아무런 네트워크를 쓰지 않는 것을 의미합니다. 외부와의 단절을 의미...

4. container 네트워크

다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있습니다. 공유되는 속성은 내부 IP, MAC주소입니다.

컨테이너 2개를 생성해주는데 network_container_2가 network_container_1의 네트워크 환경을 공유하도록 설정해줍니다.

$ docker run -it -d -- name network_container_1 ubuntu:18.04
$ docker run -it -d --name network_container_2 --net container:network_container_1 ubuntu:18.04

그 외

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

--net-alias를 alicek106이라고 설정한 컨테이너 3개를 만듭니다. 컨테이너들은 mybridge라는 위에서 만든 사용자 정의 브리지와 연결되어있는 형태입니다.

$ docker run -it -d --name network_alias_container1 --net mybridge \
--net-alias alicek106 ubuntu:18.04
$ docker run -it -d --name network_alias_container2 --net mybridge \
--net-alias alicek106 ubuntu:18.04

각 아이피는 172.18.0.X 부터 순차적으로 부여될것입니다.

network_alias_ping 이라는 컨테이너를 하나 더 만든후 이 안에서 ping을 발생시켜보겠습니다.

$ docker run -it --name network_alias_ping --net mybridge ubuntu:18.04
// apt-get install iputils-ping 설치 필요
$ ping -c 1 alicek106
$ ping -c 1 alicek106


이렇게 발생시키면 컨테이너 2개의 IP로 각각 ping이 전송되는 것을 알 수 있습니다. 매번 달라지는 IP를 결정하는 것은 별도의 알고리즘이 아닌 라운드 로빈방식입니다.

이런 결과가 나오는 이유는 도커 내장 DNS가 alicek106이라는 호스트로 요청한 컨테이너에게 IP목록을 반환해주기 때문에 일어나는 현상입니다. (도커 내장 DNS가 IP로 변환해준다는 소리)

2. MacVLAN 네트워크

호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공합니다. (그니까 도커 컨테이너에게 기본적으로 할당되는 IP대역인 172.17.X.X가 아니라 진짜 네트워크 장비의 IP를 할당받는다는 의미)

따라서 MacVLAN을 사용하는 컨테이너들과 동일한 IP대역을 사용하는 서버 및 컨테이너들은 서로 통신이 가능합니다. (단, 기본적으로 호스트와 통신은 불가능합니다)

사용법은 쓸 상황이 생길때 책을 참고 바람.

참고

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

0개의 댓글