bxm's IT Story

Docker (#3. 도커 네트워크-Bridge, Host, Non, Container, Bridge net-alias, MacVLAN) 본문

가상화/Docker

Docker (#3. 도커 네트워크-Bridge, Host, Non, Container, Bridge net-alias, MacVLAN)

bxmsta9ram 2021. 9. 24. 15:51

## 도커 네트워크 ##

// 컨테이너의 eth0 인터페이스는 호스트의 veth... 라는 인터페이스와 연결되어 있으며, veth 인터페이스는 docker0

   브릿지와 바인딩 되어 외부와 통신할 수 있다.


Docker1]

// 컨테이너를 실행 후에 Cntl+P+Q를 통해서 나온 뒤에, ifconfig 명령어를 통해 확인해보면 아래와 같이 vethe가

   새로 생긴 것을 확인할 수 있다. (컨테이너 미 실행시에는 vethe가 나타나지 않는다.)

 

ifconfig

 

brctl show             // 이것을 통해 브릿지에 인터페이스가 물려있는 것을 확인할 수 있다.

docker network ls   // 그냥 한번 보고 넘어갔음.


## 1) 브릿지 네트워크 ##

// 기본적으로 사용하는 docker0 을 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 테트워크를 생성한 후,

   컨테이너가 사용하도록 해 보자.

 

docker network create --driver bridge mybridge

 

docker run -i -t ubuntu:14.04                // Ubuntu:14.04 이미지 다운로드

 

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

mynetwork_container 컨테이너가 새로 생성된 것을 볼 수 있다.

 

Docker1-mynetwork_container]

ping 10.0.0.1

현재 네트워크가 연결된 상태이기 때문에 Ping이 잘 가는것을 확인할 수 있다.

 

// 또 다른 터미널을 켠 상태로(컨테이너 X, CentOS 환경 O), network를 한번 끊어보자.

docker network disconnect mybridge mynetwork_container

 

// network를 다시 connect 해보자.

docker network connect mybridge mynetwork_container

 

## 사용자가 쓰고 싶은 네트워크를 지정하고 싶을때(인위적으로), 아래와 같은 옵션을 사용한다. DHCP때 생각 !!

    만약 아래의 옵션을 사용하지 않는다면, 자기가 알아서 채번해 IP를 할당하게 된다.

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

 

 

docker network inspect my_custom_network

확인까지 완료.

docker network connect, disconnect 명령어는 논 네트워크, 호스트 네트워크와 같은 특별한 모드에는 사용할 수 없다.


## 2) 호스트 네트워크 ##

// 네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.

docker run -it --name netowrk_host --net host ubuntu:14.04

호스트의 네트워크 환경에 접속한 것을 확인할 수 있다.


## 3) 논 네트워크 ##

// non은 말 그대로, 아무런 네트워크를 사용하지 않는 것을 뜻한다. 다음과 같이 컨테이너를 생성하면 외부와의 연결이

   단절된다.

docker run -itd --name network_container_1 ubuntu:14.04

 

## 'docker ps' 로 본 화면, 종료되지 않았다.

-i -t -d 옵션을 함께 사용하면, 컨테이너 내부에서 쉘을 실행하지만 내부로 들어가지 않으며 컨테이너도 종료되지 않는다. 


## 4) 컨테이너 네트워크 ## 

// 서버가 이중화되었을 경우 똑같은 IP를 사용하기 때문에 이러한 경우에 사용한다.

// --net 옵션으로 container를 입력하면, 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.

   형식은 container:[다른 컨테이너의 ID]

docker run -itd --name net_con_1 ubuntu:14.04

docker run -itd --name net_con_2 --net container:net_con_1 ubuntu:14.04

// 1번쨰 컨테이너의 IP를 복제한 것이 2번째 컨테이너임.

 

## 위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않으며, 호스트에 veth로 시작하는

    가상 네트워크 인터페이스 카드도 생성되지 않는다. 이 두 컨테이너의 네트워크 세부 사항은 동일하다.

docker exec net_con_1 ifconfig

docker exec net_con_2 ifconfig

굳이 컨테이너에 들어가지 않고, 바깥에서 이렇게 볼 수 있다. IP가 똑같은 것을 확인할 수 있다.


## 5) 브리지 네트워크와 --net-alias ## 

// 브리지 타입의 네트워크와 run 명령어의 --net-alias 옵션을 함께 쓰게 되면, 특정 호스트 이름으로 컨테이너 

   여러개에 접근할 수 있다.

 

