当前位置: 首页 > 面试题库 >

将局域网IP地址分配给与主机IP地址不同的Docker容器

厉成仁
2023-03-14
问题内容

不熟悉Unix网络,添加虚拟接口等,现在尝试学习。我们正在尝试对我们的应用程序进行docker化。
我的要求是:将ip分配给可从外部应用程序/浏览器访问的docker容器。

容器ip应该基本上可以从同一网络中的其他计算机ping通。我不想使用端口转发。

  1. 我想访问docker容器,就像我们使用ip地址访问VM。没有端口映射,-p标志。如果我在容器中运行任何服务器,例如Apache或Tomcat,则应该使用容器ip和端口对其进行访问。例如:[http:// container_ip:8443]
    在docker中可能吗?

  2. 在我的Unix盒(RHEL 7.1)上运行ifconfig会显示docker0,ens,lo和veth接口。没有eth0。对此感到困惑。


问题答案:

我一直在努力获得该功能,我将分享我的经验以及为获得您所需的一切所做的工作。

简短的答案:

您需要创建 自己的网桥
,将主机的物理网络接口连接到该网桥,并连接要像网络中的普通桥接虚拟机一样运行的每个容器的虚拟接口,然后使容器选择自己的容器启动时的IP地址。

详细答案:

创建持久性网桥

Bridge,是一个器件(在我们的情况下,虚拟设备),其行为类似于网络swiches(主要经营上网络层2),即,它可以连接两个或多个网络接口
是相同的局域网(LAN),如果上它们具有相同的子网

您将创建新的持久性网桥br0(它将在系统启动时自动启动),将物理网络接口添加到其中(在我的情况下为eth0)。请注意,将接口添加到网桥后,该接口不再需要IP地址,因为网桥将获取IP地址并且可以代替接口使用,即,您可以像
使用的网桥 一样 使用网桥 进行 通信
物理接口,它将把输入/输出数据包转发到正确的目的地。您无需将任何硬件(MAC地址)分配给网桥,它将自动采用第一个添加接口的MAC。

警告:强烈建议不要远程执行这些步骤,除非您可以物理访问服务器!如果不小心,可能会失去与服务器的连接。

安装网桥管理实用程序:

sudo apt install bridge-utils

没有bridge-utils包,系统将无法创建网桥。

要创建持久性网桥,请编辑interfaces文件:

sudo vim /etc/network/interfaces

将以下配置添加到文件的末尾(使它们适应您的需求):

auto br0
iface br0 inet static
    bridge_ports eth0
    address 192.168.1.10
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1

现在删除Docker的默认网桥docker0,因为我们不需要它:

sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0

编辑Docker的服务启动脚本以使用您的网桥(br0)而不是Docker的默认网桥(docker0),并传递一些重要的网桥参数:

Ubuntu:

sudo vim /etc/systemd/multi-user.target.wants/docker.service

使文件看起来像这样:

[Service]

ExecStart=/usr/bin/dockerd -H fd:// --bridge=br0 --fixed-cidr=192.168.1.32/27 --default-gateway=192.168.1.1

现在,告诉系统该文件上的更改:

sudo systemctl daemon-reload

重新启动系统

sudo reboot

现在检查您的桥,它应该在那里!

ip addr

现在像波纹管一样创建您的容器, 这将为您的容器提供一个固定IP

  docker run --name myContainer \
  -it --restart always --memory 100M \
  --network bridge --cap-add NET_ADMIN \
  --hostname client1.noureldin.local \
  --add-host "client1.noureldin.local client1":192.168.1.123 \
  mnoureldin/general-purpose:latest /bin/bash -c " \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \
  /bin/bash"

与您的网络要求有关的重要部分是:

  --network bridge --cap-add NET_ADMIN \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \

当然,请确保已iproute2 net-tools iputils- ping在容器中安装了软件包,以便能够执行常见的网络命令(给出由ip命令完成的固定ip )。

第一次运行容器时,您可能没有注意到IP地址的任何更改,因为您的联系人可能没有iproute2软件包(即没有ip命令),只需安装提到的软件包,然后重新启动容器,一切都应该完全如您所愿!

希望能有所帮助。



 类似资料:
  • 问题内容: 创建新容器后,是否可以运行命令以从主机获取容器的IP地址? 基本上,一旦Docker创建了容器,我想滚动自己的代码部署和容器配置脚本。 问题答案: 该的选项就派上用场了。 现代Docker客户端语法为: 旧的Docker客户端语法为: 这些命令将返回Docker容器的IP地址。 如注释中所述:如果在Windows上,请在花括号周围使用双引号而不是单引号。

  • 本文向大家介绍Docker 获取Docker机器的IP地址,包括了Docker 获取Docker机器的IP地址的使用技巧和注意事项,需要的朋友参考一下 示例 要获取docker机器的IP地址,您可以使用以下命令:            

  • 问题内容: 在我的java应用程序中,如果用户输入IP,我们需要显示主机名,如果给出了主机名,那么我们需要显示主机的IP。 例如,如果用户输入IP地址,则应显示应用程序,反之亦然。 有可用的工具来执行此操作吗? 问题答案: 如果您使用Java进行编码,请尝试使用

  • 正如标题所说。我需要能够检索docker主机的IP地址,以及从主机到容器的端口映射,并在容器内部完成此操作。

  • 问题内容: 我有DNS服务器IP地址和主机名。 使用Java,如何使用该IP地址和主机名找到该DNS服务器返回的主机名的IP地址? 问题答案: 看看和方法。

  • 介绍 起初,IP地址只有两层结构:网络与主机。子网地址向其中添加了一层新的结构:不同于仅有主机,网络有分为子网与主机。每一个子网的功能近乎于完整的网络。子网的添加构成了三层网络结构:包含子网的网络,各自由若干主机构成。IP地址由此被分为三个部分:网络ID,子网ID与主机ID。IP地址长度仍固定为32位,其中,A类网络8位子网掩码,B类网络16位子网掩码,C类网络24位子网掩码。 更多信息 对于每一