Docker学习笔记(四)单主机网络

server/2024/9/23 20:09:05/

简介

  Docker从容器中抽象除出了底层的主机连接网络,使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址,其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。
  但是容器内运行的软件没法方便的确定主机IP地址,从而阻止了容器将服务端点告知容器网络以外的服务
  在Docker中,网络和卷一样,拥有自己的生命周期,我们可以通过docker network来直接定义和管理网络。

网络类型与网络范围

网络类型

  默认情况下,Docker包括三种网络:
在这里插入图片描述

  1. bridge:桥接网络。驱动-bridge;Docker的默认网络,它为一台计算机上运行的所有容器提供容器间的网络连接能力。
      需要注意的:默认的bridge为了兼容旧版的Docker,无法利用新版本的优点,如服务发现、负载均衡等,因此,尽量创建自己的桥接网络。
  2. host:主机网络。驱动-host;Docker不会为连接host网络的容器创建特殊的网络命名空间或资源。共享 Docker host 的网络栈,容器的网络配置 与 host 完全一样。
      host网络上的容器与主机上的网络交互方式,就像未容器化的进程与主机的网络交互一样。对主机上的网络设施和接口也有完全的访问权限。
      但需要注意的是,host网络会有端口号冲突的问题。
  3. none:驱动-null;表示与外界完全隔离,连接none的容器自身外部没有任何网络连接。

网络范围

  Docker网络的范围有三种类型:
    1) 本地(local):指网络被限制在所在的计算机上。(默认类型)
    2) 全局(global):表示在集群的每个节点上都创建网络,但不在节点之间转发消息。
    3) 集群(swarm):指网络无缝的跨接Docker集群中的所有主机。使得容器能够跨多个物理或虚拟机进行通信。
创建一个网络的基础命令为:

docker network create \
--dirver [驱动类型] \
--scope [网络范围] \
--label project=[标签元数据] \ #方便资源识别
--attachable \ #将网络标记为可连接的,可以随时对容器与网络进行连接或分离
--subnet 10.0.1.0/24 \#为网络定义子网掩码
--ip-range 10.0.1.128/25 \#设置可分配的网络IP地址范围
[网络名]

host网络只允许创建一个

NodePort publishing 节点端口发布

  Docker容器网络都是关于容器之间的简单连接和路由,即使是桥接网络上的容器,运行Docker的宿主机外外部直接路由到。因此要将容器中运行的服务与外部网络客户端连接起来,需要执行额外的步骤。
  NodePort publishing是用来匹配Docker和其他容器生态系统项目的专用术语,通过-p--publish列表选项,对容器的端口和主机的端口进行映射,使流经主机指定端口的流量转发到容器的端口
命令示例:

docker run -p [主机端口号]:[容器端口号]/[端口协议]
docker run -p [主机端口号]:[容器端口号]
docker run -p [容器端口号]

  最后一个命令只指定了容器端口号,这样做会使主机随机选择一个端口号作为发送端口,这种用法可以避免端口冲突问题。这时,我们可以通过docker port命令进行端口映射查找到被分配的主机端口。

docker port [容器名] [容器端口号]

容器网络的注意事项与定制化

没有防火墙或网络策略

  Docker容器网络不再提供容器之间的访问控制或防火墙机制。同一容器网络上的容器具有相互无限制的网络访问权限。只有应用程序级别的身份验证和授权管理才能在同一网络上相互保护容器。

自定义DNS配置

  域名系统(DNS)是用于将主机名映射到IP地址的协议。通过这种映射,客户端可以从对特定主机IP的依赖关系中解耦,而依赖于使用已知名称引用任何主机。
1)dns配置
  首先,通过--hostname选项,可以设置新容器的主机名。再通过nslookup将容器主机名映射到容器的桥接IP地址。
命令:

docker run \
--hostname [容器主机名]
nslookup [容器主机名]
...

2)为容器指定一到多个DNS服务器
  由于其他服务器不知道指定容器的主机名,使得主机名的用途有限。如果使用外部dns服务器,则可以共享这些主机名。并且,最好使用特定的DNS服务器来保持服务的一致性。
  需要注意是:
    1.DNS服务器地址必须是IP地址。
    2.可以多次设施--dns选项来访问多个DNS服务器。
    3.在容器运行时停止Docker服务,并在重启Docker服务时通过编辑==/etc/docker/daemon.json==文件,并添加或修改dns字段,设置全局默认的DNS服务器,容器将仍使用旧的DNS设置,只有重启这些容器,更改才会生效。
命令:

docker run \
--dns 8.8.8.8
nslookup docker.com #解析docker.com 的IP地址
...

