linux系统中docker服务和普通服务对外访问端口不通的问题

linux系统中docker服务和普通服务对外访问端口不通的问题

  前一段时间,在一个新的centos 7.4 服务器上运行项目,共有四个项目,因为特殊原因,两个是通过docker 运行,另外两个是通过nginxtomcat 运行。
  当运行起来以后,发现docker 运行的那两个可以正常在外网访问,而另外两个不是docker 的死活访问不到。
  我的排除问题的方法如下:

1、检查项目是否运行:

查看了tomcat是否运行:
输入如下命令:

ps -aux|grep tomcat

  的确tomcat运行正常,看过日志,运行也没有问题
查看了nginx 映射的另一个项目,端口仍存在,我后来直接输入了ss -tnl 命令:
结果如下:
在这里插入图片描述
  奇怪了,端口也是正常运行的,为什么偏偏docker的能对外访问,那两个不行呢。

那现在的情况如下图:

运行环境外网端口内网端口
docker服务7001(正常访问)10001(正常)
docker服务7002(正常访问)10002(正常)
nginx服务7003(访问失败)10003(正常)
tomcat服务7004(访问失败)10004(正常)

在这里插入图片描述

2、确认内网访问:

  难道是另外两个外网端口忘记开了?我赶紧试一下这两个不通的项目是否可以内网访问:
分别用了如下命令:

curl -i http://localhost:10003

和:

wget http://localhost:10003

  10004 也如上试过了,内网没问题,因此我判断端口没开,赶紧把铁锅甩了出去。
在这里插入图片描述

3、再次排查

  第二天,服务器提供方更狠,直接说内网telnet我的那俩端口访问不到,但是我内网是可以的,真的太奇怪了。
  整个过程我都没有想过防火墙的问题。为什么呢?
因为首先这是个新服务器,并没有设置过端口的规则,docker 的服务是可以的,另外两个不可以,那问题应该不是防火墙的问题(后来发现是自己想的太少了。。)
  后来我们架构师说,你把那两个通的项目先关掉,用那俩不通的项目先试试这两个通的端口,试试能不能外网访问?
在这里插入图片描述
  这想法我怎么没想到,哈哈,我赶紧试试,发现,的确也不能访问,那这样就赖不上人家了,只能自己再看了。

4、最终问题原因

  在最后,我先关掉了一下防火墙,因为centos 7 默认安装的防火墙是firewall ,所以我先将防火墙关掉:

关掉firewall 防火墙

systemctl stop firewalld.service 关闭防火墙

   然后访问了下项目,才发现,项目都通了,竟然都可以正常访问。
在这里插入图片描述

  为什么docker 的可以,其他的竟然不可以,防火墙是肯定没有设置过,为什么呢?难道是docker 在安装的时候,自动设置了?

5、安装iptables

  既然找到了问题,以前没有设置过firewall ,我想直接重新安装iptables 的了。

首先关闭firewall开机启动

systemctl disable firewalld.service 

确认防火墙是否关掉
  关闭后显示notrunning即表示已关闭

firewall-cmd --state 

安装iptables

yum install iptables 
yum install iptables-services

  如果yum 命令不可用,可以参照另一篇文章,linux命令—使用yum命令时出错,Could not retrieve mirrorlist

启动iptables

service iptables start  或者 systemctl start iptables

设置开机启动iptables

systemctl enable iptables.service

编辑防火墙文件,输入如下命令:

vim /etc/sysconfig/iptables

在其中开启了我的那四个端口:

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10002 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10003 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10004 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

  即如上,我开启了我的 80、10001、10002、10003、10004 端口。
设置完之后,重启iptables

service iptables restart

这样就可以正常访问项目了。

  虽然最后解决了问题,但是我还是没搞明白,为什么docker 运行的项目是可以访问,其他的不行呢?期望大神解惑~

2021年3月2号补充

一位大佬解惑,如下:

  docker 容器创建时,如果你指定了容器映射的宿主机端口,docker 会自动在 iptables 的规则链中加上自己容器对外提供服务所需的规则链,所以 docker 容器跑的服务可以访问到。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 作为一个 AI 语言模型,我认为在安装 Docker 时,Windows 和 Linux 系统都有各自的优劣势。Windows 系统安装 Docker 时需要安装 Docker Desktop,但是它提供了更友好的图形界面和更好的兼容性。而 Linux 系统则可以通过命令行更方便地进行 Docker安装和管理,同时也更加稳定和安全。因此,具体选择哪个系统安装 Docker,需要根据自己的需求和使用场景来决定。 ### 回答2: 在选择在Windows系统Linux系统安装Docker时,我们需要考虑多个因素。 首先,Windows系统Linux系统的架构和设计思维不同。Windows系统是商业性操作系统,主要用于桌面应用程序,因此在安装Docker时可能会面临一些限制和兼容性问题。相比之下,Linux系统是以服务器和开发者为目标的操作系统,对于Docker的支持更加友好和成熟。 其次,Windows系统上的Docker使用了Hyper-V虚拟化技术,这可能会导致性能上的一些损失,特别是在资源消耗方面。而Linux系统上的Docker则可以直接利用宿主机的核心功能,避免了这些性能损失。 此外,Linux系统上的Docker社区活跃度更高,拥有更多的用户和开发者参与。这意味着在遇到问题时,我们可以更快地找到帮助和解决方案。 然而,在某些情况下,由于特定的需求或限制,选择在Windows系统安装Docker可能更为合适。例如,如果我们需要在Windows操作系统使用与Docker相关的特定工具或应用程序,那么在Windows上安装Docker将更加便利。 综上所述,根据需求和具体情况来选择在Windows系统Linux系统安装Docker是必要的。通常情况下,由于Linux系统Docker的支持更好且性能更佳,我们更推荐在Linux系统安装Docker。 ### 回答3: 在Windows系统Linux系统安装Docker,我们需要考虑一些因素来确定哪个更好。 首先,Windows系统是一个广泛使用的操作系统,有许多开发人员和用户熟悉。因此,在Windows系统安装Docker可以使这些用户更容易上手并开始使用Docker。此外,Windows系统提供了一些图形用户界面(GUI)工具,可以方便地管理和监视Docker容器。 然而,Linux系统对于Docker来说也有一些显著的优势。首先,Docker最初是在Linux系统上进行开发和优化的,因此在Linux系统上的性能和稳定性可能会更好。此外,许多云计算平台和服务器都是基于Linux系统的,所以在Linux安装Docker更符合这些环境的需求。 另一个不容忽视的因素是Docker系统资源的要求。Linux系统相对来说较轻量,因此它在运行Docker时通常需要较少的资源。与之相对,Windows系统要求更高的硬件资源,这可能会导致在较老的或资源受限的设备上运行Docker时遇到性能问题。 最后,我们还需要考虑到个人或团队的技术水平和偏好。如果你或你的团队已经熟悉了Windows系统,那么在Windows上安装Docker可能更容易。但如果你更熟悉Linux系统,或者你的项目需要在Linux环境下进行开发和测试,那么在Linux安装Docker可能更适合。 总结起来,选择在Windows系统还是Linux系统安装Docker取决于多个因素,包括你的操作系统偏好、技术水平、项目需求和可用资源。对于大多数情况来说,Linux系统可能更适合运行Docker,但是Windows系统也提供了一些方便的工具和界面来管理Docker容器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁壮成长的凌大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值