Docker:Network
Link syntax
이렇게 하면 별칭이름을 사용하여 GUEST에서 접근할 수 있다. (ex. http://[별칭]/index.html
)
Brief
- Docker가 시작되면
docker0
이라는 이름의 Virtual interface를 만들어 컨테이너와 호스트 머신이 통신한다.- Private 범위에서 사용하지 않는 IP를 자동으로 선택해서
docker0
에 할당한다.
- Private 범위에서 사용하지 않는 IP를 자동으로 선택해서
--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 설치 직후 다음 인터페이스가 생성되었다. (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
- [추천] Networking overview | Docker Documentation
- Docker 컨테이너 네트워크
- 가장 빨리 만나는 Docker 6장 - 2. Docker 컨테이너 연결하기
- Docker - Network Configuration
구조 분석
- [추천] Docker Network 구조(1) - docker0와 container network 구조
- [추천] Docker Network 구조(2) - container network 방식 4가지
- [추천] Docker Network 구조(3) - container 외부 통신 구조
- [추천] Docker Network 구조(4) - container link 구조
컨테이너 네트워크 기초
- [추천] 도커(Docker) 컨테이너는 가상 머신인가요? 프로세스인가요? | 44BITS 1
- [추천] UTS 네임스페이스를 사용한 호스트네임 격리 - 컨테이너 네트워크 기초 1편 | 44BITS 2
- [추천] ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 - 컨테이너 네트워크 기초 2편 | 44BITS 3