参考:https://blog.youkuaiyun.com/qq_39504520/article/details/82719456
准备
- 准备镜像 dockerfile
from ubuntu
run apt-get update
run apt-get -y install netcat net-tools inetutils-ping
docker build -t netwrok .
- docker 网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
99b37182037a bridge bridge local
c805148e6dc5 host host local
8a0aa29d93ff none null local
- 主机网络
ifconfig
...
docker0 Link encap:Ethernet HWaddr 02:42:09:a9:07:e0
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:19745 errors:0 dropped:0 overruns:0 frame:0
TX packets:19658 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1563604 (1.5 MB) TX bytes:35632440 (35.6 MB)
...
- 主机路由(docker0 是默认创建的bridge, 不论容器状态如何,这条路由都一直存在 )
$ route
...
172.18.0.0 * 255.255.0.0 U 0 0 0 docker0
...
默认bridege
docker run -it --net=bridge network
或者
docker run -it network
- ifconfig
...
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe12:2 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7 bytes 578 (578.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
- 容器 route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.18.0.1 0.0.0.0 UG 0 0 0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
此时在容器中可以直接用 gateway 的 IP 172.18.0.1 访问主机的端口
但是主机也可以 通过 172.18.0.2 访问容器的端口
host
docker run -it --net=host network
- ifconfig
返回内容和主机一样,也就是容器的网络和主机相同
此时在容器中可以直接用 localhost 访问主机的端口
但是主机无法 通过 localhost 访问容器的端口
自定义bridge
docker network create test
docker run -it --net=test --name=test01 network
docker run -it --net=test --name=test01 network
上面这样抛弃了的机器 test01 test02就是可以相互ping 通的
只有自定义的bridge 下才能ping通,默认的bridge是ping 不通的,但是可以通过ip 访问
docker network 在windows和linux 下的差别
-
docker for windows 和 linux 下差别非常大
-
liunx 的情况最简单
-
网络类型
-
host
--net=host或者--network host- ifconfig 结果和宿主机一模一样
-
bridge
- 容器 ifconfig 中只有 本地回环网络和 一个bridge上的网卡(即使windows 中也是这样)
- 宿主机的 在 桥接网络中 的地址一般是 172.17.0.1
- docker create network test 后, 宿主机会增加一个 172.18.0.1 的设备
-
-
宿主访问容器
- 如果用了host网络,则直接用 localhost 即可访问容器端口
- 常见的 端口映射, localhost:port
- 宿主机也可用 容器在 bridge 网络 172.17.0.0/16 中地址访问容器,比如 172.17.0.2:8080
-
容器间相互访问
- 只有使用同一个bridge的容器才可以相互访问
- 应该是和安全有关,毕竟在host中是无论如何都可以访问的,host 上也有相应的路由
- 新建的network的容器,可以用容器名相互访问
- defaul 的 docker0 中可以用172.17.x.x 的ip访问,但是不能用容器名
-
容器访问宿主
- host 当成 localhost 就可以随便访问
- bridge 用 172.17.0.1 这种地址,就是宿主机ifconfig 中返回的地址,即可访问
-
-
Windows 的情况很郁闷
有人遇到类似的问题(https://www.iamzs.cn/archives/docker-tutorial.html)
windows的网络结构(https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)

-
网络类型
-
host
- 容器 ifconfig 和宿主有很大差别,直接用localhost 无法访问宿主
- 宿主windows 中,有三个可疑地址,
- 其中两个(大概这样的地址192.168.41.161/28,172.17.253.113/28)是hyper-v引入的地址
- 另外一个(大概这样10.0.75.1/24)是docker 的nat 网关地址
-
bridge
- 容器 ifconfig 和 linux下 的情况相同
- 但是由于宿主系统中没有docker0,新建的bridge 也没有网卡,所以无法直接访问容器
- 没有网桥,只有一个docker nat,也不知道做啥?只能单向访问?
-
docker 似乎维护了两套地址
- 172.17.. 172.18.. …
- 192.168.65.2,192.168.65.3 (host模式下的容器也会使用这个网络),其他任何网络模式中的容器都可以访问这个地址
-
-
宿主访问容器
- host 无法访问
- 端口映射, 和linux 一样 - p [host_port]:[port] , curl localhost:port
-
容器间相互访问
- 和linux 相同
-
容器访问宿主
- host.docker.internal(ping host.docker.internal 得到的网址是192.168.65.2)
- docker.for.win.localhost 也可以
- host/桥接模式都是一样的地址
-
本文深入解析Docker网络配置,涵盖host、bridge、自定义bridge等模式下容器与宿主机及容器间的网络通信原理,包括ifconfig、route命令的使用,以及在Linux与Windows平台上的差异。

4072

被折叠的 条评论
为什么被折叠?



