본문 바로가기
Data Engineering/docker, kubernetes(k8s)

도커 네트워크 종류(bridge, host, container, none)와 통신상태 확인 (port, ping) 방법

by EverReal 2024. 12. 15.

 

도커 네트워크 종류(bridge, host, container, none)와 통신상태 확인 (port, ping) 방법

 

 

지난번 포스팅(아래 참고)에서 도커 네트워크에 대한 설명이 부족한 듯해서

도커 네트워크에 대해서 조금 더 적어보려 합니다.

 

도커 네트워크와 컨테이너 포트 포워딩 기본 개념

Docker Container Port-Forwarding  도커 컨테이너 실행시명령어는 주로 아래와 같은 form으로 사용중이었습니다.docker run --name nginx -p 8000:80 -d nginx 그런데 문제는 네트워크 지식이 부족해서인지항상 포

ggommappooh.tistory.com

 


 

도커 네트워크는 

 - 브릿지 모드(default)

 - 호스트 모드

 - 컨테이너 모드

로 구분되며 보통은 브릿지 모드를 자주 사용합니다.

 

1. 브릿지 모드


도커에서는 기본적으로 docker0이라는 네트워크 인터페이스가 생성되어,

컨테이너들을 통신하기 위한 가상 Linux bridge역할을 합니다. 

이는 bridge 네트워크 내(컨테이너간)/외(외부 호스트)간 원활한 통신을 가능케 합니다.

 

아래 명령어를 통해 도커 bridge에 대한 정보 확인이 가능합니다.

docker network inspect bridge

 

 

 

도커 브릿지 네트워크를 이용하면, 컨테이너간 통신이 가능하다고 위에서 설명했습니다.

 

이를 테스트하기 위해 아래와 같이 nginx와 mysql 도커 컨테이너를 각각 생성하였습니다.

 

컨테이너 간 네트워크 통신상태 확인을 위해 아래 명령어를 실행하였습니다.

# db 컨테이너 접속
docker exec -it db /bin/bash

# db 컨테이너 접속 후
apt-get update
apt-get install -y net-tools
apt-get install -y iputils-ping


# nginx 컨테이너 접속
docker exec -it nginx /bin/bash

# nginx 컨테이너 접속 후
apt-get update
apt-get install -y net-tools
apt-get install -y iputils-ping

 

보통 컨테이너가 생성되면 

172.17.0.2, 172.17.0.3, .... 순서로 생성되는 것으로 알고 있었습니다.

두 컨테이너가 모두 잘 생성되었고, db 컨테이너부터 생성했기 때문에

 

각 컨테이너의 ip는

 - db : 172.17.0.2

 - nginx : 172.17.0.3

일 것 입니다.

 

하지만, 다른 컨테이너가 있는 경우를 위해

확인을 위해서는 아래 명령어를 실행시켜서 각각 확인해볼 수 있습니다.

(*컨테이너가 debian계통 OS일 경우 가능) 

docker exec <컨테이너 명> ifconfig eth0

 

이제 확인하였으니

nginx( 172.17.0.3 )에서는 mysql( 172.17.0.2 )로,

mysql( 172.17.0.2 ) 에서는 nginx( 172.17.0.3 ) 로 

ping을 각각 날려보았습니다.

docker exec -it <컨테이너 명> ping -c 3 <상대 컨테이너 IP>

 

 

서로 정상적으로 통신이 되는 것을 확인할 수 있었습니다.

(통신이 비정상일 경우 아래와 같이 Destination Host Unreachable 라는 문구를 확인할 수 있습니다.)

 

 

지금은 개념 확인을 위해 ip를 사용해서 확인하였지만,

컨테이너 ip는 고정 옵션을 주지 않는 이상 고정이 아닙니다. 

 

그렇기 때문에, 직접 ip를 사용하는 것은 혼동을 유발할 수 있기 때문에

다른 방법을 사용해야 합니다.

 

1) link 옵션 사용

   link 옵션을 사용해서 아래와 같이 컨테이너간 연결이 가능합니다.

docker run --name nginx --link db:db -d nginx-custom

 

nginx의 /etc/hosts에 확인해보면 db(172.17.0.2)가 추가되어있는 것을 확인할 수 있습니다.

docker exec nginx cat /etc/hosts

 

2) 신규로 bridge를 만들어 컨테이너 생성시 네트워크로 사용하는 방법

 (1) 네트워크 생성

docker network create bridge_test

 (2) 컨테이너 생성(네트워크 옵션 설정)

docker run --name nginx --network bridge_test -d nginx
docker run --name db --network bridge_test -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 -d mysql:8.0-debian

# db 컨테이너 접속
docker exec -it db /bin/bash

# db 컨테이너 접속 후
apt-get update && apt-get install -y net-tools && apt-get install -y iputils-ping
exit


# nginx 컨테이너 접속
docker exec -it nginx /bin/bash

# nginx 컨테이너 접속 후
apt-get update && apt-get install -y net-tools && apt-get install -y iputils-ping
exit

 

 

 (3) ping 확인

  아래 명령어로 각 컨테이너간 통신이 원활한지 확인할 수 있습니다.

docker exec nginx ping -c 3 db
docker exec db ping -c 3 nginx

 


2. host 모드

네트워크를 host모드로 실행할 시 host에서 네트워크를 같이 사용하게 됩니다.

host 모드로 사용하려면 아래와 같이 옵션(--net=host)을 추가해야 합니다.

 

docker run --name nginx --net=host -d nginx

 

하지만 이러한 경우, -p 옵션을 사용하지 못하고 도커 이미지에 명시된 기본 포트밖에 사용할 수 없습니다.

즉, 80번 포트가 이미 사용중일 경우 컨테이너가 제대로 생성되지 않을 수 있으므로 미리 확인하여야 합니다.

또, host모드에서는 IP가 할당되지 않고 호스트와 동일한 인터페이스를 사용하게 됩니다.

 


3. container 모드

컨테이너 모드는 참조하는 컨테이너와 네트워크를 공유하여 동일한 네트워크로 구성하는 것을 말합니다.

container 모드로 사용하려면 아래와 같이 옵션(--net=container:<container명>)을 추가해야 합니다.

docker run --name nginx --net=container:db -d nginx

 


4. none 모드

네트워크 영역을 갖지만, 통신에 필요한 인터페이스 없이 컨테이너를 생성합니다.

none 모드를 사용하려면 아래와 같이 옵션(--net=none)을 추가해야 합니다.

docker run --name=nginx --net=none -d nginx

 

--net=none으로 생성할 시 아래와 같이 외부와 연결되는 인터페이스가 생성되지 않습니다.

 

도커에서 사용되는 네트워크들을 알아보았습니다.

일반적으로는 도커에서 기본으로 설정되어 있는 bridge 네트워크를 사용하는게 좋습니다.

하지만 필요에 따라 이렇게 선택해서 사용할 수 있다는 점만 기억하시면 좋을 듯 합니다.

 

 

 

 

반응형

댓글