Docker——网络
docker0
查看主机的ip
[root@iZwz908j8pbqd86doyrez5Z test]# ip addr
#本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
#阿里云内网地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:10:37:ba brd ff:ff:ff:ff:ff:ff
inet 172.18.199.233/20 brd 172.18.207.255 scope global dynamic eth0
valid_lft 309999819sec preferred_lft 309999819sec
#docker生成的地址
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:6f:43:1c:ae brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
查看容器的ip
[root@iZwz908j8pbqd86doyrez5Z test]# docker exec -it 5046feaea51f ip addr
#容器内网地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
#docker生成的地址
282: eth0@if283: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
尝试从主机直接ping通容器的eth0ip
#尝试ping通主机和容器
[root@iZwz908j8pbqd86doyrez5Z test]# ping 172.17.0.2
#连接成功
容器间的通信:docker网络
原理:使用了evth-pair技术,本质上都是通过主机相连.每个主机有一个端口对应一个容器(如上面的容器-282和主机-283),如此构成了一个局域网.实际上各个容器无法直接相连,只能通过enth0进行桥接
#尝试ping通容器和容器
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
284: eth0@if285: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat2 ping 172.17.0.3
#测试:可以ping通
docker网络解决的问题:容器之间的ping通
原理
我们没启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡桥接模式,使用的技术是evth-pair技术
#再次查看主机ip:多了一个263(猜测“283: veth30fdc0b@if282”表示:这里的263与容器内的262相对应,即每运行一个容器,都会创建一对网卡)
[root@iZwz908j8pbqd86doyrez5Z test]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:10:37:ba brd ff:ff:ff:ff:ff:ff
inet 172.18.199.233/20 brd 172.18.207.255 scope global dynamic eth0
valid_lft 309996899sec preferred_lft 309996899sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:6f:43:1c:ae brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
283: veth30fdc0b@if282: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4e:d2:72:ba:14:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
linux桥接:我们每启动一个容器,linux主机就会多一个虚拟网卡,这个网卡连接着各个容器,我们可以尝试使用两个容器进行通信
#evth-pair技术:一对虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
284: eth0@if285: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat2 ping 172.17.0.3
网络模型图

结论:tomcat1和tomcat2公用一个路由器docker0
小结