3)–dns-search
  --dns-search这个选项允许指定DNS搜索域名,类似于默认的主机名后缀。指定搜索域名后,DNS主机名后只要不包括顶级域名(如.com/.net),就会被附加指定的搜说域名,然后进行搜索。该命令只有在创建容器时设置才能生效。
示例:

docker run \
--dns-search docker.com
nslookup hub
···

  以上命令将解析名为hub.docker.com的主机的IP地址。我们也可以通过操作==/etc/resolv.cong(配置通用名称解析库的文件)来让配置生效。
4)重载DNS系统
  --add-host选项可以为自定义的IP地址和主机名提供映射关系。可以被多次指定,但要注意的是,在Docker引擎启动时无法将--add-host选项设置为Docker引擎的默认值。
  通过该选项,①将目标主机名映射到已知的IP地址,可以有效的阻断目标主机与外界的连接。②可以将主机设为代理,从而为特定目的地址路由流量,比如通过安全通道路由不安全的流量。
  所有自定义映射关系都记录在容器的==/etc/host==文件中。
使用命令:

docker run \
--add-host [主机名]:[IP地址] \
...

总结:如果DNS是更改出站流量的最佳工具,那么防火墙和网络拓扑结构就是控制入站流量的最佳工具。

外部化网络管理

  现在更多倾向于在none环境中创建容器,然后使用一些容器管理工具来创建和管理容器网络接口、管理节点端口映射等系统集成工作。(类如Kubernetes),将网络管理外部化
  当采用外部化网络管理这种方式时,Docker仍然负责为容器创建网络命名空间,但不会创建或管理任何网络接口。并且,如果某些容器网络的管理实现了外部化,而另一些没有,那么内置的服务发现机制将无法将后者的容器的流量路由到前者。因此,在实际应用中,我们应尽量避免这种混合的网络环境。


http://www.ppmy.cn/server/120962.html

相关文章

组合式 API 和选项式 API的区别

一、区别 设计思想:options API 偏向于填充式,规定了方法应该写在那里,比如 methods,computed,watch 等,而 compositionAPI 更灵活 使用方式:compositionAPI 全部写在 setup(&…

【5】AT32F437 OpenHarmony轻量系统移植教程(2)

开源地址:https://gitee.com/AT32437_OpenHarmony 学习本文档的意义 1.学习移植OpenHarmony轻量系统到AT32全系列mcu上,本文档移植的具体型号为AT32F437ZMT7 2.学习OpenHarmony轻量系统开发 3.适配vprintf, vfprintf, printf, snprintf 和sprintf 1…

Android外接USB扫码枪

前言 公司的设备以前接入的都是串口的扫码头,优点是直接通过串口读取流里面的数据就OK了,缺点是你需要知道每一款扫码器的型号以获取波特率及Android设备的串口地址。因为现在usb扫码器越来越方便且即插即用,不需要额外供电以及价格便宜等特…

【60天备战2024年11月软考高级系统架构设计师——第21天:系统架构设计原则——高内聚低耦合】

在软件架构设计中,“高内聚低耦合”是至关重要的设计原则,它能够提高系统的可维护性、可扩展性和灵活性。理解并实践这一原则可以帮助系统架构师在设计过程中构建出健壮的系统。 什么是高内聚? 高内聚指的是模块内部的功能相关性强&#xf…

【Docker】基于docker compose部署artifactory-cpp-ce服务

基于docker compose部署artifactory-cpp-ce服务 1 环境准备2 必要文件创建与编写3 拉取镜像-创建容器并后台运行4 访问JFog Artifactory 服务 1 环境准备 docker 以及其插件docker compose ,我使用的版本如下图所示: postgresql 的jdbc驱动, 我使用的是…

【艾思科蓝】“从零到一:使用IntelliJ IDEA打造你的梦幻HTML项目“

【JPCS独立出版】2024年工业机器人与先进制造技术国际学术会议(IRAMT 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看 学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录 引言:为何选择IntelliJ IDEA? 第一步&#xff1a…

分布式系统实战经验

分布式系统是现代软件架构的核心部分,它通过多个计算节点协同工作来处理大规模数据和请求,提供高可用性、可扩展性和容错能力。在实际开发和运维中,构建分布式系统需要考虑多方面的挑战。以下是一些在分布式系统中的实战经验: 1.…

Elasticsearch 分片迁移与移除集群节点操作

Elasticsearch 分片迁移与移除集群节点操作 问题背景 在单台服务器上部署了 7 个 Elasticsearch 节点,分别为 es-node1 到 es-node7,端口从 9201 到 9207。每个节点都承载大量数据,但没有设置副本分片。由于多个节点共享同一台服务器的硬件…