docker网络管理教程
2022年12月31日大约 5 分钟约 1466 字
网络
静态NAT,动态NAT,PAT,端口映射
静态NAT(网络地址转换):
- 内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,即两个地址的映射关系己绑定死了。
- 可以实现外部网络对内部网络中某些特定设备(如服务器)的访问
动态NAT:
- 内部网络的私有IP地址随机转换为公有IP地址池中的一个IP地址。
- 每个转换条目在连接建立时动态建立,而在连接终止时会被回收。
- 外网的计算机不能访问内网的计算机(因为映射关系是内网计算机发起且连接终止时就回收了!)
PAT(端口地址转换,PAT,Port Address Translation):
- 多个私有网IP地址到一个公网IP地址,通过使用不同的端口来区分内网主机
- 外网的计算机不能访问内网的计算机
端口映射
- 让internet主机可以访问内网主机
netns网络命名空间
netns是在linux中提供网络虚拟化的一个项目,可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。 使用netns创建的网络空间独立于当前系统的网络空间,就好像进入了另外一个网络一样。不同网络命名空间中的设备是不同的,之间不能互相直接通讯。
创建两个网络命名空间并连接在一起
# 启动两个容器
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
ip netns list # 查看本机网络命名空间
ip netns add test1 # 添加test1网络命名空间
ip netns add test2 # 添加test1网络命名空间
# 添加'veth-test1','veth-test2'一对网线相连的veth接口
ip link add veth-test1 type veth peer name veth-test2
ip link set veth-test1 netns test1 # 将'veth-test1'接口添加到test1网络命名空间内
ip link set veth-test2 netns test2 # 将'veth-test2'接口添加到test2网络命名空间内
ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1 # 给'veth-test1'分配IP地址
ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2 # 给'veth-test2'分配IP地址
ip netns exec test1 ip link set dev veth-test1 up # 启动veth-test1接口
ip netns exec test2 ip link set dev veth-test2 up # 启动veth-test1接口
ip netns exec test1 ip a # 在test1网络命名空间执行'ip a'命令
# 从'test1'网络名字空间ping'test2'的veth-test2接口的IP
ip netns exec test1 ping 192.168.1.2
# ping自己的接口不通是因为没有启动自己的lo接口
ip netns exec test1 ip link set dev lo up # 在test1网名命名空间启动lo接口
ip netns delete test1 # 删除test1网络命名空间
相关网络命令
ip a # 查看网络接口和IP地址
ip link # 查看网络接口
docker网络
容器默认是通过bridge桥接连接到主机上的
容器的网络命名空间与主机的网络命名空间是通过一对veth相连
主机的veth接口与主机的docker0接口相连
docker network ls # 查看docker网络
docker network inspect bridge # 查看docker的bridge网络
docker exec test1 ip a # 查看test1容器的网络接口
yum install -y bridge-utils
brctl show
两个容器使用本地域名相连
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 36000; done"
docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 36000; done"
docker exec test2 ping test1 # 在'test2'容器里ping 'test1'域名(单向的)
使用域名是单向的,在test1中不可使用test2域名
连接到某个容器名就可以当某个容器的域名使用
并且test2容器的启动是依赖test1,即test1必须先启动
新建docker桥接网络
docker network create -d bridge my-bridge
# 将'test3'容器加入my-bridge网络
docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 36000; done"
# 将'test2'容器加入my-bridge网络(之前网络并没有断开,这是另外加的)
docker network connect my-bridge test2
docker exec test2 ip a
# 用户自定义的bridge网络可以使用主机名
docker exec test2 ping test3
docker exec test3 ping test2
docker 端口映射
docker run --name web -d -p 8080:80 nginx
docker network inspect bridge
curl 127.0.0.1:8080
docker none网络
docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600; done"
docker network inspect none
docker exec test1 ip a
none网络:是一个孤立的网络,除了使用命令行访问,没有任何其他访问方式
docker host网络
docker run -d --name test1 --network host busybox /bin/sh -c "while true; do sleep 3600; done"
docker network inspect host
docker exec test1 ip a
使用主机的网络命名空间,没有自己的网络命名空间
存在的限制:容器的服务与主机的服务的端口不能冲突