简介
网络部分较为复杂,本篇先利用之前写好的基础容器和网桥部分,加上手工给容器配置网络,让其容器与外部网络部分功能正常,为后面程序编写打下基础
源码说明
同时放到了Gitee和Github上,都可进行获取
本章节对应的版本标签是:5.8,防止后面代码过多,不好查看,可切换到标签版本进行查看
思路梳理
在以前的文章中,我们完成了基础容器的功能,在单机情况下基本可用,但没有网络那就不完善
网络部分目前就写了一个IP分配管理工具,和network命令,用于创建网桥
在本人尝试过程中,如果不对网络配置部分有一定的了解,对应后面网络部分的编写和理解会感到很懵
所以我们需要进行一定的热身,先手工给我们的容器配置上网络,后面再用代码完成这部分的功能
关于如何手工进行配置,在《自己动手写Docker》和文章:好文 Linux Network Namespace 与 Bridge 网桥中,都有了很好的描述
跟着上面的链接走一遍了,基本上就通了(PS:如果在ping 114.114.114.114 始终不行,可能是之前的网络配置过于乱了,将iptables规则进行清理或者重启下主机)
对于手动创建网络和配置网络,这里就不再重复,本文的重点放到如果应用上面的知识给目前的容器配置网络
手动配置容器网络
实验环境基于代码的标签:6.2
该部分代码,完成了基本的容器功能和网桥的创建,基于这个基础,我们要做的事情如下:
- 单容器:
- 容器能访问宿主机网络(上篇中已完成)
- 容器能访问外网
- 多容器-同局域网能访问
- 多容器-不同局域网能访问
下面我们继续来完善配置
添加Iptables规则,让容器能访问外网
上篇中我们完成了宿主机与容器的网络连通,但容器目前还是不能访问外网,我们需要添加如下的iptables规则
iptables -t nat -A POSTROUTING -s 162.16.0.0/24 -j MASQUEREAD
目前宿主机的iptables规则如下,看到docker也配置了这样的一条命令
$ iptables -t nat -nL --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
# 下面看到docker也添加了一条这样的规则
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
2 MASQUERADE all -- 182.18.0.0/24 0.0.0.0/0
3 MASQUERADE all -- 162.16.0.0/24 0.0.0.0/0
Chain DOCKER (2 references)
num target prot opt source destination
1 RETURN all -- 0.0.0.0/0 0.0.0.0/0
下面我们从容器内访问下:114.114.114.114,看到成功访问
$ ./main exec bird ping 114.114