如何实现docker内部容器之间的端口访问

这篇具有很好参考价值的文章主要介绍了如何实现docker内部容器之间的端口访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker 的普及促使众多应用迁至其上部署,得益其诸多优势。然而,相较于传统非 Docker 环境中各应用通过 127.0.0.1:端口 即可轻松互访,Docker 容器若未经端口映射,彼此间端口则无法直接相通。是否存在更优方案以应对这一挑战?

1 场景描述

场景简述:alpine-client 与 alpine-server 两容器,前者访问后者监听之端口,以此探析 Docker 内部容器间端口访问机制。

2 建立两个容器

2.1 通过 Dockerfile 构建镜像

由于这次测试功能很简单,可以通过一个 Dockerfile 来创建容器,一个镜像加载成两个容器,容器里执行的代码不同而已。

2.1.1 创建 Dockerfile 文件

此 Dockerfile 可以用做一个通用的模板,包含了基本功能框架,用户可以自行在此基础上修改。

# 以 alpine:3.10 为基础镜像
FROM alpine:3.10

# 设置镜像源为清华大学镜像
RUN echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.10/main" > /etc/apk/repositories \
    && echo "https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.10/community" >> /etc/apk/repositories \
    && apk update && apk upgrade

# 安装依赖包及工具
RUN apk add --no-cache \
    bash \ 
    netcat-openbsd

# 设置工作目录
WORKDIR /root

# 拷贝需要的文件,支持通配符
# COPY *.sh /root/

# 在 Dockerfile 中添加Entrypoint test.sh,根据需要添加即可
# ENTRYPOINT ["/bin/bash", "-c", "/root/test.sh"]

简单解释一下这个 Dockerfile 模板文件:

1)引用基础镜像
这个必须有(此语句后面的语句都是可选项),且必须是第一句。我习惯引用 alpine 镜像,体积小巧、功能强大。

2)设置镜像源
先改写镜像路径文件,并运行 update、upgrade,使更改生效。关于镜像源,清华、阿里根据您的喜好选择就可以了,主要是用来加快软件安装速度。

3)安装依赖包及工具
使用 RUN 命令来执行依赖包及工具的安装,安装工作最好是在一个命令里执行完成,这样镜像就不会添加很多层,导致镜像文件变大。其中"\“是用来将分行的命令字符串串接起来,”&&"是用来按序依次安装多个命令。

4)设置工作目录
设置工作目录后,容器内部默认目录就是设置的工作目录,方便操作。

5)拷贝需要的文件
这一步可以将需要的文件从本机拷入镜像文件。

6)执行 ENTRYPOINT 入口脚本(或者使用CMD)
当容器启动时,会执行此处指定的脚本或命令。

2.1.2 编译镜像

docker build -t alpine-net:1.0.0 .

2.2 生成容器

生成 alpine-client 容器:

docker run -itd --name alpine-client alpile-net:1.0.0

