首页 > 其他分享 >[docker] 浅谈Docker:网络模式及从容器内部访问宿主机的IP地址

[docker] 浅谈Docker:网络模式及从容器内部访问宿主机的IP地址

时间:2024-03-27 19:12:15浏览次数:31  
标签:容器 浅谈 -- 宿主机 网络 模式 IP地址 docker

0 序

  • 本文系转载参考文献,属于非原创的笔记类博文。
  • 最新结论:从Docker容器内部访问宿主的IP地址的几种方法,推荐 基于 Bridge 模式 + --link 访问别的服务 + 172.16.0.1(访问宿主机)。

1 Docker的网络模式

  • docker是比较流行的容器技术,docker镜像方便程序员对应用统一的要求,打包部署便捷。但是不足的地方在于docker的网络方面。
  • docker有4种网络模式,分别是:
  • host模式
  • container模式
  • none模式
  • bridge模式
  • 分别使用-net, --network指定。如:-net=host-net=container(容器名或ID)-net=bridge指定各种网络模式。

1.1 Host模式

简介

  • host模式相当于Vmware中的桥接模式,与宿主机在同一个网络中,但是没有独立的IP地址
  • docker使用Linux的Namespace隔离网络等设施。
  • 一个Network Namespace 提供了一份独立的网络环境,包括网卡路由Iptable规则等都与其他的Network Namespace隔离。
  • 当我们启动容器指定其网络模式为host时,启动指定命令如下:
docker run --name xxx --net=host xxxx

此处使用-net指定docker容器所使用的网络模式。

  • 在使用host模式时,容器将不会获得一个独立的Network Namespace,不会模拟出自己的网卡、配置自己的ip等。而是和宿主机共用一个namespace。所有此模式使用的网络和宿主机上的网络是相同的。

使用

  • 在运行容器时,可以使用--network=host选项,这将使得容器共享【宿主机】的网络命名空间,使得容器内部可以直接访问宿主的IP地址。

Docker 提供了一个主机网络,让容器可以共享主机的网络堆栈。这种方法意味着容器内的本地主机解析为物理主机,而不是容器本身。通过添加 --network=host 标志与主机网络一起启动容器:

docker run --network=host your_image_name

例如:

docker run -d --network=host my-container:latest

1.2 container模式

  • container模式是将新创建的容器和已经存在的容器共享一个Network Namespace ,而不是和宿主机共享。
  • 在创建容器时指定容器,就会共享被指定的容器的ip、端口等。两个容器仅仅是网络共享,其他当面还是隔离的,如文件系统、进程列表等等。俩个容器之间通过IO网卡进行本地通信。

1.3 none模式

  • 此模式下,docker拥有自己的网络命名空间,但是不会为容器进行任何的网络配置,容器没有网卡、ip、路由等信息,需要我们自己为docker容器添加网卡配置ip,不会创建网络设备。

1.4 bridge模式【默认模式】

简介

  • bridge模式是docker默认的网络模式,此模式创建一对虚拟网络设备,一半在容器上,一半再虚拟网络桥上。为每一个容器分配NetWork Namespace、网卡、ip等信息,将docker容器连接到虚拟网桥上。

  • 此模式比较常用,在我们的docker服务启动时,主机上会创建一个名为docker0的虚拟网桥,在主机上启动的容器服务都会连接到这个虚拟网桥上,和交换机的原理有些类似,此时主机上的容器通过此"交换机"连接在二层网络中。

  • 再后就是为容器分配ip,Docker会从RFC1918(私有网络地址分配)所定义的私有ip网段中选择一个核宿主机不同的ip地址和子网分配给docker0,连接到docker0的容器就从此子网中选择一个未占用的ip使用。

一般会使用172.17.0.0/16这个网段,并将172.17.0.0/16分配给docker0网桥
在宿主机上使用ifconfig可以看到docker0,可以看做是网桥的管理接口,在宿主机上作为一块虚拟网卡使用。在其他大佬的文章上找到一张图,很清晰的画出了网络拓扑。宿主机的ip地址为eth0

  • 常用的还是bridge模式,容器之间可以通信,创建容器时默认创建网络模式。

使用

  • 使用特殊的宿主地址

在Linux系统中,可以使用特殊的IP地址172.17.0.1来代表【宿主机】,这个IP地址通常用于Docker默认的网络桥接模式中。

  • 案例1:下面画一张拓扑图来详细地讲述docker内的容器是如何进行通信的。

如上图所示,在宿主机中,在运行容器时默认采取【bridge网络模式】,当docker服务启动时会创建docker0网卡,所有的容器借助于此虚拟网卡和宿主机以及外界进行通信,容器之间可以直接通信。

上述方式需要进入容器中查看/etc/hosts文件中的主机的信息,显得过于麻烦,在运行docker容器时可以直接将容器的ip对应于域名,容器之间互相访问通信时直接根据域名通信即可。

  • 使用docker --link模式来实现,实现方式 如下,使用docker跑起乱来一个nginx容器

再跑起来一个基于centos的容器,在此时使用–link命令在此容器中直接添加nginx容器的域名解析信息(将mynginx的172.17.0.2解析为nginx1,之后在centos创建的容器中可以直接访问nginx1即可访问mynginx容器),操作如下。

