[Docker] Docker 컨테이너 네트워크

Fabro·2021년 9월 16일
0
post-thumbnail

Docker 컨테이너 네트워크

Docker 컨테이너 Network

Docker 컨테이너끼리 통신할 때는 Docker Network를 통해 수행하고 'docker network ls' 명령으로 Docker 네트워크 목록을 확인할 수 있다.
기본적으로 bridge, host, none 네트워크가 있다.

docker network ls 명령

docker network ls [옵션]


지정할 수 있는 주요 옵션
옵션설명
-f, --filter=[]출력을 필터링
--no-trunc상세 정보 출력
-q, --quiet네트워크 ID만 표시

필터링에서 이용할 수 있는 키
설명
driver드라이버 지정
id네트워크 ID
label네트워크에 설정된 라벨
name네트워크명
scope네트워크의 스코프
type네트워크의 타입

# 네트워크 드라이버가 bridge인 네트워크의 네트워크 ID를 출력
docker network ls -q --filter=bridge

컨테이너 네트워크 확인하기(docker container inspect)

# 컨테이너 실행
docker run --name test -dit centos:latest

# docker container inspect로 네트워크 확인
docker container inspect test

'docker container inspect'에서 NetworkSettings 외에도 여러가지 설정을 볼 수 있다.


호스트에서 컨테이너 네트워크 확인하기

  • docker0은 bridge의 역할을 한다. veth는 veth를 할당받은 컨테이너들 내부적으로 IP 설정한 것

백그라운드에 nginx를 실행시키고 test와 통신해보기

# 컨테이너 실행
docker run --name webserver -d nginx:latest

#IP 확인
docker container inspect | grep IP

# test 컨테이너로 접속해서 nginx와 통신해보자
docker attach test
curl 172.17.0.4

  • 같은 bridge 네트워크에 넣어도 상관없지만, 서로 다른 서비스를 같은 bridge에 두게되면 보안에 좋지 않다!

이렇게 bridge를 만들어 네트워크를 만들어 줄 수도 있다.



새로운 네트워크 작성(docker network create)

docker network create 명령

docker network create [옵션] 네트워크

지정할 수 있는 주요 옵션
옵션설명
--driver, -d네트워크 브리지 또는 오버레이(기본값은 bridge)
--ip-range컨테이너에 할당하는 IP 주소의 범위를 지정
--subnet서브넷을 CIDR 형식으로 지정
--ipv6IPv6 네트워크 유효화 여부(true/false)
-label네트워크에 설정하는 라벨

'web-network'만들기

# web-network 생성
docker network create --driver birdge web-network

docker network inspect web-network | grep Subnet

서브넷 자동으로 지정됨

호스트에서 birdge 생성 확인

ip addr show 로 확인하면

서브넷, 게이트웨이 지정해서 만들기(bridge)

docker network create --driver bridge --subnet 172.72.0.0/16 --gateway 172.72.0.1 mybridge 

호스트에서 확인

ip addr show 로 확인하면
호스트에 네트워크 정보를 공유하는 형태로 쓴다.




컨테이너의 네트워크 설정(docker container run)

docker container run 명령

docker container run [네트워크 옵션] 이미지명[:태그명] [인수]

지정할 수 있는 주요 옵션
옵션설명
-add-host=[호스트명:IP 주소]컨테이너의 /etc/hosts에 호스트명과 IP주소를 정의
--dns=[IP주소]컨테이너용 DNS 서버의 IP 주소 지정
--expose지정한 범위의 포트 번호를 할당
--mac-address=[MAC 주소]컨테이너의 MAC 주소를 지정
--net=[bridge | none | container:<name | id> | host | NETWORK]컨테이너의 네트워크를 지정
--hostname, -h컨테이너 자신의 호스트명을 지정
--publish, -p[호스트의 포트번호]:[컨테이너의 포트 번호]호스트와 컨테이너의 포트 매핑
--publish-all, -P호스트의 임의의 포트를 컨테이너에 할당
--link컨테이너끼리 연결


컨테이너 네트워크 지정하기(mybridge)

# 컨테이너 생성 (네트워크 지정 : mybridge)
docker container run -dit --name test2 --network mybridge centos:latest

# IP 주소 확인
docker container inspect test2 | grep IPAddress

172.72.0.2의 IP 주소는 설정한 서브넷에서 할당 되었다.

Docker host 네트워크 사용하기

docker run -it --name test3 --network host centos:latest
--network host 옵션을 이용해서 호스트 IP 정보 그대로 공유하는게 가능하다.

nginx를 host 네트워크로 실행

  • localhost로 접속해도 작동하는 걸 확인
  • 호스트 네트워크로 실행 = 호스트 네트워크의 포트를 열고 있다.
  • 호스트의 80번 포트로 연결

이런 식이지만 충돌이 발생 가능하고 충돌 방지도 어렵다.

None 네트워크로 컨테이너 생성

None 그대로 네트워크가 없으며 루프백만 존재한다.

macvlan 네트워크

  • 컨테이너의 MAC 주소를 사용하여 호스트가 사용중인 네트워크에 연결하는 방식
  • Docker daemon이 트래픽을 컨테이너의 MAC 주소로 라우팅
  • 컨테이너가 Docker내부의 가상 bridge가 아닌 실제 네트워크에 직접 연결하여야 할 때 사용
  • macvlan이 직접 연결할 네트워크에 연결되어 있는 호스트의 NIC에 Promiscuous mode가 설정되어야 함
  • Promoscuous mode가 설정되어 있지 않을 경우, 컨테이너의 MAC 주소가 목적지로 되어 있는 패킷이 Docker 호스트의 인터페이스로 전달되더라도 패킷을 컨테이너로 전달하지 않아 통신이 정상적으로 이루어지지 않음


호스트에서 promisc 모드 설정(VMware)

macvlan 네트워크 만들기

# macvlan 생성
docker network create --driver macvlan\
		      --subnet 172.16.67.0/24\
                      --ip-range 172.16.67.64/26\
                      --gateway 172.16.67.1\
                      -o parent=ens33 macvlantest

컨테이너 2개 생성(macvlan)

# 백그라운드 1개
docker container run -dit --rm --name m1 --network macvlantest centos:latest

# IP 주소 확인
docker container inspect m1 | grep IPAddress

# 포그라운드 1개
docker container run -it --rm --name m2 --network macvlantest centos:latest

  • ping 172.16.67.64(m1)과 잘 통신됨
  • ping 8.8.8.8(구글) 외부 통신도 잘 된다
  • VMware 에서 실습했습니다. VirtualBox는 ping 8.8.8.8 불가능

References

profile
엔지니어 유망주의 곡괭이질

0개의 댓글