bxm's IT Story
Docker (#3. 도커 네트워크-Bridge, Host, Non, Container, Bridge net-alias, MacVLAN) 본문
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
Docker1-mynetwork_container]
ping 10.0.0.1
// 또 다른 터미널을 켠 상태로(컨테이너 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' 로 본 화면, 종료되지 않았다.
## 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
## 위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않으며, 호스트에 veth로 시작하는
가상 네트워크 인터페이스 카드도 생성되지 않는다. 이 두 컨테이너의 네트워크 세부 사항은 동일하다.
docker exec net_con_1 ifconfig
docker exec net_con_2 ifconfig
## 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
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
// 이를 확인하기 위해 dig라는 도구를 사용해보자. dig는 DNS로 도메인 이름에 대응하는 IP를 조회할 때 쓰는 도구다.
apt-get update
apt-get install dnsutils
dig bxmstakk
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
STG]
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
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.0.128
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
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 192.168.1.104
## 마지막 대망의 자신의 호스트로 Ping 날려보기!! (결과는 역시 자기 자신의 호스트에게는 Ping이 가지 않는다.)
ping 192.168.1.101
STG-c2]
ping 192.168.1.64
ping 192.168.1.101
## 마지막 대망의 자신의 호스트로 Ping 날려보기!! (결과는 역시 자기 자신의 호스트에게는 Ping이 가지 않는다.)
ping 192.168.1.104
개고통 받았던 MacVLAN 끝... 하... 아무것도 아닌걸로 정신이 혼미해졌다. 안녕... 사요나라 ...


'가상화 > Docker' 카테고리의 다른 글
Docker (#6. 도커 사설 레지스트리, 도커 파일) (0) | 2021.09.28 |
---|---|
Docker (#5. 도커 이미지, 도커 허브, 도커 파일) (0) | 2021.09.28 |
Docker (#4. 컨테이너 로깅, 컨테이너 자원 할당) (0) | 2021.09.27 |
Docker (#2-wordpress, Docker Volume) (0) | 2021.09.23 |
Docker (#1. 개념, 기본 설치) (0) | 2021.09.14 |