Docker 网络 (二)

2020-01-17  本文已影响0人  wayyyy

容器与外部网络的访问,这里涉及2个问题:

  1. 容器访问外部世界
  2. 外部世界访问容器
容器访问外部世界
root@JD:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-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

在 NAT 表中,有这么一条规则:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
其含义是:如果网桥 docker0 收到来自 172.17.0.0/16 网段的外出包,把它交给 MASQUERADE 处理。而 MASQUERADE 的处理方式是将包的源地址替换成 host 的地址发送出去,即做了一次网络地址转换(NAT)


外部世界访问容器

docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。

root@JD:~# docker run -d -p 80 httpd
92854d59dfa5c7311603df918d102c3d0da4373678d2ab3d835185a5392b666e
root@JD:~# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
92854d59dfa5        httpd               "httpd-foreground"   5 seconds ago       Up 4 seconds        0.0.0.0:32768->80/tcp   epic_joliot
root@JD:~# curl 192.168.0.3:32768
<html><body><h1>It works!</h1></body></html>

每一个映射的端口,host 都会启动一个 docker-proxy 进程来处理访问容器的流量。

root@JD:~# ps -aux | grep docker-proxy
root     21849  0.0  0.0 108196  2608 ?        Sl   23:20   0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.2 -container-port 80
root     22119  0.0  0.0  14224   976 pts/2    S+   23:21   0:00 grep --color=auto docker-proxy
上一篇 下一篇

猜你喜欢

热点阅读