docker0
네트워크는 bridge네트워크
인지 확인
network
확인 커맨드brctl
명령어가 작동되지 않아 추가 설치했습니다.$ sudo apt-get install bridge-utils
$ brctl show
virtual ethernet bridge
:172.17.0.0/16
L2
통신기반container
생성 시veth
인터페이스 생성(sandbox
)- 모든 컨테이너는 외부 통신을
docker0
통해 진행container
running 시172.17.X.Y
로IP
주소할당
port-forwarding
- container port를 외부로 노출시켜 외부 연결 허용
- iptables rule을 통한 포트 노출
-p hostPort:containerPort
-p containerPort
처럼:
을 입력하지 않을 경우에는,hostport
에 랜덤포트가 열린다.-P
만 적을 경우, 랜덤 포트가 작성된다- ex)
docker run --name web -d -p 80:80 nginx:1.14
iptables
확인 :iptables -t nat -L -n -v
순차적으로 할당되는 ip 확인
docker0
bridge networkbusybox
는 각기 다른 터미널에서 실행시켜야 합니다. (혹은-d
명령어 추가)
$ ip addr
$ brctl show
// ip addr 172.17.0.2
$ docker run --name c1 -it busybox
$ docker inspect c1
// ip addr 172.17.0.3
$ docker run --name c2 -it busybox
$ docker inspect c2
// ip addr 172.17.0.4
$ docker run -d -p 80:80 --name web1 nginx
// ip addr 172.17.0.5
$ docker run --name c3 -it busybox
// 외부 네트워크와 통신 확인
# ping 8.8.8.8
docker inspect c1
를 하면NetworkSettings
에서SandboxID
가 보인다.
Sandbox
가 c1
이라는 컨테이너의 네트워크 환경을 만들어준거다.EndpointID
가 veth0
의 네트워크 인터페이스가 만들어진거다.c1
네트워크는 172.17.0.1
의 docker0
의 네트워크를 통해 나간다.172.17.0.1
시스템은 외부
로 나갈때 자신의 ip
를 host ip
로 바꿔서 내보내는 IP Masquerade
서비스 즉, NAT
서비스를 지원하게 된다.IP Masquerade란?
주소변환만 하는것이 아닌 포트번호까지 포트포워딩시켜주는 기능
docker0
가anywhere
로 나가면 호스트의 ip로 바꿔서 송출해주겠다.
$ iptables -t nat -L -v