Docker网络模式解析以及自定义网络
文章目录
- 基础命令:
- Docker 网络模式
-
-
- bridge
- host
- none
- container
-
- 自定义网络
docker再启动后会生成一个docker0虚拟网桥(172.17.0.1)
作用:
- 容器间的互联、通信以及端口映射
- 容器ip变动时可以通过服务名直接网络通信而不受到影响
基础命令:
查看docker network COMMAND 有那些
docker network ls :查看网络
docker network create :创建网络
docker network rm 网络名称 :删除网络
docker network inspect 网络名称 :查看网络数据源
docker network prune :删除无用网络(同删除虚玄镜像)
Docker 网络模式
Docker服务默认会创建docker0网桥,它在内核层
连通了其它物理网卡或虚拟网卡,这就使得所有容器和本地主机都放在同一个物理网络,Docker默认指定了docker0接口的物理地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
项目 | Value |
---|---|
bridge | 为每一个容器分配、设置ip等,并将容器连接到docker0 ,虚拟网桥,默认为该模式 |
host | 容器将不会虚拟出自己的网卡,不会配置自己的ip,而是使用宿主机的ip后端口 |
none | 容器有自己独立的 Network Namespace ,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,ip等。 |
container | 新创建的容器不会创建自己的网卡和配置自己的ip,而是指定一个容器共享ip、端口范围等。 |
bridge
通过 docker network inspect bridge 查看网络数据源
[{`"Name": "bridge",`"Id": "8efcf11d822355fcbb9d7660e7078b015005c7b433f3cfa4e2cf467f1fb2350a","Created": "2023-04-01T15:12:08.63260771+08:00",`"Scope": "local",``"Driver": "bridge",`"EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"060b497506e3f1a2f8ced8fc69ca9b58da0e1a8d6dbea6a27411869422c0f4e8": {"Name": "linux","EndpointID": "7a3fee4ccc9bedea90a4775e0ed5d6cede5e351f544d0639ea95208835aa8d1e","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""},"243e68780a6ebc59f6aaeeee641f4ab0053085fd8ab392ceb53929f0bb5950b7": {"Name": "confident_lumiere","EndpointID": "3dfdbcbcc8d61e1257d72fb5fa95e30d421478ad7b16cdad378faa97d6bbc552","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""}},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",`"com.docker.network.bridge.name": "docker0",`"com.docker.network.driver.mtu": "1500"},"Labels": {}}
]
docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge。
网桥docker0创建一对对等虚拟设备接口,一个叫veth,一个叫eth0,成对匹配。
eth0与veth相当于一个数据线的两个接口,一段连接容器,一段连接网桥(网桥与宿主机网络ens33连接),
容器就通过这根数据线实现网络连接,这根数据线得两个接口是成对匹配的。
host
直接使用宿主机的ip地址与外界通信,不再使用网桥进行网络地址转换。
冗余使用(警告):下面命令是因为已经使用了宿主机的ip地址,不需要做端口映射
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
通过docker ps查看启动的tomcat确实也没有端口映射
正确使用:
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
none
在none模式下,不会为容器配置任何网络设置,如ip,网卡、路由等,只有一个lo,需要我们自己手动配置。
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
container
新建的容器与指定容器共享一套网络ip配置,新建的容器不会创建自己的网卡,配置ip。
注:
部门容器ip、端口是不能共享的,如tomcat,这样不能共享的容器在启动时就会报错。
docker run -it --name alpine1 alpine /bin/shdocker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
当被指定共享的容器停止时,新建容器内的共享的网络配置也会消失。
自定义网络
实行容器间的互联互通,我们发现在同一个网络(bridge)使用ip能ping同对方,但使用实例名却无法ping通。
但是这容器中很难保证ip不被改动,也不可能一直去更改配置。使用自定义网络通过实例名互联就能解决这一问题。
新建一个网络
docker network create linxi_network
将启动的容器使用自定义的网络(–network 指定网络名)
docker run -d -p 8081:8080 --network linxi_network --name tomcat81 billygoo/tomcat8-jdk8docker run -d -p 8082:8080 --network linxi_network --name tomcat82 billygoo/tomcat8-jdk8
进入容器通过ping 同一个网络的对方实例名