网络分层
内网用户需要访问外网资源-NAT 网络地址转换
网络命名空间
使用 network name space 实现网络空间隔离
1 | sudo ip netns list #查看本机的 network namespace |
1 | sudo ip netns exec test1 ip a #在 test1 network namespace 执行 ip a |
1 | ip link 类似 ip a |
1 | sudo ip netns exec test1 ip link set dev lo up #设置test1的 lo 接口状态为 up(链接此接口的两端未连接的话,单个端口没法 up,必须为一对,单个端口状态为 UNKNOWN) |
实战
要两个 namespace 能互相 ping 通
1 | 1,sudo ip link add veth-test1 type veth peer name veth-test2 ##宿主机执行,添加一对 veth。 |
此时veth已经被添加到了 namespace 中1
2
3
44,sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1 #给 veth-test1添加 ip 地址
5, sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2 #给 veth-test2添加 ip 地址
6, sudo ip netns exec test1 ip link set dev veth-test1 up #在 test1 的 namespace将veth-test1接口 状态改为 up
7, sudo ip netns exec test2 ip link set dev veth-test2 up #在 test2 的 namespace将veth-test2接口 状态改为 up
ping 通
docker network
docker network
1 | sudo docker network ls ##列举当前机器 docker 的网络 |
brctl: 查看bridge 网络信息
同一台宿主机中两个 docker 容器连接到bridge(docker0) 网络情况(绿色代表 veth 接口):
容器如何访问外网的网络拓扑(利用 NAT):
docke run –link: Add link to another container,可以根据容器名访问到另一个容器,不用指定 ip,如果是 mysql 直接可以使用类似 mysql://test:3306?user&xxxx。
1 | sudo docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done" |
==link是单项的 test2 -> test1 可以在 test2 上ping test1 ,不能反向==
1 | sudo docker network create -d bridge my-bridge #新建 bridge |
docker network connect: 链接容器到一个网络上1
sudo docker network connect my-bridge test2 ##将 test1到my-bridge网络
==如果两个容器连接到了用户自己创建的 bridge 而不是默认的 bridge0上,默认两个容器已经–link 好了==
外网如何访问 container
端口转发
1 | sudo docker run --name web -d -p 80:80 nginx ##创建一个名为 web 的 container 并且将容器的80 端口映射到宿主机的80端口 |
此容器的网络拓扑