首先我们说下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

这样就可以进行容器内的搭桥了

发表评论

邮箱地址不会被公开。 必填项已用*标注