Docker网络详细理解-容器网络互通
这篇文章主要解决以下几个问题:
1.同一个网段的容器互相之间通过ip进行ping通
2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法
3.同一个网段的容器互相之间通过容器名,通过创建自定义网络进行ping通,建议采用这种方法
4.不同网段的容器互相之间通过容器名,通过创建自定义网络,某个网段内的容器关联到另一个网段(则该容器有俩IP地址),进行ping通,建议采用这种方法
(容器没有关联到另一个网段则没法ping通)
不同主机之间的docker容器网络互通查看这个文章:https://www.cnblogs.com/sanduzxcvbnm/p/11578827.html
清空所有环境
# 停止并删除所有容器
docker stop `docker ps -q`
docker rm `docker ps -a -q`
# 删除所有镜像
docker rmi `docker images -q` -f

测试

问题:docker 是如何处理容器网络访问的
启动一个tomcat
docker run -d -P --name tomcat01 tomcat
# 查看ip
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat01 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
146: eth0@if147: <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
# 发现容器启动 eth0@if147 ip地址,docker分配的!
测试,Linux能不能 ping 通容器内部?

Linux宿主机是可以 ping 通 docker容器内部的 (禁ping除外)
原理
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是veth-pair 技术!
再次测试ip addr

再启动一个容器
docker run -d -P --name tomcat02 tomcat
再次测试ip addr 发现又多了一对网卡

查看ip

# 发现这个容器带来的网卡都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
# veth-pair 充当一个桥梁,链接各种虚拟网络设备的
# OpenStack,Docker容器之间的链接,ovs的链接,都是使用的 veth-pair 技术
测试 tomcat02 ping tomcat01

结论:容器和容器之间通过ip形式是可以互相ping通的! (都是在同一个网络命令中,bridge桥接)

小结:Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0,最多能分配约65535

Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!
测试删掉容器

只要容器删除,对应的一对网桥就没了!
希望用名字来访问容器
启动tomcat01

直接用名字ping

解决
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
6eac1dfba29cda8a2a20aea6e820f3b2ebbd85d0d9223b650306b34febb820b0
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.092 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.088 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.087 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.098 ms
# 通过 --link 就可以解决
# 但是反向ping就不行了
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
探究: 查看 hosts 文件