生成 alpine-server 容器:`

docker run -itd -p 8888:8888 --name alpine-server alpile-net:1.0.0

alpine-server 容器加了一个端口映射,将 alpine-server 里监听的 8888 端口映射到该容器的宿主机的 8888 端口。

3 获取 IP 地址

3.1 获取 alpine-client 相关 IP 地址

3.1.1 获得 alpine-client 容器本身的 IP 地址

在 alpine-client 终端输入:

ifconfig

运行后返回结果如下:

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:65535  Metric:1
          RX packets:197 errors:0 dropped:0 overruns:0 frame:0
          TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:22832 (22.2 KiB)  TX bytes:5821 (5.6 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:524 (524.0 B)  TX bytes:524 (524.0 B)

得到两个 IP ,127.0.0.1 和 172.17.0.2

3.1.2 获取 alpine-client 容器网关 IP 地址

在 alpine-client 终端输入:

route -n

运行后返回结果如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

得到网关 IP 地址:172.17.0.1。

3.1.3 获取 alpine-server 容器网关 IP 地址

同上操作,过程略。
可以得到 alpine-server 相关地址:
alpine-server 本机地址:127.0.0.1 和 和 172.17.0.3
alpine-server 网关地址:172.17.0.1

4 测试访问

在 alpine-server 的终端里输入网络端口监听命令:

nc -lk 8888 # 监听 8888 端口

监听 8888 端口,测试让 alpine-client 连接。以下如果没有特殊说明,默认命令行运行窗口为 alpine-client 的终端窗口

4.1 通过容器名称访问

nc alpine-server 8888

返回:

nc: getaddrinfo: Name does not resolve

提示:目标容器名 alpine-server 找不到,所以连接失败!

4.2 通过容器 IP 访问

nc 127.17.0.3 8888

连接失败!说明容器端口并没有对“隔壁”容器开放。

4.3 通过网关 IP 访问

nc 127.17.0.1 8888

连接失败!说明容器端口映射,并不是映射到网关上。

4.4 通过 docker 宿主机名访问

docker 提供了一个宿主机名:host.docker.internal,所有容器都可以访问到这个主机名。测试:

nc host.docker.internal 8888

连接成功!且在 alpine-client 输入的信息可以成功发送到 alpine-server,且实现的是双向通讯。可以通过 host.docker.internal 这个主机名可以访问到容器映射出来的端口,但无法访问到容器内部的端口。

4.5 通过 docker-compose 创建容器的方案

此部分在我的博文《docker安装、调试qsign签名服务器》里已经应用过,此处就不再赘述。这种方式的 docker-compose.yml 文件已经定义好了容器之间的关系,将各个容器纳入一个统一的网卡里,灵活性稍差一点,推荐用在成熟、稳定的项目里。

此文描述的方式是采用“分离式”,各个容器是独立的,容器之间的联系通过映射端口的方式,通过 host.docker.internal 进行连接,便于动态灵活调整连接关系,以及系统的扩展等。

5 总结

在未实施容器分组编排的场景中,本文深入探究并揭示了一种利用 host.docker.internal 实现容器间直接互访的有效途径。相较于传统的基于 IP 地址的访问方式,选用 host.docker.internal 作为连接标识具有显著优势:
1)稳定性增强:
在容器内部的配置文件中,可以将 host.docker.internal 作为固定的目标地址进行硬编码(即“写死”)。此举消除了因依赖动态分配或可能变动的 IP 地址而导致的配置脆弱性。当容器重启、迁移或者网络环境发生调整时,IP 地址可能会发生变化,而使用 host.docker.internal 则能确保连接指向始终有效,无需随 IP 变动而频繁更新配置。
2)简化管理:
采用 host.docker.internal 作为连接字符串,简化了容器间交互的管理复杂度。运维人员无需跟踪每个容器的具体 IP 地址,也不必在 IP 变化时手动调整关联容器的配置文件。这种抽象化的寻址方式使得容器间的依赖关系更为清晰,易于理解和维护。
3)兼容性与可移植性提升:
host.docker.internal 是 Docker 系统内建的特殊域名,旨在提供一种标准、跨平台的方式来访问宿主机提供的服务。这意味着无论宿主机的实际IP如何变化,或者在不同的部署环境中(如开发、测试、生产),只要支持 Docker,该域名即可确保容器间的互访顺利进行。这种设计增强了容器应用在不同环境中的兼容性和可移植性。

综上所述,在无编排工具介入的情况下,利用 host.docker.internal 进行容器间的互访是一种既稳健又便捷的选择。它不仅避免了因 IP 变动引发的连接失败问题,还简化了管理流程,提升了应用在不同 Docker 环境下的适应性。文章来源地址https://www.toymoban.com/news/detail-855570.html

到了这里,关于如何实现docker内部容器之间的端口访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker容器内部无法访问外网原因之一

    部署了一个Docker环境,宿主机可以访问Internet,启动了一个容器发现容器里的服务无法访问Internet,Docker网络使用的是桥接(bridge)模式。 使用Docker桥接模式启动的容器,宿主机如果可以访问外网,按理来说Docker容器本身也可以访问外网的。其原理:容器网卡与宿主机的dock

    2023年04月25日
    浏览(53)
  • 两台服务器上的两个docker容器之间配置ssh免密登录

    因为要在两台服务器的容器上使用ucx实现GPU的RDMA,所以需要两个容器之间ssh免密登录 步骤如下(所有步骤均在容器内部进行) 切换成root用户 在容器内部安装openssh: # apt-get install openssh-client openssh-server 编辑ssh的配置文件,更改ssh的端口: # vim /etc/ssh/sshd_config 在最后一行加

    2024年03月13日
    浏览(54)
  • Docker 容器正常启动但通过ip加端口无法访问

    前置条件:使用的阿里云轻量云服务器,ECS服务器应该也是类似的。 问题排查过程 排查linux服务器本身的防火墙是否开启,查看后是关闭的。 排查轻量云服务器的安全组是否将端口加入安全组,否则也是无法访问的,端口已加入安全组,可以排除这个问题。 通过tcping等端口

    2024年02月08日
    浏览(38)
  • 解决docker容器之间网络互通 启动web服务只能本地localhost访问无法从外部访问

    docker容器之间相互访问 1.查看当前的网络 Copy [root@host ~]# docker network ls NETWORK ID          NAME                DRIVER              SCOPE 3dd4643bb158        bridge              bridge              local 748b765aca52        host                host                local 4d59a0cd3ff

    2024年02月10日
    浏览(48)
  • 如何使用Docker构建Nacos容器并实现固定公网地址远程访问

    Nacos是阿里开放的一款中间件,也是一款服务注册中心,它主要提供三种功能:持久化节点注册,非持久化节点注册和配置管理。 本例通过结合Cpolar内网穿透实现远程访问Nacos 提供的UI (控制台)界面,帮助管理所有的服务和应用的配置 Cpolar内网穿透是一种安全的内网穿透云服务

    2024年01月17日
    浏览(49)
  • 让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能

    要让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能。 Docker提供了多种网络驱动程序,例如 bridge 、 host 、 overlay 等。其中, bridge 是默认的网络驱动程序,它会在每个Docker容器内创建一个虚拟的网卡,同时会为每个容器分配一个独立的IP地址

    2024年02月14日
    浏览(37)
  • 如何在Docker中搭建MinIO容器并实现无公网ip远程访问本地服务

    MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼容Amazon S3 API,因此可以与现有的S3工具和库无缝集成。MinIO的设计目标是高性能、高可用性和可扩展性。它可以在分布式模式下运行,以满足不同规模的存储需求。 MinIO是

    2024年01月17日
    浏览(49)
  • 如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问

    本文主要介绍如何在群辉7.2版本中使用Docker安装容器魔方,并结合Cpolar内网穿透工具实现远程访问本地网心云容器魔方界面. 容器魔方是由网心云推出的一款Docker容器镜像软件,通过简单安装后即可快速加入网心云共享计算生态网络,为网心科技星域云贡献带宽和存储资源,

    2024年02月02日
    浏览(65)
  • docker 容器如何查看正在运行容器的端口映射

    1、查看docker容器的版本 2、查看正在运行的容器 3、查看容器的端口映射 总结:到此就完成了查看正在运行容器的端口映射.

    2024年02月12日
    浏览(45)
  • 如何在CentOS使用Docker搭建MinIO容器并实现无公网ip远程访问本地服务

    MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼容Amazon S3 API,因此可以与现有的S3工具和库无缝集成。MinIO的设计目标是高性能、高可用性和可扩展性。它可以在分布式模式下运行,以满足不同规模的存储需求。 MinIO是

    2024年04月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包