Docker 网络简单了解
使用与原理
docker network ls
查看 docker 中的所有网络
docker network create test
创建名字为 test 的网桥
docker run --name=nginx --net=test -d nginx
创建容器,使用 --net=test
指定容器连接到 test 网桥
Docker可以有以下 4 种网络模式:
- host模式:使用
--net=host
指定。 - none模式:使用
--net=none
指定。 - bridge模式:使用
--net=bridge
指定,默认设置。 - container模式:使用
--net=container:NAME_or_ID
指定。
同时每个容器和 docker0 都建立了 veth pair 对, 来建立一个端口对,veth pair 对的一端连接的是容器通过 network namespace 隔离出来的网络空间并且命名为 eth0 另一端链接 docker0 网桥
docker0 会分配一个内网的 IP 给容器, 在宿主机内部可以通过这个 IP 来访问容器,容器之间也能够通过网桥通信
out-bound(出站):在 docker 默认安装的时在 iptable 中添加了一个转化规则,从docke0 出去的请求都做了一个NAT转换,把 docker0 转换成宿主机的 eth0 发送出去
in-bound(入站):宿主机的外部要想访问容器内部只能通过 docker-proxy 代理
查看 docker 得进程就会发现做的代理
查看容器端口映射和 docker-proxy 一致
原理图(桥接模式)
- 创建两个容器,容器 1 和容器 2。创建容器 1 时不指定网络,创建容器 2 时指定网络,通过查看其 ip 发现他们在同一个网络下(docker0)
- 通过
docker network create test
创建 test 网桥,发现宿主机多出来了一个网卡
- 创建容器 3 并指定其网桥为 test(
docker run --name=nginx2 --net=test -d nginx
) - 小实验1:在容器 1 中可以通过 ip ping 通容器 2,但不能通过 ip ping 通容器 3。说明不同网络的容器是相互隔离的
https://www.cnblogs.com/zuxing/articles/8780661.html
https://blog.csdn.net/qq_21047625/article/details/88727611
问题
如何通过容器名访问一个容器
通过 --link=xxx
参数关联容器
创建两个容器,后者关联前者
关联的原理(在声明关联关系的容器的 /etc/hosts 记录本地 dns 缓存)
因此可在 nginx-2 通过 nginx-1 访问容器 1
上边的两个容器都使用了默认的 bridge 网络,不在同一个网络中的两个容器可以关联吗?let’s check it out!
结果:并不能!说明不同网络的容器不能通过 --link 关联