Docker笔记(九):网络管理
Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理。因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了。
1. Docker默认的网络拓扑
在Docker笔记(二):Docker管理的对象中,介绍了Docker通过一些驱动程序来实现容器之间或容器与外部的互联,包括bridge(默认的虚拟网桥形式),host(与主机共享网络栈),overlay(跨Docker Daemon容器间的互联),macvlan(为容器分配mac地址),none(禁用所有网络)等。
默认情况下,Docker启动时会创建一个虚拟网桥 docker0,可以理解为一个软件交换机。当创建一个 Docker 容器的时候,会创建一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在宿主机本地并被挂载到 docker0 网桥,名称以veth 开头,如 veth340c305,docker0会在挂载到它上面的网口之间进行转发,从而实现主机与容器之间及容器与容器之间的相互通信。Docker默认的网络拓扑图如下:
我们可以在宿主机上通过ifconfig查看相关的网络接口,
~$ ifconfig |
通过brctl show可查看网络接口的挂载情况,
~$ brctl show |
由上可看出网络接口veth340c305,veth6c803b7都挂在虚拟网桥docker0上。
2. 容器与外部的互联
我们前面的许多容器启动命令都有添加类似 -p 8080:8080 的参数,以指定将宿主机端口映射到容器端口,从而通过访问 宿主机IP:宿主机端口 的地址来访问对应端口的容器服务。
端口映射的完整格式为 宿主机IP:宿主机端口:容器端口,其中前两个是可以两者都取,或只取其一
宿主机IP:宿主机端口:容器端口:将指定宿主机IP的一个指定端口映射到容器端口,如192.168.40.205:8090:8080宿主机IP::容器端口:将指定宿主机IP的一个随机端口映射到容器端口上,如果宿主机有多个IP,则可以通过这种格式指定绑定其中一个宿主机IP,随机端口范围为49000~49900宿主机端口:容器端口:将宿主机所有网络接口IP的指定端口映射到容器端口上,8090:8080等效于0.0.0.0:8090:8080(0.0.0.0即表示所有网络接口地址)
可以使用 docker port 容器ID或名称 容器端口或docker ps命令来查看端口映射情况,如
~$ docker port test-dev 8080 |
在容器启动时,可以多次使用 -p 来指定映射多个端口。
如果不指定具体的宿主机端口,则可以使用 -P(大写)来分配一个宿主机的随机端口(范围为49000~49900), 如docker run -d -P --name test-dev test:dev,然后通过docker port 容器ID或名称 容器端口或docker ps命令来查看具体映射到了哪个端口。
3. 容器之间的互联
同一个Docker Daemon下的容器,彼此之间是可以通过容器IP互相访问的(如何查看容器IP?用docker inspect 容器ID或名称命令),如果要实现两个容器之间可以通过容器名直接访问,则可以通过自建一个docker网络。
# 创建一个自定义网络,-d 表示网络类型,可以为bridge(网桥,软件交换机),或overlay(跨Docker Daemon容器间的互联) |
由上可见通过自定义网桥连接的容器可以通过容器名称互相访问。如果需要多个容器之间互联,则可以使用Docker Compose。
4. 配置容器的DNS
如果要自定义所有容器的DNS,则可以在 /etc/docker/daemon.json 中增加
{
|
也可以在启动容器时通过参数指定单个容器的DNS配置,--dns=IP_ADDRESS,这会将指定DNS的地址添加到容器的 /etc/resolv.conf 文件中,让容器用这个DNS服务器来解析所有不在 /etc/hosts 中的主机名。
5. Docker网络的底层实现
容器的网络访问控制,主要是通过Linux上的iptables防火墙来实现与管理的。
1. 容器访问外部网络
容器访问外部网络,需要通过本地系统的转发,可以通过如下命令查看转发是否打开
$sysctl net.ipv4.ip_forward |
容器所有到外部网络的访问,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 iptables 的源地址伪装操作实现的,
~# iptables -t nat -nL |
上述规则将所有源地址在 172.17.0.0/16 的网段(容器IP所在网段),目标地址为任意网段(包括外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
2. 外部访问容器
通过 -p 或 -P 指定端口映射,允许外部访问容器端口,实质也是在本地的 iptable 的 nat 表中添加相应的规则,如
~# iptables -t nat -nL |
这里的规则映射了 0.0.0.0 ,意味着将接受主机来自所有网络接口的流量。
3. 容器之间的访问
容器之间能互相访问,需要满足两个条件:1)容器的网络拓扑是否已经互联,默认情况下容器都连接到docker0网桥上,默认是互联的。2)本地系统的防火墙iptables是否允许通过。当容器启动时通过–link互联时,也是在iptables中创建对应规则来实现。
6. 总结
本文整理了Docker网络相关知识,对容器之间及容器与外部之间的通信机制应该有了一定的了解。除了默认的网络实现,Docker还提供了网络的配置及自定义网络,出于篇幅,本文介绍到这,后续再补充。
相关阅读
Docker笔记(二):Docker管理的对象
Docker笔记(三):Docker安装与配置
Docker笔记(四):Docker镜像管理
Docker笔记(五):整一个自己的镜像
Docker笔记(六):容器管理
Docker笔记(七):常用服务安装——Nginx、MySql、Redis
我的微信公众号:jboost-ksxy (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)

Docker笔记(九):网络管理的更多相关文章
- Docker笔记(十一):Dockerfile详解与最佳实践
Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- Elasticsearch笔记九之优化
Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- Docker笔记(二):Docker管理的对象
原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...
随机推荐
- web设计_3_可伸缩的导航栏
1. HTML5构建一个选项卡,需要<nav>标签包围一个无序列表,也可以添加role属性告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色. 绝对不要基于图片的导航,对搜索引擎不友好,更新 ...
- PAY8 数字货币支付结算系统,全球付!实时结算!秒到账!
数字货币支付是历史发展的必然 如今已经有越来越多的地方接受加密数字货币作为支付消费了,比如泰国电影院连锁店 Cineplex Group 可用加密货币买爆米花和电影票,西班牙一精品酒店接受数字货币支付 ...
- 【WPF】 InkCanvas 书写毛笔效果
首先贴出本文参考学习的文章吧. https://www.cnblogs.com/LCHL/p/9055642.html#4206298 感谢这位懒羊羊的代码和讲解(下简称羊博主),我在此基础上稍微加了 ...
- Gridea+GitHub搭建个人博客
某日闲余时间看到一篇介绍Gridea博客平台的文章,大概看了一下觉得此平台还不错,随即自己进入Gridea官网瞅了瞅.哇,这搭建过程也太简单了吧,比Hexo博客搭建要容易很多,而且还有后台管理客户端, ...
- UE4 本地化不起作用 SetCurrentCulture
UE4 本地化 FInternationalization::Get ().SetCurrentCulture ( TEXT ( "en" ) ) FInternationaliz ...
- Something wrong with EnCase v8 index search results
My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...
- python log 设置
# -*- coding: utf-8 -*- import loggingfrom logging.handlers import TimedRotatingFileHandler # 按时间处理 ...
- 【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
嘉宾介绍 黄文俊 有容云资深系统架构师 主要负责容器云平台产品架构及设计. 8年工作经验, 有着企业级存储, 云计算解决方案相关理解. 关注于微服务设计思考, 开发流程优化, docker及kuber ...
- 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)
前言: 最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富.在高并发或者复杂的分布式下,后者限流和自定 ...
- Jenkins 配置 SpringBoot 自动构建部署
服务器版本 Linux version 3.10.0-957.12.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8 ...