docker network 简单介绍
安装了docker 服务之后
使用 ip a 查看生成一个 名为 docker0 的虚拟网桥
通过下图中的这个ip地址(虚拟网桥)跟宿主机以及容器之间的网络通信
安装完docker之后,会默认创建3大网络模式 (常用的是图中红框中的)
docker 四种网络模式及自定义网络模式的简单介绍
网络模式 |
简介 |
bridge |
为每一个容器分配、设置IP等,并将容器链接到一个"docker0" 虚拟网桥,默认为该模式 |
host |
容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口 |
none |
容器有独立的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥链接、IP等 |
container |
新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。 |
一、bridge
docker network inspect birdge 查看birdge网络配置信息 如下图所示
[root@localhost ~]# docker run -it --name aaa01 ubuntu bash
[root@localhost ~]# docker run -it --name aaa02 ubuntu bash 使用ubuntu镜像创建两个aaa01、aaa02的容器
[root@localhost ~]# docker inspect aaa01 | tail -n 20
[root@localhost ~]# docker inspect aaa02 | tail -n 20 查看容器01、02信息(查看后面20行左右的信息)如图所示
[root@localhost ~]# docker rm -f aaa02 此时删除02容器
[root@localhost ~]# docker run -it --name aaa03 ubuntu bash 创建03容器
[root@localhost ~]# docker inspect aaa03 | tail -n 20 查看已经删除02容器的IP自动被配置成为了03容器的ip,如下图所示
PS:
表示 bridge网络模式下:docker容器内部的IP是有可能会发生改变的
(02容器宕机或者下线后,在重新重建容器,会自动配置宕机或下线容器的IP)
bridge 网卡模式案例:
1、整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫做veth,在本地主机和容器内分别创建一个虚拟接口,并让他们批次联通(这中一对接口叫做 veth pair)
2、每个容器实例内部也有一块网卡,每个接口叫做eth0
3、docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配
例:
[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat001 billygoo/tomcat8-jdk8
[root@localhost ~]# docker run -d -p 8082:8080 --name tomcat002 billygoo/tomcat8-jdk8 创建两个tomcat容器 (001、002)
[root@localhost ~]# ip addr 如图所示 多了两组网卡(该网卡与上方创建的001、002容器的内部eth0网卡匹配)
[root@localhost ~]# docker exec -it tomcat001 bash 进入到001容器内
root@4adadd3a872c:/usr/local/tomcat# ip addr 查看网卡确认与宿主机的网卡veth一一对应(如图所示)
如图所示:
001 容器内的网卡对应宿主机的16 veth网卡
002 容器内的网卡对应宿主机的18 veth网卡
二、host
host 网络模式 直接使用宿主机的IP进行与外界进行通信,不再需要额外进行NAT转换
也就是说在host网络模式下,容器不会虚拟出自己的IP,而是直接使用宿主机的IP和端口
[root@localhost ~]# docker run -d -p 8083:8080 --network host --name tomcat003 billygoo/tomcat8-jdk8
#--network host 指定了host网络模式进行启动容器 并映射8083端口
#指定host网络模式 虽然映射了8083 但是ps 查看 端口显示为空 也会出现一个警告 如图所示
PS: 指定了host网络模式,启动容器时 使用 -p 映射端口无效果,直接跳过-p 映射去启动容器
例:
[root@localhost ~]# docker rm -f tomcat003 删除003容器
tomcat003
[root@localhost ~]# docker run -d --network host --name tomcat003 billygoo/tomcat8-jdk8
重新创建 不指定映射 (就不会有警告 因为host模式使用的是宿主机ip,所以无需映射端口)
[root@localhost ~]# docker inspect tomcat003 | tail -n 20
如图所示 因为host模式使用的是宿主机ip, 既不会有IP和网关地址
验证一:在宿主机下 ip addr 查看 和进入到003容器下 ip addr 查看 网卡内容一样
验证二:通过宿主机的IP地址访问 tomcat 如图所示:直接使用宿主机ip和8080端口
三、none
在 none的网络模式下: 将禁用网络功能,ip addr 查看IP地质信息,将只有 lo 标识(就是本地127.0.0.1 的本地回环地址)
就是说这个docker 容器没有网卡、IP、路由等信息,只有一个lo
需要自己为docker容器配置添加网卡和IP等信息
[root@localhost ~]# docker run -d -p 8084:8080 --network none --name tomcat004 billygoo/tomcat8-jdk8
指定 none 模式 创建004容器 如图所示 none模式下 没有IP及网关,进入到容器内查看IP地址 只有一个lo的回环地址
四、container
container 网络模式 表示新建的一个容器可以指定一个已经创建过的容器共享同一个IP、端口范围等
只是共享IP等信息,其他的文件系统、服务进程等信息不会共享
PS:使用服务镜像(例如tomcat)进行创建容器并指定端口会遇到报错
例:使用tomcat镜像创建两个容器tomcat005、tomcat006
[root@localhost ~]# docker run -d -p 8085:8080 --name tmocat005 billygoo/tomcat8-jdk8
创建一个 005的容器,并映射8085端口
[root@localhost ~]# docker run -d -p 8086:8080 --network container:tomcat005 --name tmocat006 billygoo/tomcat8-jdk8
docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
See 'docker run --help'.
创建一个006的容器 并使用container模式共享已经创建过容器005的ip、端口等信息
上述报错内容粗俗来说就是 006和005共用一个ip 一个端口 导致冲突
使用 “Alpine” 镜像来做演示
例:
[root@localhost ~]# docker run -it --name alpine007 alpine /bin/sh
启动一个 alpine007 的容器 注意后面使用的是 /bin/sh
[root@localhost ~]# docker run -it --network container:alpine007 --name alpine008 alpine /bin/sh
启动一个 alpine008 的容器 并指定共享007的IP等信息
验证一: 是否共享成功 共用同一个网桥,且如果被共享的007容器停掉之后008容器是否还会保留共享的地址
如图所示: 进入到007、008容器内查看ip 共用了同一个ip地址
验证二:如果被共享的007容器停掉之后008容器是否还会保留共享的地址
如图所示: 007停掉之后 008地址也会消失,只剩下本地的一个lo的回环地址
自定义网络模式
为了测试自定义网络模式 找一台测试机删除所有创建的只保留三个默认的bridge、host、none
且为了测试更直观 删除所以创建的容器 “从头来过”
在网络规划中,尽量不能将IP地址写固定死,上面也测试过,服务器停掉之后它的ip会被新创建的容器默认分配使用,为了避免使用IP地址去调用时出错,所以尽量以主机名为准,下列演示使用自定义网络之前与之后的测试。
使用自定义网络之前
[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat001 billygoo/tomcat8-jdk8
[root@localhost ~]# docker run -d -p 8082:8080 --name tomcat002 billygoo/tomcat8-jdk8
创建两台容器 001 及 002 并映射端口 8081 及 80802 此时没有指定网络模式 默认的为网桥模式(bridge)
[root@localhost ~]# docker exec -it tomcat001 bash
[root@localhost ~]# docker exec -it tomcat002 bash
进入到两台容器内 测试是否能ping通对方的ip及主机名称 如图所示
PS:如果不用自定义网络使用默认网络模式创建容器的时候,ip地址分配的都在同一网段中,所以能PING 通,但是如果使用服务 器主机名称去PING 则不通
bridge
host
none
使用自定义网络之后
[root@localhost ~]# docker network create aabb_network 创建一个网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5a63f5546b31 aabb_network bridge local 驱动模式还是为bridge
[root@localhost ~]# docker run -d -p 8083:8080 --network aabb_network --name tomcat003 billygoo/tomcat8-jdk8
创建003 容器 映射8083端口 加入到新创建的网络 aabb_network 中
[root@localhost ~]# docker run -d -p 8084:8080 --network aabb_network --name tomcat004 billygoo/tomcat8-jdk8
创建004 容器 映射8084端口 加入到新创建的网络 aabb_network 中
[root@localhost ~]# docker exec -it tomcat003 bash
[root@localhost ~]# docker exec -it tomcat004 bash
进入到 003、004 容器进行对主机名的ping 测试ping测成功 如图所示
PS: 自定义网络本身就维护好了主机名和IP地址的对应关系(IP和域名都能互相PING通)
docker network 常用指令
docker network ls 查看当前网络列表
docker network create “xxx” 创建网络
docker network rm “xxx” 删除网络
docker network inspect “xxx” 查看网络数据源 如下图所示
[root@localhost ~]# docker network ls 新安装的docker服务之后 使用这条命令能列出如下网络信息(默认的三个)
NETWORK ID NAME DRIVER SCOPE
ce48a1e9659b bridge bridge local
c70522a93b6c host host local
191eae66604e none null local
[root@localhost ~]# docker network create network_01 创建网络network_01
0c49d120fdb5d42a03fdde8a488ccc60909d73f337e083523c0303324fe4e4ee
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
269dd2775e63 bridge bridge local
c70522a93b6c host host local
0c49d120fdb5 network_01 bridge local #新创建的network_01
191eae66604e none null local
[root@localhost ~]# docker network rm network_01 删除
network_01
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
269dd2775e63 bridge bridge local
c70522a93b6c host host local
191eae66604e none null local
[root@localhost ~]#