网络模式
(1)查看docker 三种默认网络
>> docker network ls
- NETWORK ID NAME DRIVER SCOPE
- 35165d8bbc4b bridge bridge local
- 1c78982c24cf harbor_harbor bridge local
- 139f534c87d0 host host local
- 49e16aa0520e none null local
网络模式
- bridge: 为每一个容器分配,设置ip等,并将容器连接到一个docker0虚拟网桥,默认为该模式(无需映射)
- host: 容器将不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的ip和端口
- none: 容器有独立的Network namespace,但并没有对其进行任何设置,如分配ip
- container:新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip
bridge桥接网络模式
- 在该模式中,Docker守护进程创建了一个虚拟以太网桥 docker0 ,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包
- 默认情况下,守护进程会创建一对对等细腻设备接口 vethpair ,将其中一个接口设置为容器的eth0端口(容器的网卡),另外一个接口防止在宿主机的命名空间中,以类似vethxxx 这样的名字命名,从而将宿主机上的所有容器连接到中国内部网络上
比如我运行一个基于 buysbox 镜像构建的容器 mybox01 ,查看 ip addr
busybox:被称为嵌入式瑞士军刀,整合了很多小的 unix 下的通用功能到一个小的可执行问价中
(1)拉取busybox镜像
docker pull busybox
(2)创建bbox01容器
docker run -it --name=mybox01 busybox
结果如下:
宿主机结果如下:
关于 bridge 网络模式的使用,只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可,当然这也是创建容器默认的网络模式,也就是说这个参数是可以省略的
图解bridge之间的联系:
host主机模式
- host网络模式需要在创建容器时通过参数 --net host 或者 -network host 指定
- 采用host网络模式的Docker container,可以直接使用宿主机的IP地址与外界进行通信,若宿主机的eth0是一个公有ip,那么容器也拥有这个公有ip,同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换;
- host网络模式可以让容器共享主机网络栈.这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性
使用host网络模式创建mybox02容器
docker run -it --name=mybox02 --network host busybox
宿主机
综上:host网络模式直接使用宿主机的网卡
none自定义网络模式
- none网络模式是指禁用网络功能,只有lo(local)接口,代表127.0.0.1,即localhost本地环回接口,在创建容器时通过参数–netnone 或者 --network none指定
- none网络模式即不为Docker container创建任何的网络环境,容器内部就只能使用loopback网络设备,不会再有其他的网络资源,可以说none模式为Docker container 做了极少的网络设定.
使用none网络模式创建mybox03容器
docker run -it --name=mybox03 --network none busybox
结果如下:
container网络模式
- container网络模式是Docker中一种较为特别的网络模式.在创建容器时通过参数 --net container:已运行的容器名称(ID) 或者 --network container:已运行的容器名称ID指定
- 处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间是有localhost高效快速通信
Container
网络模式即新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享IP,端口范围等,同样两个容器移除了网络方面相同之外,其它文件系统,进程列表等还是隔离的
使用container网络模式创建mybox04容器
docker run -it --name=mybox04 --network container:mybox01 busybox
mybox04结果如下:
mybox01结果如下:
**link网络模式 **
- docker run --link 可以用来连接连个容器,使得源容器和接收器之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量
- 这种方式官方已不推荐,并且在未来版本可以被移除.
官方警告信息: https://docs.docker.com/network/links/
自定义网络
-
虽然Docker提供的默认网络使用比较简单,但是为了保证各容器中的应用安全性,在实际开发中更推荐自定义的网络进行容器管理,以及启用容器名称到ip地址的自动DNS解析.
-
从Docker1.10版本开始,docker daemon 实现了一个内嵌的DNS server,使容器可以直接通过容器名称进行通信,方法很简单,只要在创建容器时使用 --name 为容器命名即可
-
但是使用Docker DNS有个限制: 只能在 user-defined网络中使用,也就是说,默认的bridge网络是无法使用DNS,所以我们就需要自定义网络
(1)创建网络
>>> docker network create --help
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment
创建一个基于 brige 网络模式的自定义网络模式 custom_network 命令如下:
docker network create custom_network
docker network ls
分别创建mybox06与mybox07容器
docker run -it --name=mybox06 --net custom_network busybox
docker run -it --name=mybox07 --net custom_network busybox
测试
进入 docker exec -it mybox06 sh
进入 docker exec -it mybox07 sh
(2)连接网络
通过 docker network connect 网络名称 容器名称
为容器连接新的网络模式
例如: docker network connect bridge mybox01
(3)断开网络
通过docker network disconnect 网络名称 容器名称
例如: docker network disconnect custom_network mybox07
(4)移除网络
通过 docker network rm 网络名称
例如: docker network rm custom_network