Docker单机网络下

简介: Docker系列文章:此篇是Docker系列的第七篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!1. 为什么要学习Docker2. Docker基本概念3. Docker镜像基本原理4. Docker容器数据卷5. Dockerfile6. Docker单机网络上

一、前言


Docker系列文章:

此篇是Docker系列的第七篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!

  1. 为什么要学习Docker
  2. Docker基本概念
  3. Docker镜像基本原理
  4. Docker容器数据卷
  5. Dockerfile
  6. Docker单机网络上


二、Docker网络初探


  1. 后台方式启动一个最新版本的centos镜像;
docker run -d -it --name centosworktest centos:latest
  1. 进入容器内部,查看容器的网络信息,我们可以看到一个eth0的网卡信息,该网卡上挂载的一个Veth-Pair,通过Veth-Pair与内部的网桥通讯;
#查看容器信息
docker ps
#进入容器内部
docker exec -it  ad9342449b86 /bin/bash
#查看网络信息(yum install net-tools)
ifconfig

  1. 使用route -n查看容器内部的路由表信息,可以证实eth0是这个容器默认的通信的设备;

  1. 接下来我们退出容器,看下宿主机的网络情况,我们可以看到宿主机网络上挂载了一个Veth-Pair,猜测是挂载到docker0上的,这里我们推断docker0可能是一个bridge;

  1. 验证docker0是否是bridge,我们可以通过brctl show(yum install -y bridge-utils)命令来查看,通过查看我们发现docker0果然是一个bridge;

  1. 通过上面的实验我们可以猜测docker的网络模型结构应该是类似于网络篇上的结构,如下图:

  1. 为了验证结论的正确性,我们再次启动一个centosworktest02的容器,检查docker0是否挂载了新的Veth-Pair;
#后台方式启动一个名字为centosworktest02的centos镜像
docker run -d -it --name centosworktest02 centos:latest
#查看docker0是否挂挂载信息的Veth-Pair
brctl show
#查看网络情况
ifconfig

  1. 通过验证我们发现我们猜测基本正确,接下来我们验证一下容器之间网络的连通性,我们从centosworktest02 ping(yum install -y iputils) centosworktest,发现容器间的网络也是通的;

经过一系列验证,我们发现整体的猜测是正确的docker默认的在宿主机内部的网络模型就是通过bridge和Veth-Pair进行通信的。


三、Docker网络模型


实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接容器IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机端口,即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

网络模型
bridge

bridge模式是Docker的默认网络模式,也就是我们在网络初探上探索的模式,这里对其容器与宿主机的通信进行一个总结,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,在此宿主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

容器启动的时候会从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0的网卡,另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中,到这里我们只是完成了宿主机与容器,同一主机上容器间的通信,此时容器还不能与外部网络进行通信。

为了使外界可以访问容器中的进程,docker采用了端口绑定的方式,也就是通过iptables的NAT,将宿主机上的端口流量转发到容器内的端口上。当使用使用docker run -p时,就是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式中的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,此外由于容器与外界通信是基于三层iptables NAT,性能和效率上的损耗肯定是不可避免的。

host

如果启动容器的时候使用host模式,容器直接与宿主机使用同一网络命令空间,采用此模式的容器,可以直接使用宿主机的IP地址与外面进行通信,如果宿主机具有公网的IP地址时,那容器也会拥有这个公有的IP地址,与此同时,容器内服务的端口地址也能直接使用宿主机的端口,无需再进行额外的NAT转换。因此host最大的优势就是网络性能比较好,但是容器将不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈使用,容器内部将不再拥有所有的端口资源。

none

如果启动容器的时候使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。容器中只有lo回环地址,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

container

如果使用该模式新创建的容器和已经存在的容器会共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享IP、端口范围等信息。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。


相关文章
|
21天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
2月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
1月前
|
Shell Linux Docker
自定义Docker网络
这篇文章介绍了如何使用Docker命令自定义网络,并通过创建和配置网络来实现容器间的通信。
30 6
自定义Docker网络
|
1月前
|
应用服务中间件 nginx Docker
单机编排工具之docker-compose快速入门使用
这篇文章是关于如何使用docker-compose进行单机编排的快速入门指南,包括了镜像准备、docker-compose安装、使用教程以及验证服务生效的步骤。
50 2
单机编排工具之docker-compose快速入门使用
|
1月前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
96 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
1月前
|
Kubernetes 安全 Docker
|
10天前
|
安全 NoSQL Redis
Docker自定义网络
Docker操作 (十四)
29 0
|
10天前
|
Linux 数据库 网络架构
Docker网络
Docker操作 (十二)
25 0
|
10天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
2月前
|
消息中间件 测试技术 RocketMQ
docker部署RockerMQ单机测试环境
docker部署RockerMQ单机测试环境