现在Docker已经不建议使用 --link 了!
自定义网络
查看所有的Docker网络
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8ce5d63292ee bridge bridge local
b01be88b9d12 host host local
54b9e50084dd none null local
网络模式
bridge :桥接 docker(默认)
host :和宿主机共享网络
none :不配置网络
测试,清空容器
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker rm -f $(docker ps -aq)
6eac1dfba29c
4e2db5c641fd
369e4fb8fd1e
# 直接启动的命令默认会有一个 --net bridge 操作,这个就是docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
自定义一个网络
# 自定义一个网段,名称是mynet
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971
# 查看docker网络,多了一个桥接的mynet
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8ce5d63292ee bridge bridge local
b01be88b9d12 host host local
ce6c831fa98c mynet bridge local
54b9e50084dd none null local
# 查看mynet信息,可以看到没有关联的容器
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971",
"Created": "2020-05-27T16:30:22.691575681+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": {}
}
]
# 到这里网络就创建好了
# 用刚才自定义的网络mynet启动容器
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87
# 再次查看mynet信息,可以看到有两个关联的容器
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971",
"Created": "2020-05-27T16:30:22.691575681+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": {
"0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93": {
"Name": "tomcat-net-01",
"EndpointID": "2364095efd247b368c6787bef9889fa60e58fa0dbc588e59f3f34894044f158f",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87": {
"Name": "tomcat-net-02",
"EndpointID": "1dfd0a22eb575215d2a2b899bf10079fba54cabda082a89b672b8bf4ec0c585e",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
测试 用名字 ping 一下,可以互相通过容器名称进行ping通

现在不使用 --link 也可以ping名字了!
不同网段的容器网络连通

测试

这是不可能的!需要打通



# 测试打通 tomcat01 - mynet
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network connect mynet tomcat01
# 看一下网络信息
docker network inspect mynet

连通之后就是将tomcat01 放到了 mynet 网络下!一个容器两个ip地址
再次ping


Docker网络详细理解-容器网络互通的更多相关文章
- Docker的单主机容器网络
作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...
- docker容器网络—单主机容器网络
当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...
- 【转】理解Docker容器网络之Linux Network Namespace
原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...
- 使用Docker的macvlan为容器提供桥接网络及跨主机通讯
对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人.相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍 ...
- Docker 0x07: Docke 容器网络
目录 Docke 容器网络 Container Network Model (CNM) 具体项目中代码对象有哪些 Implementations实现的网络(直接英文版) Libnetwork incl ...
- Kubernetes & Docker 容器网络终极之战(十四)
目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...
- 一文读懂 Kubernetes 容器网络
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 在Kubernetes中要保证容器之间网络互通,网络至关 ...
- 第 8 章 容器网络 - 054 - 准备 macvlan 环境
准备 macvlan 环境 macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置 ...
- 为啥Underlay才是容器网络的最佳落地选择
导语: 几年前,当博云启动自研容器网络研发的时候,除了技术选型的考虑,我们对于先做 Underlay 还是 Overlay 网络也有过深度的讨论.当时的开源社区以及主流容器厂商,多数还是以 Overl ...
随机推荐
- 数据库持久化+JDBC数据库连接
数据持久化 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称.数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型.XML.二进制流等. 瞬时状态 保 ...
- golang面试-代码编写题1-14
目录 1.代码编写题--统计文本行数-bufio 2.代码编写题--多协程收集错误信息-channel 3.代码编写题--超时控制,内存泄露 4.代码编写题--单例模式 5.代码编写题--九九乘法表 ...
- Java的基础语法01
一. 注释,标识符,关键字 书写注释是一种习惯的养成,当我们一段代码完成后,长时间没有回顾,便会产生遗忘,所以注释是给我们写代码的人看的.1.注释 //单行注释 /*多行注释*/ /**文档注释也叫文 ...
- Windows快捷安装应用方法(此处以Virtualbox为例)
1.执行已下载的virtualbox的安装exe文件,使用pywinauto模拟点击Windows安装的对应控件 1.1.启动exe文件 start *.exe 1.2.使用pywinauto(也适用 ...
- DP の 百题大过关(5/100)
动态规划自古以来是DALAO凌虐萌新的分水岭,但有些OIer认为并没有这么重要--会打暴力,大不了记忆化.但是其实,动态规划学得好不好,可以彰显出一个OIerOIer的基本素养--能否富有逻辑地思 ...
- 2550--HashMap源码解析
JDK版本 1.8 结构: HashMap实现了Map Cloneable Serializable接口: 基础了AbstractMap类,AbstractMap提供一些通用方法,如put remov ...
- (转)git使用收集
由于最近项目开始弃SVN用git,特意整理下git命令.原文链接为http://www.jb51.net/article/55442.htm git branch 查看本地所有分支git status ...
- SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?
前文展示quartz实现基于数据库的分布式任务管理和job生命周期的控制,那在分布式场景下如何解决弹性调度.资源管控.以及作业治理等呢?针对这些功能前当当团队开发了ElasticJob,2020 年 ...
- 附加进程 到远程服务器中Docker容器内 调试
很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常.通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程. VS中的附加进程非常强大 ...
- 英特尔CPU系列
1.酷睿(Core)系列,主要应用于管理 3D.高级视频和照片编辑,玩复杂游戏,享受高分辨率 4K 显示. 2.奔腾(PenTIum)系列,主要应用于借助功能丰富的处理器,加快便携式 2 合 1 电脑 ...