Docker网络可以:
- 实现容器间的互联和通信以及端口映射
- 容器IP变动时,可以通过服务名直接网络通信而不受影响。
常用命令
docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
示例
docker network create -d bridge qgg_br
docker network ls
docker network rm qgg_bt
网络模式
网络模式 | 简介 | |
bridge | 为每一个容器分配、设置IP等,并将容器连接到docker0 虚拟网桥,默认为该模式 | --network bridge |
host | 容器不会虚拟出自己的网卡,配置自己的IP等 使用宿主机的IP和端口 | --network host |
none | 容器有独立的network namespace,但没有对其进行任何网络设置,如分配veth pair 网桥链接,IP等 | --network none |
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和指定的容器共享IP,端口范围。 如果指定容器停止或销毁,则网络配置消失。 | --network container:NAME --network container:ID |
bridge
docker0
Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,他在内核层联通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker默认指定了docker0接口的IP和子网掩码,让主机和容器之间可以通过网桥相互通信。
Docker使用Linux网桥,在宿主机上虚拟一个Docker容器网桥(docker0),Docker启动一个容器会根据Docker网桥的网段分配给容器一个IP地址称之为Container-IP,同时Docker网桥是每个容器的默认网关。
同一宿主机内的容器都接入同一个网桥,这样容器直接通过容器的Container-IP直接通信。
docker run时,如果没有指定network,则默认为bridge,使用的就是docker0。
整个宿主机的网桥模式都是docker0,类似交换机有N个接口,每个接口都是veth,在本地主机和容器内分别穿件一个虚拟接口,并且让它们彼此联通(这样的一对接口叫做veth pair)
每个容器实例内部也有一块网卡,每个接口叫eth0
docker0上的每一个veth匹配某个容器实例内部的eth0,两联配对,组成veth pair
在宿主机上使用ifconfig命令可以看到多个veth网卡设备,与使用bridge的容器相对应。
演示:
启动一个容器t1,在宿主机上可以看到一个新的网卡vethc9944c5@if167
进入容器,可以看到对应的网卡eth0@if168
host
直接使用宿主机的IP与外界通信,不再需要NAT转换。容器不会获得独立的network namespace,而是和宿主机共用一个Network namespace。容器不会虚拟出自己的网卡、
在使用host模式的时候,docker run 的-p参数就变得没有意义。
同样的,如果host端口被占用,容器也会启动失败。
例如,使用上文的tomcat镜像,使用host模式,启动一个容器后,宿主机的8080端口被占用,如果此时依旧使用host模式启动另一个容器使用8080,则会失败
启动第一个容器
docker run -d --network host --name th02 billygoo/tomcat8-jdk8
在宿主机器查看端口使用
在启动一个tomcat
docker run -d --network host --name th03 billygoo/tomcat8-jdk8
检查此容器日志
提示端口被占用
docker logs th03
none
在none模式下,不为容器进行任何网络配置。
禁用网络功能,容器内只有lo标识
示例启动一个使用none模式的容器,启动后进入容器查看
container
新建的容器和已经存在的一个容器共享一个网络IP配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,不会配置自己IP,而是和一个指定的容器共享IP,端口范围。
示例
启动两个容器,其中一个使用container模式网络。
docker run -it --name al1 alpine /bin/sh
docker run -it --network container:al1 alpine /bin/sh
在两个容器内指定ip addr。可以看到网络配置完全相同
al1
al2
此时关闭al1,再观察al2的网络信息,仅剩下lo