탕구리's 블로그

Docker network는 어떻게 구성되어 있을까? 본문

devOps

Docker network는 어떻게 구성되어 있을까?

탕구리당 2020. 4. 15. 18:40
반응형

 

지난 글에서 Docker를 통해 Tomcat과 Redis를 구동하기 위해했던 작업 과정을 정리했었어요. 내용을 정리해놓은 링크는 글 맨 아래에 링크 걸어둘 테니 궁금하신 분들은 한번 들려주세요!

 

이번엔 두개의 컨테이너가 데이터를 주고받아야 하기 때문에 네트워크가 가능한 상태가 되어야 합니다. 그러기 위해서는 도커에서 사용하는 네트워크 구조에 대해서 어느 정도의 이해가 필요하기 때문에 도커의 네트워크 구조는 어떻게 이루어져 있는지 내용을 정리하는 시간을 갖도록 할게요~!

 

도커 네트워크의 구성

 

처음 도커를 설치하고 데몬은 구동하게 되면 docker0이라는 네트워크 인터페이스가 생성됩니다. 이는 기본적으로 도커에서 사용하는 가상의 네트워크 인터페이스입니다.

 

도커 데몬 구동시 도커 내부 로직에 의하여 172.17.0.1을 할당받고 255.255.0.0의 서브넷 마스크를 사용합니다.

 

docker0의 네트워크 상태를 확인해봅시다.(현재 어떤 컨테이너도 구동되어 있지 않은 상태이다)

 

컨테이너가 구동되면 도커의 namespace 정책을 통해 별도의 공간을 할당 받고 해당 namespace는 통신을 위해 eth0 네트워크 인터페이스를 할당받습니다. 도커에서는 격리된 컨테이너의 namespace와 네트워킹을 진행하기 위해서 veth를 생성합니다. 

 

도커에서는 컨테이너와의 통신을 위해 veth 방식을 사용하고 있으며, veth network 방식을 통해 두 개의 네트워크 인터페이스가 한 쌍(pair)을 이루고 direct한 통신을 이루게 됩니다.

 

컨테이너가 생성되면 도커는 vethxxxx의 가상의 인터페이스를 생성하고 컨테이너 namespace의 eth0과 한 쌍을 이루어 네트워킹을 진행하게 되며. veth는 docker0 사이에도 연결이 이루어져 하나의 네트워크를 구성하게 됩니다.

 

컨테이너를 하나 구동하게 되면 docker0 인터페이스에 vethxxxx의 네트워크 인터페이스가 하나 attatch 된 것을 확인 가능합니다.

정리해보면 container(eth0) -> vethxxxx -> docker0 같은 네트워크 연결 구조를 갖추게 됩니다. 외부로의 네트워크 또한 docker0을 gateway삼아 진행되게 됩니다.

 

 

외부에서 들어온 요청은 어떻게 container에 전달될까?

 

외부에서 도커 호스트로 요청이 들어온 경우는 어떻게 컨테이너에 전달될까요? 과정은 그리 복잡하지 않습니다. 컨테이너의 포트가 외부로 노출이 이루어져 있다는 가정하에 한번 알아봅시다.

 

1. 도커 컨테이너를 구동시키며 포트를 외부에 노출합니다. => docker run -d -p 6379:6379 --name=test redis

2. 외부로부터 도커 호스트에 요청이 발생합니다. => curl dockerhost:6379

3. 도커 호스트는 받은 요청을 컨테이너로 전달해주기 위해 기존에 구성되어 있던 iptable을 확인합니다.

4. 대상 컨테이너가 확인이 되면 docker proxy에 의해 컨테이너로 요청이 forwarding 됩니다. 

 

위의 과정을 통해 외부로부터 발생된 요청이 목적지인 컨테이너에 도착하게 됩니다. 

 

 

도커의 네트워크 종류

 

도커의 네트워크는 총 4가지(bridge, host, container, none)의 방식이 있습니다. 네트워크 모드의 default 구성은 bridge 방식이며 위에서 살펴본 방식이 bridge 구성에 해당됩니다.

 

bridge 모드

bridge 모드는 docker0 네트워크를 bridge 삼아 구성되는 네트워크 구조입니다. 컨테이너가 생성되는 경우 각각의 namespace를 할당받고 각각의 독립된 namespace의 네트워크 인터페이스가 docker0에 연결되어 네트워크가 이루어지게 됩니다.

 

host 모드

host 모드의 경우 생성되는 컨테이너가 별도의 네트워크 인터페이스를 생성하지 않고 docker host와 네트워크를 공동으로 사용하게 됩니다.

 

container 모드

container 간의 공통된 네트워크 인터페이스를 사용하는 방식입니다. 우리는 컨테이너를 생성하는 경우 해당 컨테이너의 namespace의 네트워크 인터페이스가 docker0에 attach 되어 네트워크가 구성되는 것을 확인할 수 있었습니다. container network를 사용하는 경우 컨테이너를 생성하여도 별도의 네트워크 인터페이스가 생성되지 않습니다. 

 

docker run --name test2  --net=container:<test1 containerID> -d redis

 

none 모드

none 모드의 경우 컨테이너 구동 시 네트워크 인터페이스에 대한 작업이 이루어지지 않고, 해당 컨테이너의 namesapce에는 network interface가 존재하지 않는다. 즉, 외부와의 통신이 완벽하게 격리된 상태이며 외부와의 통신을 위해서는 네트워크 인터페이스를 직접 구성하여 사용하여야 한다.

 

 

이렇게 간략하게 도커 네트워크가 어떻게 구성되고 어떤 종류가 있는지, 외부로 부터 발생한 요청이 컨테이너에 도달하는지 알아보았습니다. 자세하게 알아보지는 않았지만 도커 네트워크에 대한 개념을 잡기 위해 정리한 내용이니 자세한 부분이 궁금하시다면 공식 도큐먼트를 참고해보시는 것도 좋을 것 같습니다. 

 

 

 

1편 : Docker로 Tomcat 사용하기

 

Docker로 Tomcat 사용하기

Docker로 Tomcat을 사용하자 서버 환경을 재구축하는 작업을 진행하며 겸사겸사 컨테이너 환경 운영에 대해서도 고려해보던 중 사용할 수 있을진 모르겠지만 한번 환경을 만들어보고 운영에 대해 시뮬레이션해보기..

real-dongsoo7.tistory.com

2편 : Docker로 Redis 사용하기

 

Docker로 Redis 사용하기(feat. 삽질)

오늘의 내용은 레디스를 테스트하며 도커로 컨테이너를 띄우는 작업을 진행하며 겪었던 삽질에 대해서 적어보려 한다. (생각만 해도 벌써 짜증이 밀려온다) 하려고 했던 작업의 과정은 아래와 같다. 1. 기존에 사..

real-dongsoo7.tistory.com

반응형

'devOps' 카테고리의 다른 글

[Kubernetes] #3 파드(pod) 설정 및 사용하기  (0) 2020.05.22
nginx 인증 모듈 연동하기(with LDAP)  (0) 2020.05.01
Docker Daemon Log  (0) 2020.04.09
Docker로 Redis 사용하기(feat. 삽질)  (0) 2020.04.07
Docker로 Tomcat 사용하기  (0) 2020.03.20
Comments