首先我们说下Docker的网络原理
在宿主机中Docker会创建一个Docker的容器网桥docker0,启动一个容器会根据Docker网桥的网段分配一个ip,这个ip是container-IP,同时Docker网桥是每个容器的默认网关
容器之间利用这个网桥进行通信
而且容器网络还利用了Linux的虚拟网络技术,在本地主机和容器内创建了一对虚拟借口,进行彼此的互联
关于上面的网络模式,我们包含了新的四种,分别是bridge none container host
关于 bridge 和 container模式我们接下来会将,首先说下none和host模式
对于host模式,是容器和宿主机共享的一个方式,这样容器直接不设置network namespace,加入宿主机,看起来很好,实际上弊大于利,完全没有必要
对于none模式,实际上只适合一些纯计算的任务,因为没有什么容器可以访问到,没有办法加速
其次对于最简单的网络连接的需求,可以在run的时候进行–link 的加入
docker run –link redisserver
这样就可以在容器内部进行联通
不过这样的实际实现是通过 写入host完成的
所以如果容器删除后再启动,就可能导致ip变动,从而ping不同
而且是单向的,对方并不知道己方的存在,所以从任何的角度来说,都不建议使用
那么如何在Docker中维持容器之间的拓补结构呢?
就是上图的bridge 和 container模式的使用了
docker提供了对应的network命令
可以利用network进行连接
比如我们创建一个网络
docker network create –driver bridge –subnet 192.168.0.0/16 –gateway 192.168.0.1 mynet
上面我们指定了驱动是bridge,子网范围是 192.168.0.0/16 网关是192.168.0.1 名字是mynet
对应的使用方式可以在镜像运行的时候指定这个网络
docker run –net 自定义网络
这样如果启动两个容器都加入这个网络,那么可以彼此ping通
如果有一个运行时的容器,我们可以热加入,比如下面的命令
docker network connect mynet myredis
这样就实时生效
或者我们可以将B容器直接加入A容器的Network,这样就对应着上面的container模式
比如
docker run –net=container:name/id
这样就可以进行容器内的搭桥了