Docker入门系列——网络

alt

Docker 通过容器化应用程序,彻底改变了我们构建、分发和运行应用程序的方式。然而,有效使用 Docker 的一个关键方面是理解容器如何相互通信以及与外界通信。

1. 什么是 Docker 网络?

Docker 网络允许容器相互通信以及与外部资源通信。默认情况下,每个容器都是隔离的,这意味着除非连接到共享网络,否则它们不会自动与其他容器通信。Docker 提供了一个灵活且强大的网络模型,简化了容器之间的连接。

简而言之,Docker 网络处理:

  • 容器之间的通信
  • 容器与外界的通信
  • 为容器化应用程序定义隔离边界

2. Docker 网络类型

Docker 提供了几种网络驱动程序,每种都适用于不同的用例。了解这些网络类型对于为您的应用程序选择正确的网络至关重要。

桥接网络(默认)

桥接网络是 Docker 在创建容器时使用的默认网络驱动程序。同一桥接网络上的容器可以使用 IP 地址或容器名称相互通信。

用例: 这通常用于需要在单个主机上内部通信的多容器应用程序,例如开发环境中的微服务。

# 列出默认桥接网络上的容器
docker network inspect bridge

主机网络

在主机网络中,容器共享主机的网络命名空间。这意味着容器可以直接使用主机的 IP 地址和端口。

用例: 这适用于需要避免网络开销的性能关键型应用程序,但您会失去容器与主机之间的隔离。

docker run --network host <image>

无网络

顾名思义,none 网络驱动程序禁用了容器的所有网络功能。当容器不需要任何外部或内部网络时,这很有用。

用例: 用于不需要任何网络通信的容器,例如特定的后台任务。

docker run --network none <image>

覆盖网络

覆盖网络用于多主机 Docker 设置,其中不同主机上运行的容器需要相互通信。它需要 Docker Swarm 或 Kubernetes 设置。

用例: 对于跨多个 Docker 主机的分布式系统至关重要。

docker network create --driver overlay my-overlay-network

3. Docker 网络实战

现在,让我们探索如何在现实世界场景中使用 Docker 网络。

创建和管理网络

默认情况下,Docker 在运行容器时会创建一个桥接网络。但是,您可以为更高级的设置创建自定义网络。

# 创建自定义桥接网络
docker network create my-custom-network

您可以使用以下命令检查您的网络:

docker network ls  # 列出所有网络
docker network inspect my-custom-network  # 关于特定网络的详细信息

将容器连接到网络

创建自定义网络后,您可以将容器附加到它。

# 运行一个容器并将其附加到自定义网络
docker run -d --name container1 --network my-custom-network nginx

# 运行另一个容器并将其附加到同一网络
docker run -d --name container2 --network my-custom-network redis

同一网络上的容器可以通过容器名称相互通信。

# 在 container1 内部,您可以通过名称访问 container2
ping container2

将服务暴露给主机

如果您希望容器内运行的服务能够从主机或外部世界访问,您需要暴露其端口。

docker run -d -p 8080:80 --name webserver nginx

在这种情况下,容器内运行的 Nginx Web 服务器将可以通过主机机器上的 localhost:8080 访问。

为确保容器间通信高效且安全,优化 Docker 网络配置是关键。以下是一些推荐的优化策略:

选择合适的网络模式

Docker 提供的不同网络模式适用于不同的场景,合理选择可以提高应用程序的性能和安全性。

  • 桥接网络:适合单主机、多容器之间的通信,典型的使用场景是开发环境的微服务。使用自定义桥接网络能够灵活命名容器,便于容器名称解析。
  • 主机网络:适合高性能应用,因为它消除了 NAT(网络地址转换)带来的网络开销。但使用主机网络时容器会共享主机的网络命名空间,因此隔离性会降低,适用于信任容器的场景。
  • 覆盖网络:用于多主机 Docker Swarm 或 Kubernetes 集群中,可以跨多主机的容器间通信。分布式系统或集群应用建议选择覆盖网络。
  • 无网络模式:适合无需网络的容器,例如单纯的数据处理或备份任务等。

