Skip to content

Docker:Network

$ docker run --link <컨테이너 이름>:<별칭>

이렇게 하면 별칭이름을 사용하여 GUEST에서 접근할 수 있다. (ex. http://[별칭]/index.html)

Brief

  • Docker가 시작되면 docker0 이라는 이름의 Virtual interface를 만들어 컨테이너와 호스트 머신이 통신한다.
    • Private 범위에서 사용하지 않는 IP를 자동으로 선택해서 docker0에 할당한다.
  • 디폴트로 --net=bridge 옵션으로 실행되며, Bridge로 통신한다.
  • --net=container:NAME_or_ID 옵션으로 다른 컨테이너에게 위임이 가능하다. 이렇게 되면 첫번째 컨테이너와 같은 IP주소, 포트를 공유하고, Loopback 인터페이스로 통신이 가능함.
  • --bip 옵션으로 docker0의 IP주소범위를 지정 가능함.

Driver

Bridge
docker의 기본 network 방식은 bridge 이다. docker daemon을 실행하면 먼저 docker0 라는 bridge가 생성된다. 컨테이너 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며, 이때 docker0 bridge에 container의 인터페이스들이 하나씩 binding 되는 구조이다.
Host
host 방식으로 컨테이너를 생성하면, 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게 된다. (네트워크 외 다른 환경은 기존과 동일하다)
Container
이 방식으로 생성된 컨테이너는 기존에 존재하는 다른 컨테이너의 network 환경을 공유하게 된다.
None
--net=none 옵션으로 컨테이너를 생성하면 격리된 네트워크 영역을 갖긴 하지만, 인터페이스가 없는 상태로 컨테이너를 생성하게 된다.
Overlay
Swarm에서 Node간 연결을 위한 드라이버.

Port forwarding

Example

MongoDB를 서비스하는 bd컨테이너를 NginX를 서비스하는 web컨테이너에 연결하고 싶을 경우 아래와 같이 사용하면 된다.

$ docker run --name db -d mongo
$ docker run --name web -d --link db:db nginx

분석

docker 설치 직후 다음 인터페이스가 생성되었다. (ip link로 확인)

4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8c:a7:f9:fb brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

iptables-save로 확인:

# Generated by iptables-save v1.8.7 on Thu Mar 16 23:30:59 2023
*filter
:INPUT DROP [3:292]
:FORWARD DROP [0:0]
:OUTPUT DROP [83:7690]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp2s0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o enp2s0 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
-A OUTPUT -o enp2s0 -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT
-A OUTPUT -o enp2s0 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -o enp2s0 -p icmp -j ACCEPT
-A OUTPUT -o enp2s0 -p udp -m udp --sport 123 --dport 123 -j ACCEPT
-A OUTPUT -o enp2s0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -o enp2s0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Thu Mar 16 23:30:59 2023
# Generated by iptables-save v1.8.7 on Thu Mar 16 23:30:59 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Thu Mar 16 23:30:59 2023

ip6tables-save는 별거 없었다.

See also

Favorite site

구조 분석

컨테이너 네트워크 기초

References


  1. 44bits_-_is-docker-container-a-virtual-machine-or-a-process.pdf 

  2. 44bits_-_container-network-1-uts-namespace.pdf 

  3. 44bits_-_container-network-2-ip-command-and-network-namespace.pdf