注:
- Docker中的所有网络接口都是虚拟的.虚拟的转发效率高!
- 只要容器删除,对应网桥一对就没了
–link(官方不推荐)
当通过datasource连接mysql时,通常总是对应一个指定的端口,而容器的端口却是在启动难时生成(主机端口-容器端口),是否有办法通过主机端口-服务找到对应的端口?
#尝试直接ping通
docker exec -it tomcat2 ping tomcat1 #无法直接ping通 #尝试使用link启动一个容器
docker run -d -P --name tomcat3 --link tomcat2 tomcat
docker exec -it tomcat3 ping tomcat2 #可以ping通 #尝试tomcat1向tomcat2反向Ping通
docker exec -it tomcat1 ping tomcat3 #失败 #查看/etc/hosts文件探究--link原理
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 tomcat2 e55b43eede71 #其实本质上是更改了hosts文件,将访问转到本地对应的端口
172.17.0.5 c13e595e3183
原理:直接在/etc/hosts中写死了
自定义网络
#查看当前的网络
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e33b6b9e8a86 bridge bridge local
e4a72501819c host host local
ee755fa64360 none null local
网络模式
bridge:桥接模式,桥接docker(默认)
none:不配置网络
host:和宿主机共享网络
container:容器内网络连通(不建议)测试
# 我们直接启动的命令 --net bridge,也就是我们docker0的桥接
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat #与上面等同 # docker0特点:默认,域名不能访问,可以--link打通,但是不推荐 #尝试建立一个自定义网络
#--driver bridge:桥接模式
#--subnet 192.168.0.0/16:子网地址(/16,说明只限制了前面16位,可以有255*255个不同的地址;如果是/24,则只有255个地址)
#--getaway 192.168.0.1:网关
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e33b6b9e8a86 bridge bridge local
e4a72501819c host host local
27ebc9223f19 mynet bridge local #*
ee755fa64360 none null local #docker network inspect mynet
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
"Created": "2020-09-15T15:13:49.178777935+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16", #子网
"Gateway": "192.168.0.1" #网关
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
] #ping测试
[root@iZwz908j8pbqd86doyrez5Z ~]# docker run -d -P --net mynet --name tomcat4 tomcat
b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd
[root@iZwz908j8pbqd86doyrez5Z ~]# docker run -d -P --net mynet --name tomcat5 tomcat
f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat4 ping tomcat5 #再次查看信息
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
"Created": "2020-09-15T15:13:49.178777935+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { #两个容器
"b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd": {
"Name": "tomcat4",
"EndpointID": "5f7cd9c91fdf08ff27ed82d0419aa428c365c1a2d1b5eed476bb1bdb45a86d06",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993": {
"Name": "tomcat5",
"EndpointID": "92660007315adb53a812b564b06090b3039a7771e7c5d9a4fad2b1c9df9753d8",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]注:
- 不同的集群建立不同的网络
- 我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
网络连通
#尝试ping通不同网段(bridge和mynet)的容器
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 ping tomcat4
ping: tomcat4: Name or service not known #在mynet网络中加入tomcat3容器
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network connect mynet tomcat3
[root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
"Created": "2020-09-15T15:13:49.178777935+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd": {
"Name": "tomcat4",
"EndpointID": "5f7cd9c91fdf08ff27ed82d0419aa428c365c1a2d1b5eed476bb1bdb45a86d06",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"c13e595e31833afb032661b077f310bebce5d68bc19012caabc67dbaced129b9": {
"Name": "tomcat3",
"EndpointID": "ad22702408b9cad4cd67d58758506e60b6a48a0274f26a1134403c4153468a1f",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993": {
"Name": "tomcat5",
"EndpointID": "92660007315adb53a812b564b06090b3039a7771e7c5d9a4fad2b1c9df9753d8",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
] #尝试用tomcat3来ping通tomcat4
[root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 ping tomcat4 #成功
注:
- 网段不同,无法ping通
- 为了实现不同网段的容器互通,应该将要连通的容器连通整个网卡(图)
- 连通之后,就是将容器加入到对应的网络中(一个容器,两个ip地址
springboot打包docker镜像
- 在IDEA中下载docker插件
- 在IDEA中设置连接远程仓库
- 编写dockerfile文件
- 将jar和dockerfile文件发布上去
Docker——网络的更多相关文章
- 理解Docker(5):Docker 网络
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- docker网络配置方法总结
docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...
- 【转】Docker网络详解及pipework源码解读与实践
好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...
- Docker网络模式
[编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- docker网络解析
Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...
- docker网络访问(三)
docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...
- [Docker网络]模拟一台交换机的拓扑
[Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...
- Docker 网络之理解 bridge 驱动
笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...
- Docker 网络之进阶篇
笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...
随机推荐
- java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系
一.包装类的分类: 1.黄色部分的父类为Number 继承关系: Boolean Character 其他六个基本数据类型 2.装箱和拆箱 理解:一个例子,其他的都相同 装箱:Integer inte ...
- tarjan——有向图、无向图
强连通块只存在于有向无环图DAG中 实际上low[i]的理解是:一个强连通块在dfs搜索树中子树的根节点 //把一个点当成根提溜出来,抖搂抖搂成一棵树 void dfs(int u) { //记录df ...
- 小程序"errcode":41002错误问题如何解决?
我的问题是:小程序在本地测试的时候是没有问题的,但是当我扫开发者中的项目中的二维码手机浏览测试的时候发现是没有数据的,然后调试工具中出现: {"errcode":41002,&qu ...
- HTTP流量神器Goreplay核心源码详解
摘要:Goreplay 前称是 Gor,一个简单的 TCP/HTTP 流量录制及重放的工具,主要用 Go 语言编写. 本文分享自华为云社区<流量回放工具之 goreplay 核心源码分析> ...
- design PLL
PLL PLL主要是NCO中通过相位比较器,控制压控振荡器,控制频率.
- MCU与MPU的基本区别
MCU与MPU的基本区别 题记:一般来说,mpu的价格是mcu的数倍. 参考资料: http://www.elecfans.com/d/1564656.html https://zhuanlan.zh ...
- 云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群
入门 作为安装的一部分,请确保您已完成以下操作: 分叉 Postgres Operator 示例存储库并将其克隆到您的主机. https://github.com/CrunchyData/postgr ...
- Python数据分析 | Numpy与1维数组操作
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...
- 忘掉cmd.exe吧!选用优雅的控制台终端(ConsoleZ)
1.使用cmd的烦恼 嵌入式开发经常会用到命令行工具,Windows系统自带的command line工具(cmd.exe)的简陋程度不用说大家都深有体会.使用cmd.exe有如下几个主要的烦恼: 没 ...
- 思迈特软件Smartbi光鲜亮丽的背后是什么在支撑?
思迈特软件Smartbi是国内知名BI厂商,自2011年成立以来就以提升和挖掘客户的价值为使命,致力于为客户提供一站式商业智能平台和BI解决方案,发展到如今已经获得了来自国家.地方政府.国内外权威分析 ...