도커 스터디 3일차(도커 네트워크 등)

MINK·2023년 3월 22일
0

Docker

목록 보기
3/5

2.2.7 도커 네트워크

2.2.7.1 도커 네트워크 구조

  • veth에서 v는 virtual을 뜻
# 이전에 컨테이너 내부에서 ifconfig을 입력해서 네트워크 인터페이스에 eth()과 lo네트워크 인테페이스 확인
# 도커는 컨테이너에 내부 IP를 순차적으로 할당. <컨테이너 재시작시 IP변경될  있음>
# 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결 필요
# 외부와 연결되는 과정은 컨테이너를 시작할 때마다 호스트에 veth...라는 네트워크 인테페이스 생성 - veth(virtual eth)
# 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성
# veth 인터페이스는 사용자가 직접 생성할 필요가 없음.
# 컨테이너가 생성될 때 도커 엔진이 자동적으로 생성
root@fb69f29cc62d:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          #inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
  • 여기서 설명한 네트워크 구성은 리눅스를 기준. 윈도우라면 ipconfig를 입력
# 출력 결과에서 eth()은 공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있음
# veth로 시작하는 인터페이스는 컨테이너를 시작할 때 생성
# veth 인터페이스뿐 아니라 docker()이라는 브리지도 존재함
# docker() 브리지는 각 veth 인테페이스와 바인딩돼 호스트의 eth() 인터페이스와 이어주는 역할
PS C:\Users\Playdata> ipconfig

Windows IP 구성
이더넷 어댑터 이더넷:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김
   연결별 DNS 접미사. . . . : skbroadband

이더넷 어댑터 vEthernet (Default Switch):

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : fe80::90d9:1319:fe04:230c%46
   ...
   무선 LAN 어댑터 Wi-Fi:

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : fe80::6954:225c:b760:acb2%7
   IPv4 주소 . . . . . . . . . : 172.30.1.53
   서브넷 마스크 . . . . . . . : 255.255.255.0
   기본 게이트웨이 . . . . . . : 172.30.1.254
  

  • 정리하면 컨테이너의 eth() 인터페이스는 호스트의 veth..라는 인터페이스와 연결됐으며 veth 인터페이스는 docker() 브리지와 바인딩돼 외부와 통신

2.2.7.2 도커 네트워크 기능

  • 컨테이너를 생성하면 기본적으로 docker() 브리지를 통해 외부와 통신할 수 있는 환경 구축
  • 사용자의 선택에따라 여러 네트워크 드라이버를 쓸 수 있음.
  • 대표적인 네트워크 드라이버 ['브리지(Bridge)', '호스트(Host)', '논(None)', '컨테이너(Container)', '오버레이(Overlay)' ]
  • 서드파티(Third-Party) 플러그인 솔루션으로는 weave, flannel, openvswitch 등이 있음
# 도커에서 기본적으로 쓸 수 있는 네트워크
# 도커의 네트워크를 다루는 명령어 = docker network로 시작
# 이미 브리지, 호스트, 논 네트워크가 있음
PS C:\Users\Playdata> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
58168758ef4c   bridge    bridge    local
d1bdbbbd8c75   host      host      local
9835d3434648   none      null      local

# docker network inspect 명령어를 이용하면 네트워크의 자세한 정보를 살펴볼 수 있음
# docker inspect --type network를 사용해도 동일한 출력 가능
PS C:\Users\Playdata> docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "58168758ef4caa81770bbb1529c7bdb2922bd70f2b7a4719940ce7e462fe8951",
        ...

  • 브리지 네트워크
# 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조
# 기본적으로 존재하는 docker()을 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 네트워크 생성
# 브리지 타입의 mybridge 네트워크 생성
PS C:\Users\Playdata> docker network create --driver bridge mybridge
c67469460b1e925ae418e4c86b9ccb3ef26015f3bb022b1464fb6ea3951a7718