Docker1] - bxmstakk는 ID라서 임의로 해도 되는것임.

docker network ls

 

docker run -itd --name net_bxmsta_con1 --net mybridge --net-alias bxmstakk ubuntu:14.04

docker run -itd --name net_bxmsta_con2 --net mybridge --net-alias bxmstakk ubuntu:14.04

docker run -itd --name net_bxmsta_con3 --net mybridge --net-alias bxmstakk ubuntu:14.04

 

 

 

## 이제 inspect 명령어로 각 컨테이너의 IP를 확인해본다.

Docker1]

docker start net_bxmsta_con1

docker attach net_bxmsta_con1

 

Docker1-net_bxmsta_con1]

ifconfig

172.18.0.2 를 할당받은 것을 알 수 있다.

exit

 

Docker1]

docker inspect net-alias_con1 | grep IPADDRESS

// 원래 이 명령어를 써야 한다고 하는데 안먹힘;; 아무 변동도 없음.


## 3개의 컨테이너에 접근할 컨테이너를 생성한 뒤에 bxmstakk 라는 호스트 이름으로 ping을 해보자.

docker run -i -t --name net_alias_ping --net mybridge ubuntu:14.04

 

Docker1-mybridge]

ping -c 1 bxmstakk

// 컨테이너 3개의 IP로 각각 PING이 전송된 것을 확인할 수 있다.

 

 

// 이를 확인하기 위해 dig라는 도구를 사용해보자. dig는 DNS로 도메인 이름에 대응하는 IP를 조회할 때 쓰는 도구다.

apt-get update

apt-get install dnsutils

dig bxmstakk

// 이름풀이가 잘 되는것을 확인할 수 있다!! alias로도 ping을 날릴 수 있음!!

exit

## 그렇다면, 특정 호스트 이름을 지어줄 수 도 있고 그 호스트로 접근할 수도 있는 것을 확인하였다!!


## 6) MacVLAN 네트워크 ## 

// 물리 NIC를 가상화해서 컨테이너에게 호스트 네트워크 대역의 IP주소를 제공하며, 가상 MAC 주소도 가진다. ★

// MacVLAN 네트워크를 사용하는 컨테이너는 기본적으로 호스트와 통신이 불가능하다. 

   아래 예시에서 서버1의 컨테이너는 서버2의 부속 컨테이너와 통신할 수 있지만, 정작 자신이 속한 서버와는 통신이 

   불가능하다.

// 맨 윗줄을 지운 이유는 이것이다.. T의 설명이 맞다면, 가상 랜카드를 만들어 'ifconfig' 명령을 통해 IP를 확인해보면

   호스트 IP 네트워크 대역을 받아야 하는데, 호스트가 192.168.1.101 일때, 하위 랜카드를 이용한 컨테이너의 IP가

   192.168.0.64가 되는게 말이 안된다. T도 인정한 것임!! IP 대역을 받는게 아니라, 그냥 해당 랜카드를 이용해서 

   새로운 것을 만드는 것으로 생각해야 한다.

 

 

## macvlan이라는 네트워크를 만드는데, 아래의 설정으로 만든다. - 좀 내리다보면 2개 만들거니까 여기선 X

Docker1]

docker network create -d macvlan --subnet=192.168.0.0/24 --ip-range=192.168.0.128/28 --gateway=192.168.0.1 -o macvlan_mode=bridge -o parent=ens32 my_macvlan

정상적으로 my_macvlan network 생성 완료.

-d 옵션  네트워크 드라이버로 macvlan을 사용한다는 것을 명시.
-o 옵션  말 그대로 그냥 옵션이라는 뜻.

 

 

STG]

                                                                          rm -f /var/lib/rpm/_db*                                                                               rpm -vv (w아님 브이브이 임) --rebuilddb 

yum update

yum -y install yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

yum-config-manager --add-repo https://download.docker.com/linux/centos-ce.repo

yum -y install docker-ce

설치 완료!! 에러 겁나 떴는데 3번째 명령어 추가하니까 깔렸음.


systemctl start docker

systemctl enable docker

도커를 실행시켜야지 아래의 명령어가 되는것같다. 에러가 뜬다.

 

## 네트워크 2개 생성

Docker1]

docker network create -d macvlan --subnet=192.168.0.0/24 --ip-range=192.168.0.64/28 --gateway=192.168.0.1 -o macvlan_mode=bridge -o parent=ens34 my_macvlan

