目录
docker网络连接原理
前言:
- 我们只要安装了docker那么就会有一个网卡(docker0)其网卡用的是桥接模式(桥接物理网卡),所用的技术为evth-pair技术;
- docker0在第一次开启docker时就出现了;这个docker0网卡ip一般为172.17.0.1(子网掩码:255.255.0.0)
- evth-pair技术就是一对虚拟设备接口,他们都是成对出现的,正因为有这个特性,evth-pair充当着一个桥梁,连接着各种虚拟网络设备(docker0网卡与容器)
- docker0通过evth-pair技术与容器进行互联,从而可以与容器之间进行通信,只要启动一个容器就会通过docker0网桥
- 我们每启动一个docker容器,docker就会给docker容器分配一个ip和veth的网卡;这个网卡一共为一对2个,一个在容器内部,一个在linux虚拟机外部,只要对应的容器删除,那么对应网桥的一对veth就会消失
- 在这里docker0就作为网关功能,而里面的容器就相当于内网环境的各个设备,里面的容器要想访问外部设备必须经过docker0网关(同网段的其他设备可以访问docker0网关,但不可访问里面的容器)
测试通信
宿主机与容器
- docker内同一网络下两个容器之间可以互相ping通
- linux宿主机可以ping通各个网络下的docker容器
外围物理机的实验
- 本linux虚拟机同网段的其他机器(不是172.17.0.n类型的地址)ping docker0网关后发现可以ping通
- 本linux虚拟机同网段的其他机器,ping下docker容器(与docker网关处于同一网段)发现ping不通
docker网络类型
查看docker网络类型:docker network ls
结果:我们发现docker有三种网络类型
制作加强版nginx镜像
制作Dockerfile:vi Dockerfile
FROM nginx:latest
RUN apt-get update
RUN apt-get install -y iproute2
RUN apt-get install -y net-tools
RUN apt-get install -y iputils-ping
EXPOSE 80
在Dockerfile所在目录下制作镜像:docker build -t nginxadd .
结果:这个nginx镜像有了ip addr,ping等网络功能
bridge类型
前言:他是网络类型的基本类型,不设置网络类型的话默认为bridge
该网络类型可以创建自定义网络
命令:docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 mynet
linux下执行:ip addr
我们发现linux内容器外多了一个网卡该网卡类似于docker0,这个网络里面的容器可以相互访问,不同网络的容器之间不可以相互访问(但是容器之间的所有不同网关可以被所有的容器访问)
host类型
前言:
- host网络只能有1个,而且是默认创建的那个;其不可以自定义网络
- 连接host网络的容器没有IP地址,在容器中也没必要做端口映射,因为连接host网络的容器就作为主机的一个应用存在
- 通过在linux主机中直接访问容器中暴露的端口就可以访问到容器内部
- 因为连上host网络,那么容器就作为主机的一个应用;那么由于主机可以访问任意网络下的所有容器,那么连上host网络的容器就可以访问主机上任意网络下的所有容器
执行:docker run -d --name nginx4 --network host nginxadd
nginx暴露了80端口,因此直接访问主机的80端口得到如下
进入容器执行ip addr发现里面的网卡全是主机的网卡,本身并没有新增奇怪的网卡(6bd为host网络容器id号)
none类型
前言:
- none网络就是没有网络,根本没打算让容器联网
- 使用了none网络类型后也可以断连该网络后连接其他网络
将容器添加到none:docker run -d --name nginx1 -p 8080:80 --network none nginxadd
进入容器执行:ip addr
结果:就发现一个回环地址,根本没有ip,没有网络
网络命令大全
基础命令
查看docker网络类型:docker network ls
查看网络信息:docker inspect 网络id
删除网络:docker network rm 网络id
注意:
- 基本的3个网络类型不能被删除,可以删除的仅为自己创建的网络
- 当有容器使用该网络时,网络也不能删除
创建网络
创建网络:docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 自己起的网络类型名
属性说明
- --driver:网络类型(默认bridge,因此可省略)
- --subnet:子网
- --gateway:网关
注意:创建后的网络可以用docker network ls方式查看
容器网络相关
创建容器指定对应网络:docker run -d -p 8080:80 --name=容器名 --network 网络类型 镜像名
将容器连入网络:docker network connect 网络名 容器名
将容器断开网络:docker network disconnect 网络名 容器名
注意:
- --network表示要指定使用的网络类型
- 一个容器可以同时连接多个网络,一个网络可以有多个容器
- 一个容器不能被连接或断连host网络