도커 네트워크 구조

+full

기본값

  • 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당함
  • 이 IP들은 내부 IP로 아무런 설정을 하지 않았다면 외부에서 접근할 수 없으며 도커가 설치된 호스트 내부에서만 접근할 수 있음

가상 네트워크 인터페이스

  • 컨테이너를 실행하게 되면 컨테이너의 eth0에 대응되는 vethXXXX 라는 이름의 가상 인터페이스가 자동으로 호스트에 생성됨
  • 컨테이너를 실행할 때 따로 네트워크 드라이버를 지정하지 않으면 docker0라고 하는 브릿지 네트워크를 default로 사용하며, 이 브릿지 네트워크는 호스트의 eth0과 veth의 다리 역할을 함

veth

  • 리눅스의 가상 이더넷 인터페이스(virtual ethernet interface)를 의미
  • 일반적인 네트워크 인터페이스와는 달리 패킷을 전달받으면 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작하기 때문에 항상 쌍(pair)로 생성해줘야 함
  • 도커에서는 실행 중인 컨테이너 수 만큼 veth 인터페이스가 생성됨

도커 컨테이너 port를 외부에 노출

컨테이너 포트 연결 명령어

docker run -p [HOST IP:PORT]:[CONTAINER PORT] [CONTAINER NAME]
  • -p : publish 옵션. 호스트 ip 포트를 컨테이너 포트와 매핑시키는 역할

예제1. nginx 컨테이너의 80번 포트를 호스트의 모든 IP의 80번 포트와 연결하여 실행

docker run -d -p 80:80 nginx
 
이후 curl localhost:80 으로 접속가능

예제2. nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트와 연결하여 실행

# 아래와 같이 하나의 포트만 입력하면 컨테이너 포트만 지정하는 역할
# 컨테이너 80번 포트를 호스트의 사용가능한 포트에 랜덤으로 지정하여 연결함
docker run -d -p 80 nginx

예제3. nginx 컨테이너의 80번 포트를 호스트의 127.0.0.1 의 80번 포트와 연결하여 실행

# 지정된 IP에 대해서만 포트를 매핑함
docker run -d -p 127.0.0.1:80:80 nginx

도커 네트워크 드라이버

+full

도커 네트워크 드라이버는 Native 와 Remote 로 나뉨

  • Native Drivers : Bridge, Host, None, Overlay
  • Remote Drivers : 써드파티 드라이버로 외부에서 잘 만들어진 드라이버를 사용

네트워크 동작 방식에 따른 드라이버 분류

  • 네트워크를 단일 호스트, 다중 호스트로 분류
  • 각 네트워킹 방식에 따라 동작함

도커 네트워크 목록 확인

docker network ls
 
>>
NETWORK ID     NAME      DRIVER    SCOPE
e9894c44432d   bridge    bridge    local
0fa86d7a11fb   host      host      local
d5e012e65643   none      null      local

도커 네트워크 확인하기

docker network insepct [NETWORK ID / NAME]

도커 네트워크 생성하기

# docker network create --driver=[NETWORK DIRVER] [DRIVER NAME]
docker network create --driver=bridge my-net-bridge

네트워크 지정 후 컨테이너 실행

docker run -d --network=[NETWORK NAME] [CONTAINER NAME]

네트워크 종류

bridge 네트워크

  • 포트를 연결해 외부에 노출하는 방식
  • 위 예제에서도 네트워크 드라이버를 지정해주지 않았으므로 default로 docker0 라는 bridge 네트워크를 사용함
  • 드라이버를 지정하지 않고 컨테이너를 생성하면 기본 네트워크로 사용함
  • 커스텀 bridge 네트워크를 생성해서 사용가능

host 네트워크

  • 도커가 제공하는 가상 네트워크(veth)을 사용하는 것이 아니라 직접 host 네트워크에 붙어서 사용하는 개념
  • 따라서 host 네트워크를 사용할 경우에는 port 바인딩을 하지 않더라도 접속할 수 있음
docker run -d --network=host nginx
 
# 위 명령어 실행 시 컨테이너의 포트 목록은 비어있음

None 네트워크

  • none 네트워크는 해당 컨테이너가 네트워크 기능이 필요없을 때, 혹은 커스텀 네트워킹을 사용해야되는 경우가 있을 때 사용함
  • none 네트워크를 사용해서 컨테이너를 생성하면 외부와의 연결이 단절됨
docker run --netword none ubuntu:focal

참고


Prev: (Docker) 4. Docker - Python 배포 실습

Next:


docker도커DevOps