// 내가 여기서 진짜 개고생했다... 하... 네트워크 만들기 전에 'ifconfig' 명령어로 192.168.1.101이 어디에 물려있는지

   확인을 했었어야됐는데 ens34인거를 ens33로 그냥 받아적어서 Ping이 안갔었음.

   현재 호스트 IP인 192.168.1.101을 받아오려고 ens34를 써준 것임!! ★★★★★★★★★★★★★★★

 

STG]

docker network create -d macvlan --subnet=192.168.0.0/24 --ip-range=192.168.0.128/28 --gateway=192.168.0.1 -o macvlan_mode=bridge -o parent=ens33 my_macvlan

// 마찬가지로 ens33인데 ens34로 써놨었음;;

 

## 컨테이너 생성

Docker1]

docker run -it --name c1 --hostname c1 --network my_macvlan ubuntu:14.04

ifconfig

 

STG]

docker run -it --name c2 --hostname c2 --network my_macvlan ubuntu:14.04

ifconfig

 

## Ping Test (자기 자신에게는 가지 않는다.)

Docker1-c1]

아래 ping 192.168.1.104 핑 보내보는 이유

ping 192.168.0.128

일단 STG로 핑이 간다.

 

ping 192.168.1.104

// 하지만 이곳으로는 Ping이 가지 않는다. 이유는 네트워크 대역이 다르기 때문이다. 내가 이것을 보여주려고

   아까 MacVLAN 설명 맨 윗줄에 형광펜으로 길~게 칠한 것임. 호스트 IP 대역을 받는 것이 아니라, 호스트의

   랜카드를 이용해서 새로운 랜카드(네트워크)를 만들고, 그것으로 컨테이너를 생성하는 것임.

 

 

STG-c2]

ping 192.168.0.64

 

ping 192.168.1.101

 

## 단, macvlan 네트워크 대역을 호스트 대역으로 바꾸면, 상대방 호스트로는 통신이 된다. 하지만 여전히

    자기 자신한테는 안된다.



## 단, macvlan 네트워크 대역을 호스트 대역으로 바꾸면, 상대방 호스트로는 통신이 된다. 하지만 여전히 자기 자신

    한테는 안된다. 그렇다면, 호스트 네트워크의 대역으로 임의로 줘보자.

 

// 기존 컨테이너와 네트워크 전부 삭제

Docker1]

docker container prune

docker network prune

docker network rm my_macvlan

 

STG]

docker container prune

docker network prune

docker network rm my_macvlan

 

 

// 네트워크 및 컨테이너 다시 만들기

Docker1]

docker network create -d macvlan --subnet=192.168.1.0/24  --ip-range=192.168.1.64/28 --gateway=192.168.1.1  -o macvlan_mode=bridge -o parent=ens34 my_macvlan

// 192.168.1 대역으로 아예 줘버렸음 ㅎㅎ 상대 호스트한테 Ping이 가는지 안가는지 확인하려고!!

 

docker run -it --name c1 --hostname c1 --network my_macvlan ubuntu:14.04

 

ifconfig

상대 호스트와의 Ping Test를 하기 위해서 1 대역을 할당했음.

 

STG]

docker network create -d macvlan --subnet=192.168.1.0/24  --ip-range=192.168.1.128/28 --gateway=192.168.1.1  -o macvlan_mode=bridge -o parent=ens33 my_macvlan

 

docker run -it --name c2 --hostname c2 --network my_macvlan ubuntu:14.04

 

ifconfig

 

 

 

// Ping 테스트

Docker1-c1]

ping 192.168.1.128

// 상대방 컨테이너로의 Ping이 잘 간다.

 

ping 192.168.1.104

// 상대방 호스트로도 역시 Ping이 잘 간다!!!!!!

 

 

## 마지막 대망의 자신의 호스트로 Ping 날려보기!! (결과는 역시 자기 자신의 호스트에게는 Ping이 가지 않는다.)

ping 192.168.1.101

 

STG-c2]

ping 192.168.1.64

// 역시 상대방 컨테이너로의 Ping이 잘 간다.

 

ping 192.168.1.101

// 상대방 호스트로도 역시 Ping이 잘 간다!!!!!

 

## 마지막 대망의 자신의 호스트로 Ping 날려보기!! (결과는 역시 자기 자신의 호스트에게는 Ping이 가지 않는다.)

ping 192.168.1.104

 

 

개고통 받았던 MacVLAN 끝... 하... 아무것도 아닌걸로 정신이 혼미해졌다. 안녕... 사요나라 ...