Docker网络

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器Container-IP直接通信。

docker配置虚拟ip docker 虚拟网卡_docker配置虚拟ip

Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高因为Linux是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。

原理:
1、每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。桥接网卡
2、每启动一个容器linux主机多了一个虚拟网卡。
3、docker run -d -P --name tomcat --net bridge tomcat:8 

网络模式

docker默认使用桥接模式

网络模式

配置

说明

bridge模式

--net=bridge

默认值,在Docker网桥docker0上为容器创建新的网络


none模式

--net=none

不配置网络,用户可以稍后进入容器,自行配置

container模


--

net=container:name/id

容器和另外一个容器共享Network namespace。

kubernetes中的pod就是多个容器共享一个Network

namespace。(联盟式容器)

host模式

--net=host

容器和宿主机共享Network namespace;

用户自定义

--net=mynet

用户自己使用network相关命令定义网络,

创建容器的时候可以指定为自己定义的网络

--update 2022年5月13日23:18:04 结合下面这个图来理解。 

docker配置虚拟ip docker 虚拟网卡_docker配置虚拟ip_02

docker配置虚拟ip docker 虚拟网卡_Docker_03

docker桥接网络模式示意图 

docker配置虚拟ip docker 虚拟网卡_docker_04

多主机通信

docker配置虚拟ip docker 虚拟网卡_Docker_05

docker网络-端口转发

docker run -it --name --rm myweb -p 80 nginx

-p 参数的指定会在iptables的nat表中新增转发记录

docker配置虚拟ip docker 虚拟网卡_linux_06

宿主机上如何访问这个myweb服务呢?

因为重启了myweb服务,所以端口变成了49154. 宿主机可以通过49154访问到nginx服务。

docker配置虚拟ip docker 虚拟网卡_docker配置虚拟ip_07

删除该容器之后,iptables中的nat表内容自动删除。

还有另外一种方式查看这种映射关系

docker port containername

docker配置虚拟ip docker 虚拟网卡_kubernetes_08

-P 不指定端口,暴露构建镜像时的默认端口,例如Nginx,不适用任何端口暴露,宿主机是无法访问的,可以使用-P 参数无需指定端口,宿主机通过80端口可访问nginx,因为nginx默认暴露的是80端口。 

 

docker配置虚拟ip docker 虚拟网卡_docker_09

 联盟式容器

docker配置虚拟ip docker 虚拟网卡_linux_10

自定义docker0网桥

docker配置虚拟ip docker 虚拟网卡_linux_11

 

远程连接其他服务器上的docker deamon

这个和mysql的通信是类似的。

同一个宿主机上创建多个docker网桥

docker network create

可以指定子网以及网关 

docker配置虚拟ip docker 虚拟网卡_docker_12

启动容器的时候就可以指定所要连接的网桥.  

 

docker配置虚拟ip docker 虚拟网卡_linux_13

 只要宿主机开启了路由转发功能,两个网段的容器是可以通信的。

实战

 创建4个Docker容器:con1、con2、con3、con4

$ docker run -itd ——name con1 ubuntu /bin/bash
$ docker run -itd ——name con2 ubuntu /bin/bash
$ docker run -itd ——name con3 ubuntu /bin/bash
$ docker run -itd ——name con4 ubuntu /bin/bash

 在主机上查看网络

docker配置虚拟ip docker 虚拟网卡_kubernetes_14