[docker] 네트워크 & docker 0
eth 0
- container network 통신을 위한 interface
- container 생성 시 자동 생성되며 할당된다.
veth[ 컨테이너NIC식별코드 ]
- 각 container의 eth0를 바인딩하는 역할
- container 생성 시 함께 생성된다.
docker 0
- veth [n]을 호스트 interface와 연결하는 역할
- container와 Host의 bridge interface
Native Dirvers : 도커 내부 드라이버
Remote Drivers : 외부 드라이버
Bridge : docker0를 사용하는 위에 사진이 브릿지
HOST : ens32랑 직접 연결
None : 네트워크 드라이버 사용 안함
Overlay : 자주 사용하지는 않지만 여러대 묶으려면 쿠버네티스 사용
Bridge Type
# docker run -d --name myWEB1 nginx
# docker run -d --name myWEB2 nginx
nginx 이미지를 myWEB1,2의 이름으로 detached 모드(백그라운드)로 실행
# docker ps
# ifconfig
자동 생성되어있는 docker0와 veth [n]
# brctl show docker0
이더넷 브릿지 관리 명령어
docker0에 두개의 veth가 바인딩되어 있는 모습
# docker exec -it myWEB1 /bin/bash
root@706ad27b3e3c:/# apt-get update
root@706ad27b3e3c:/# apt-get install net-tools
root@706ad27b3e3c:/# ifconfig
docker exec를 이용하여 지정 된 컨테이너 내부에서 "Bash" Shell을 실행 후 호스트의 터미널창과 연결
ctrl + p + q
실행된 터미널에서 컨테이너 중지하지 않고 빠져나오기
[root@Master ~]# docker exec -it myWEB2 /bin/bash
root@b30cbce6c153:/# apt-get update
root@b30cbce6c153:/# apt-get install net-tools
root@b30cbce6c153:/# ifconfig
각 컨테이너에 eth0에 부여 된 IP주소를 확인 172.17.0.0/16 네트워크에서 순서대로 IP주소가 부여되는것을 확인 할 수 있다.
ctrl + p + q
실행된 터미널에서 컨테이너 중지하지 않고 빠져나오기
# docker rm -f $(docker ps -a -q)
다음 테스트를 위하여 Nginx 컨테이너 삭제
Custom Bridge
# docker network ls
# docker network create --driver=bridge \
> --subnet=10.1.1.0/24 \
> --ip-range=10.1.1.0/24 \
> --gateway=10.1.1.1 \
> myNet
사용자 정의 bridge Network를 생성 및 사용 서브넷을 정의
# docker network ls
#ifconfig
기본 bridge 네트워크를 자동으로 할당받아 사용하지만 사용자 정의 bridge Network를 생성하고
--net myNet 옵션을 이용하면 해당 Network를 사용하게 된다.
Port-Forwarding
# docker run -d --net myNet -p 80:80 --name myNet_nginx1 nginx
# docker run -d --net myNet -p 8080:80 --name myNet_nginx2 nginx
# docker ps
내부 컨테이너는 호스트외부에서 직접 접근이 불가능하다.
컨테이너를 외부에 공개하기위해서는 "-p" 옵션을 사용하여 호스트의 Port와 컨테이너 Port를 연결해야한다.
( Port-Forwarding )
호스트의 TCP/80번 포트 연결요청이 발생 할 경우 myNet_nginx1 컨테이너에 해당 연결요청을 Forwarding 한다.
호스트의 TCP/8080번 포트 연결요청이 발생 할 경우 myNet_nginx2 컨테이너에 해당 연결요청을 Forwarding 한다.
Net-alias
# docker run -d --net myNet --net-alias=Web --name Nginx_1 nginx
# docker run -d --net myNet --net-alias=Web --name Nginx_2 nginx
# docker run -d --net myNet --net-alias=Web --name Nginx_3 nginx
# docker run -it --net myNet --net-alias=Web --name Net_alias_test ubuntu:bionic
root@e2aefa6adab5:/# apt-get update
root@e2aefa6adab5:/# apt-get -y install dnsutils
root@e2aefa6adab5:/# dig Web
Web. 600 IN A 10.1.1.2
Web. 600 IN A 10.1.1.3
Web. 600 IN A 10.1.1.4
Web. 600 IN A 10.1.1.5
Nginx 컨테이너 3개를 생성
도커에서는 사용자 정의 Bridge 네트워크를 생성 할 경우 내장 DNS 서버를 함께 구성한다.
함께 구성 된 내장 DNS 서버의 IP주소는 "127.0.0.11"을 사용하게 되며 각 컨테이너의 네트워크 영역을 저장한다.
--net-alias 옵션을 사용하여 생성 된 컨테이너는 컨테이너의 IP주소 함께 지정 된 네트워크 영역 이름을 내장 DNS서버에 등록한다.
동일 사용자 정의 Bridge와 동일 영역이름으로 여러 개의 컨테이너를 구동 할 경우 하나 영역이름으로 여러개의 컨테이너 정보가 등록된다.
하나의 이름으로 여러개의 컨테이너 정보가 등록되어있을 경우 DNS Round-Robin 작업이 수행된다.
컨테이너는 일회성이며 재 시작등의 이유로 IP주소 정보등이 자주변경된다.
--net-alias 옵션을 이용하여 각 컨테이너 IP를 이름구조아래 통합하여 운영할 경우 변경정보를 빠르게 수용하고 운영의 안정성을 확보할 수 있다.
Ubuntu 컨테이너를 생성 후 dig 명령을 이용하여 네트워크 이름 Web 지정 후 결과를 확인한다.
현재 동일한 Net-Alias에 속해있는 Container의 IP주소 목록이 조회되는것을 확인 할 수 있다.