# docker run 또는 create 명령어에 --net 옵션의 값을 설정
# 컨테이너가 이 네트워크를 사용하도록 설정
# ifconfig을 입력하면 새로운 IP 대역이 할당된 것을 확인
PS C:\Users\Playdata> docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
root@dc7ab97316b8:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          ..
          
# docker network disconnet, connect를 통해 컨테이너에 유동적으로 붙이고 뗄 수 있음 
PS C:\Users\Playdata> docker network disconnect mybridge mynetwork_container
PS C:\Users\Playdata> docker network connect mybridge mynetwork_container

# 네트워크의 서브넷, 게이트웨이, IP할당범위 등을 임의로 설정하려면 네트워크를 생성할 때 아래와 같이 임의로 설정
# --subnet, --ip-range, --gateway 옵션을 추가
# 단 --subnet과 --ip-range는 같은 대역
PS C:\Users\Playdata> docker network create --driver=bridge --subnet=172.72.0.0/16 --ip-range=172.72.0.0/24 --gateway=172.72.0.1 my_custom_network
4d037714f210f3931bd683119379d1e980bbda969fe074a5bcf5fa87d5ed7475
  • 호스트 네트워크
    • 네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 사용
    • 네트워크를 별도로 생성할 필요 없이 기존의 host라는 이름의 네트워크를 사용
    • --net 옵션을 입력해 설정한 컨테이너의 내부에서 네트워크 환경을 확인하면 호스트와 같은 것
    • 컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 바로 서비스할 수 있음
    • 실제 호스트에서 애플리케이션을 외부에 노출하는 것
PS C:\Users\Playdata> docker run -i -t --name network_host --net host ubuntu:14.04
root@docker-desktop:/# echo "inner containenr"
inner containenr
root@docker-desktop:/# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:6a:3f:50:6e
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:6aff:fe3f:506e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:526 (526.0 B)

eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01
          inet addr:192.168.65.3  Bcast:192.168.65.255  Mask:255.255.255.0
          inet6 addr: fe80::50:ff:fe00:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:1286 (1.2 KB)
          ....

# 컨테이너의 네트워크를 호스트 모드로 설정
# 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 이용가능
  • 논 네트워크
# none은 말 그대로 아무런 네트워크를 쓰지 않는 것
# 다음과 같이 컨테이너 생성 시 외부와 연결이 단절
# --net 옵션으로 none을 설정한 컨테이너 내부에서 네트워크 인터페이스를 확인하면
# 로컬호스트를 나타내는 lo 외에는 존재하지 않는 것을 알 수 있음
PS C:\Users\Playdata> docker run -i -t --name network_none --net none ubuntu:14.04
root@845e4de19963:/# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
  • 컨테이너 네트워크
PS C:\Users\Playdata> docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:14.04
90aeb47f66f5845c528e2c27c2dcfd56eda4debc00b1d782d5afc470901ed7b3
  • --net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 환경을 공유

  • 공유되는 속성은 내부 IP, 네트워크 인터페이스의 맥(MAC) 주소 등

  • --net 옵션의 값으로 container:[다른 컨테이너 ID]와 같이 입력

  • -i, -t, -d 옵션을 함께 사용하면 컨테이너 내부에서 셸을 실행하지만 내부로 들어가지 않으며 컨테이너도 종료되지 않는다. 위와 같이 테스트용으로 컨테이너를 생성할 때 유용하게 씀

  • 위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않음

  • 호스트에 veth로 시작하는 가상 네트워크 인터페이스로 생성되지 않음

  • network_container_2 컨테이너의 네트워크와 관련된 사항은 전부 network_container_1과 같게 설정

# 두 컨테이너의 eth() 정보 동일. 
PS C:\Users\Playdata> docker exec network_container_1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1076 (1.0 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

PS C:\Users\Playdata> docker exec network_container_2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1076 (1.0 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

profile
parkminkyu velog

0개의 댓글