使用 docker network ls 可以列出当前主机上的所有网络类型,从中选择合适的网络配置。

限制网络带宽

Docker 支持使用 --network-opt 设置自定义网络的带宽上限,帮助控制容器的网络带宽。对于共享资源的多租户系统,网络限速可以避免个别容器过度占用带宽,影响整体系统的稳定性。

docker network create \
  --opt com.docker.network.driver.mtu=1200 \
  --opt com.docker.network.window=30 \
  custom_network

使用自定义 DNS 配置

在微服务架构中,DNS 解析是容器间通信的关键。Docker 默认使用主机的 DNS 配置,但在某些情况下,配置自定义 DNS 服务器更可靠。使用 --dns 参数为容器指定 DNS 服务器,以确保解析过程不受主机配置影响。

docker run --dns 8.8.8.8 --dns 8.8.4.4 --network my-custom-network my_container

也可以通过在 /etc/docker/daemon.json 文件中添加 "dns" 配置,设置 Docker Daemon 的默认 DNS。

{
  "dns": ["8.8.8.8""8.8.4.4"]
}

网络命名空间隔离

对于隔离要求高的应用,建议将生产和测试环境分别置于不同的网络命名空间。例如,您可以创建不同的自定义网络来隔离环境,确保敏感数据或服务不会意外暴露或被干扰。

4. Docker 网络常见问题

在使用 Docker 网络时,开发者可能会遇到一些常见问题。以下列出几种常见问题及对应的解决方案。

问题 1:容器之间无法通信

原因:容器未连接到同一个网络,或网络配置不当。

解决方案:确保容器位于相同的自定义网络上,可通过 docker network connect 将容器添加到目标网络,或使用自定义网络创建容器。检查 docker network inspect <network_name>,查看是否所有容器均正确连接。

docker network connect my-custom-network container1

问题 2:桥接网络内通信不通

原因:默认桥接网络或防火墙阻止了容器间通信。

解决方案:使用 docker network inspect bridge 检查网络设置,确保桥接网络的设置未被更改。如果网络仍不通,可能需要检查主机防火墙规则,确保允许 Docker 的默认端口和 IP 范围。

问题 3:服务端口映射失败

原因:容器内服务未绑定到正确的 IP 或端口映射未设置。

解决方案:确保服务监听 0.0.0.0,而非 localhost。启动容器时使用 -p 参数设置端口映射,如 docker run -d -p 8080:80 my_container。


结论

Docker 网络是一个强大的功能,允许容器与彼此和外部世界无缝交互。通过了解不同的 Docker 网络类型以及如何配置它们,开发者可以高效地构建和部署容器化应用程序。无论您是在开发一个小型应用程序还是复杂的多容器系统,Docker 网络都能实现这一切。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…

Nico,从零开始干掉Appium,移动端自动化测试框架实现

开头先让我碎碎念一波~去年差不多时间发布了一篇《 UiAutomator Nico&#xff0c;一个基于纯 adb 命令实现的安卓自动化测试框》&#xff08;https://testerhome.com/topics/37042&#xff09;&#xff0c; 由于种种原因 (详见此篇帖子) 当时选择了用纯 adb 命令来实现安卓自动…

RTP和RTCP的详细介绍及其C代码示例

RTP和RTCP的详细介绍及其C代码示例 RTP和RTCP简介RTP协议详解RTCP协议详解RTP和RTCP之间的关系C代码示例RTP和RTCP简介 RTP(Real-time Transport Protocol,实时传输协议)和RTCP(Real-time Transport Control Protocol,实时传输控制协议)是流媒体传输中常用的两个协议。R…

国内能用的Docker镜像源【2024最新持续更新】

国内能用的Docker镜像源【2024最新持续更新】 Docker 镜像加速列表&#xff08;2024年11月已更新&#xff09;配置方式1&#xff1a;临时使用配置方式2&#xff1a;长久有效 在国内使用 Docker 的朋友们&#xff0c;可能都遇到过配置镜像源来加速镜像拉取的操作。然而&#xff…

队列(Queue)的介绍与实现