docker run --name mycentos -id --link mynginx:nginx1 centos

创建完成之后进入mycentos容器中,使用curl nginx1就可直接访问mynginx容器中的服务了,方便快捷。

2 补充方法:【挂载宿主的网络命名空间到容器内部】

  • 可以手动挂载宿主的网络命名空间到容器内部。这种方法比较复杂,但是也是可行的。可以使用nsenter命令来实现这一点。
  • 首先,需要获取宿主的网络命名空间ID:
sudo docker inspect --format '{{ .State.Pid }}' <container_id_or_name> 
  • 然后,使用nsenter命令将容器加入到宿主的网络命名空间中:
sudo nsenter --target <host_pid> --net <your_command> 

这样,就可以在容器内部直接访问宿主的网络。

X 参考文献

标签:容器,浅谈,--,宿主机,网络,模式,IP地址,docker
From: https://www.cnblogs.com/johnnyzen/p/18100010

相关文章

  • [docker] 浅谈Docker:Docker容器中环境变量的应用
    0序1设置环境变量1.1场景:在Dockerfile中设置环境变量在构建Docker镜像时,可以在Dockerfile中使用ENV指令来设置环境变量ENVMY_ENV_VAR="ABC123"ENV指令用于设置环境变量,语法为ENV<key><value>ENV<key>=<value>1.2场景:使用dockerrun命令设置环境变量使用d......
  • 【Azure Service Bus】启用诊断日志来获取客户端访问Azure Service Bus的IP地址 [2024
    问题描述在使用ServiceBus中,遇见了莫名奇妙,不知来源的访问,但是又不敢直接修改AccessKey(担心影响正常业务),所以想通过访问服务的客户端IP地址来分析,到底是那里的客户端在访问ServiceBus服务? 问题解答经过调查,可以通过开启AzureServiceBus的诊断日志来实现此目的。......
  • 浅谈如何阅读和编写mib文件
    MIB(ManageInformationBase)管理信息库,它是网络管理数据的标准,这个标准里规定了网络代理设备必须保存的数据项目,数据类型,以及允许在每个数据项目中的操作。通过对这些数据项目的存取访问,就可以得到改网关的统计内容。再通过对多个网关统计内容的综合分析即可实现基本的网络管......
  • 浅谈位置编码(RoPE)(未完待续...)
    当前版本为本文的尝鲜版,稳定版尚未发布:位置编码:https://zhuanlan.zhihu.com/p/454482273transformer的sin位置编码本身已经包含了相对位置信息,本身就是一种包含相对信息的绝对位置编码。因为它符合一种形式:\[PE_{t+k}=f(k)\cdotPE(t)\]而这种编码一种比较尴尬的地方就在于,这......
  • 浅谈分布式任务调度系统Celery的设计与实现
    Celery是一个简单、灵活且可靠的分布式任务队列,它支持任务的异步执行、进度监控、重试机制等功能。Celery的核心组件包括:Broker:消息中间件,如RabbitMQ。用于任务的发布和订阅。Worker:任务执行者,运行在各个Worker节点上。Client:任务提交者,运行在应用程序中。使用步骤:在......
  • 【PLC学习十一】浅谈西门子PLC的PID控制功能
    【PLC学习十一】浅谈西门子PLC的PID控制功能PID是自动控制中最常见的控制器,那么他在PLC中是如何实现的呢?文章目录【PLC学习十一】浅谈西门子PLC的PID控制功能前言一、PID是什么?二、西门子PID模块1.输入参数CONT_C2.输出参数CONT_C三、CONT_C实际使用1、写一个单独......
  • 浅谈Java中的集合
    下面内容自己结合B站视频写的总结为什么要用集合一般情况下保存多个数据使用的数组,但是数组灵活性不够,有很多不足,如:长度开始时必须指定,而且指定之后不能修改保存的必须为同一类型的元素使用数组进行增删比较麻烦集合1、集合可以根据需要动态增加或减少其大小2、Jav......
  • 14IP地址、主机名、域名
    IP地址每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯IP地址主要有2个版本,V4版本和V6版本(V6很少用)IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.88.101就是一个标准的IP地址可以通过命令:ifconfig,查看本机的ip地址如无法使用ifconfig命令,可以安装:y......
  • 在Linux中,如何检查和配置IP地址?
    在Linux中,检查和配置IP地址是常见的系统管理任务。以下是详细步骤和解释:1.检查IP地址使用ifconfig命令(在某些最新版本的Linux中,可能需要使用ipaddr或ipaddress代替):ifconfig或者ipaddrshow这些命令会显示所有网络接口的信息,包括IP地址、子网掩码和MAC地址等。通常,IP......
  • 华为认证hcia学习 第二章IP地址的配置
    IPv4( Internet Protocol version 4,网际协议版本4)协议族是TCP/IP协议族中最为核心的协议族。它工作在TCP/IP协议栈的网络层,该层与OSI参考模型的网络层相对应。网络层提供了无连接数据传输服务,即网络在发送分组时不需要先建立连接,每一个分组(也就是IP数据报文)独立发送。二......