态度决定一切

0%

Docker Network

网络分层
image

内网用户需要访问外网资源-NAT 网络地址转换
image

网络命名空间
使用 network name space 实现网络空间隔离

1
2
3
sudo ip netns list  #查看本机的 network namespace
sudo ip netns add test1 #添加network namespace
sudo ip netns delete name #删除本机的 network namespace
1
sudo ip netns exec test1 ip a #在 test1 network namespace 执行 ip a

image

1
ip link 类似 ip a
1
sudo ip netns exec test1 ip link set dev lo up #设置test1的 lo 接口状态为 up(链接此接口的两端未连接的话,单个端口没法 up,必须为一对,单个端口状态为 UNKNOWN)

image

实战

要两个 namespace 能互相 ping 通
image
image

1
2
3
1,sudo ip link add veth-test1 type veth peer name veth-test2  ##宿主机执行,添加一对 veth。
2,sudo ip link set veth-test1 netns test1 ##将veth-test1添加到 test1 namespace
3,sudo ip link set veth-test2 netns test2 ##将veth-test2添加到 test2 namespace

此时veth已经被添加到了 namespace 中
image

1
2
3
4
4,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

image
ping 通
image

docker network

image

docker network

1
2
3
sudo docker network  ls ##列举当前机器 docker 的网络

sudo docker network inspect network_id ##列举当前网络详细信息

image

brctl: 查看bridge 网络信息
image

同一台宿主机中两个 docker 容器连接到bridge(docker0) 网络情况(绿色代表 veth 接口):
image

容器如何访问外网的网络拓扑(利用 NAT):
image

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
2
3
4
sudo docker network create -d bridge my-bridge #新建 bridge

sudo docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"
## 新建容器连接到 my-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端口

image

此容器的网络拓扑
image