文章目录 队列队列的概念及结构 队列的实现初始化队列销毁队列队尾入队列队头出队列获取队列头部元素检测队列是否为空获取队列中有效元素个数 队列 队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。队列遵…

3.1 快速启动Flink集群

文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中&#xff0c;我们将快速启动Apache Flink 1.13.0集群&#xff0c;并在Hadoop集群环境中提交作业。首先&…

[sa-token]StpUtil.getLoginId

闲聊 一般情况下&#xff0c;我们想用uid&#xff0c;可能需要前端将uid传过来&#xff0c;或者将token传来&#xff0c;然后我们进行识别。 用了sa-token之后&#xff0c;可以使用StpUtil.getLoginId()方法获取当前会话的用户id 代码展示 例如以下代码&#xff1a; public Res…

算法实现 - 快速排序(Quick Sort) - 理解版

文章目录 算法介绍算法分析核心思想三个版本运行过程挖坑法Hoare 原版前后指针法 算法稳定性和复杂度稳定性时间复杂度平均情况O(nlogn)最差情况O( n 2 n^2 n2) 空间复杂度 算法介绍 快速排序是一种高效的排序算法&#xff0c;由英国计算机科学家C. A. R. Hoare在1960年提出&a…

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤&#xff1a; 状态表示&#xff1a;由经验和题目要求得出&#xff0c;这个确实有点抽象&#xff0c;下面的题目会带大家慢慢感受状态标识状态转移方程初始化&#xff1a;避免越界访问 dp 表&#xff0c;所以在进行填表之前我们要预先填…

SpringBoot学生请假系统:从零到一的构建过程

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

json-server的使用(根据json数据一键生成接口)

一.使用目的 在前端开发初期&#xff0c;后端 API 可能还未完成&#xff0c;json-server 可以快速创建模拟的 RESTful API&#xff0c;帮助前端开发者进行开发和测试。 二.安装 npm install json-server //局部安装npm i json-server -g //全局安装 三.使用教程 1.准备一…

【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型

一、介绍 车辆车型识别&#xff0c;使用Python作为主要编程语言&#xff0c;通过收集多种车辆车型图像数据集&#xff0c;然后基于TensorFlow搭建卷积网络算法模型&#xff0c;并对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操…

【Redis】浅析Redis大Key

目录 1、什么是Redis大Key 2、大 Key 是怎么产生的 3、大 Key 导致的问题 4、如何快速找到 Redis 大 Key 5、大 Key 优化策略 6、总结 我们在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能…

Rocky DEM tutorial3_Vibrating Screen_振荡筛

tutorial3_Vibrating Screen_振荡筛 文章目录 tutorial3_Vibrating Screen_振荡筛0. 目的1. 模型介绍2. 模型设置2.1 Physics设置2.2 导入几何2.3 创建一个进口的几何面2.4 定义运动 Motion frame2.5 材料设置&#xff0c;保持默认即可2.6 设置材料间的相互作用 materials inte…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

阿里云-防火墙设置不当导致ssh无法连接

今天学网络编程的时候&#xff0c;看见有陌生ip连接&#xff0c;所以打开了防火墙禁止除本机之外的其他ip连接&#xff1a; 但是当我再次用ssh的时候&#xff0c;连不上了才发现大事不妙。 折腾了半天&#xff0c;发现阿里云上可以在线向服务器发送命令&#xff0c;所以赶紧把2…

深度学习基础(2024-11-02更新到图像尺寸变换 与 裁剪)

1. 名词解释 FFN FFN &#xff1a; Feedforward Neural Network&#xff0c;前馈神经网络馈神经网络是一种基本的神经网络架构&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;FFN 一般主要是包括多个全连接层(FC)的网络&#xff…

【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

2024年第六届全球校园人工智能算法精英大赛——【算法挑战赛】钢材表面缺陷检测与分割 比赛复盘

引言 钢材表面缺陷检测在钢铁生产中是确保质量的关键环节&#xff0c;传统的人工检测方式难以满足大 规模工业生产的需求。近年来&#xff0c;基于深度学习的缺陷检测方法因其高效性和准确性受到广泛关 注。然而&#xff0c;现有的深度学习模型如U-Net虽具备较好的分割性能&am…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…