简介
网络部分较为复杂,本篇先利用之前写好的基础容器和网桥部分,加上手工给容器配置网络,让其容器与宿主机网络部分功能正常,为后面程序编写打下基础
源码说明
同时放到了Gitee和Github上,都可进行获取
本章节对应的版本标签是:5.8,防止后面代码过多,不好查看,可切换到标签版本进行查看
思路梳理
在以前的文章中,我们完成了基础容器的功能,在单机情况下基本可用,但没有网络那就不完善
网络部分目前就写了一个IP分配管理工具,和network命令,用于创建网桥
在本人尝试过程中,如果不对网络配置部分有一定的了解,对应后面网络部分的编写和理解会感到很懵
所以我们需要进行一定的热身,先手工给我们的容器配置上网络,后面再用代码完成这部分的功能
关于如何手工进行配置,在《自己动手写Docker》和文章:好文 Linux Network Namespace 与 Bridge 网桥中,都有了很好的描述
跟着上面的链接走一遍了,基本上就通了(PS:如果在ping 114.114.114.114 始终不行,可能是之前的网络配置过于乱了,将iptables规则进行清理或者重启下主机)
对于手动创建网络和配置网络,这里就不再重复,本文的重点放到如果应用上面的知识给目前的容器配置网络
准备工作
实验环境基于代码的标签:6.2
该部分代码,完成了基本的容器功能和网桥的创建,基于这个基础,我们要做的事情如下:
- 单容器:
- 容器能访问宿主机网络
- 容器能访问外网
- 多容器-同局域网能访问
- 多容器-不同局域网能访问
手动网络配置
容器启动与网桥创建
创建网桥,将我们的网段设置为:162.16.0.0/24
$ ./main network create --driver bridge --subnet 162.16.0.1/24 testbridge
{
"level":"info","msg":"allocate subnet: 162.16.0.1/24, ip: 162.16.0.1","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"dump ipam file from: /var/run/mydocker/network/ipam/","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"BridgeNetworkDriver creat network subnet: 162.16.0.1/24, gateway ip: 162.16.0.1","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"createBridgeInterface success","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"setInterfaceIp success","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"crsetInterfaceUp success","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"setInterfaceUp success","time":"2022-04-23T09:37:13+08:00"}
{
"level":"info","msg":"create network success","time":"2022-04-23T09:37:13+08:00"}
$ ./main network list
NAME IpRange Driver
testbridge 162.16.0.1/24 bridge
在宿主机上查看我们网桥,使用ip命令进行查看,可以看到我们网桥成功创建,并设置了ip为:162.16.0.1,这将作为我们容器的网关IP
$ ip addr
10: testbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN