欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题...

发布时间:2025/3/15 编程问答 57 豆豆
生活随笔 收集整理的这篇文章主要介绍了 docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

我以为经过前面四篇博文的学习,自己对docker的了解最起码入门了,但是当我用docker启动一个81端口的nginx后(宿主机:容器/81:80),在宿主机的firwall防火墙没有添加81端口的情况下,竟然可以直接访问成功,然后试下docker运行mysql容器用3308端口,发现也是在firwall没有添加端口的情况下,仿佛绕过了防火墙可以直接访问到容器,当时就懵逼了…

环境CentOS7

firewall

docker

nginx

解决流程

1、以为是docker和firewall的启动顺序问题导致的

开始我以为是因为我先启动docker后面重启了firewall导致firewall不能够监控docker,然后我还美滋滋的觉得终于找到问题了。最后发现,太天真了,启动顺序完全没影响。

2、宿主机的防火墙和docker容器的防火墙冲突

后面我想到docker也是一个轻量级的linux操作系统,也有自己的防火墙,会不会是因为docker启动自己的防火墙后,权限级别直接绕过了宿主机的防火墙,因此百度了很多,后面按照网上的说法启动容器的时候加上—iptables=false,这样可能就关闭掉了容器的iptables防火墙,然而经过尝试并没有什么用,而且好像第二次启动容器直接就启动不了了,报什么iptables错误

3、直接修改配置文件不使用docker的iptables防火墙

因为我现在的操作系统是CentOS7,所以宿主机用的是firewall,而docker用的是iptables,百度查找说需要在文件/etc/default/docker中添加如下内容

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

然后我美滋滋的跟着执行,发现这个文件根本不存在,因此我又直接新建这个文件,保存,接着执行如下两条命令重新加载文件和重启docker

#重载

systemctl daemon-reload

#重启docker服务

service docker restart

启动容器,重新访问,喵的,还是可以直接访问,仿佛这个配置文件完全没有用

然后直接百度,发现需要在文件/usr/lib/systemd/system/docker.service中添加如下配置,一下是我的文件

[Unit]

Description=DockerApplicationContainerEngine

Documentation=https://docs.docker.com

BindsTo=containerd.service

After=network-online.target firewalld.service containerd.service

Wants=network-online.target

Requires=docker.socket

[Service]

Type=notify

# the default is not to use systemd for cgroups because the delegate issues still

# exists and systemd currently does not support the cgroup feature set required

# for containers run by docker

ExecStart=/usr/bin/dockerd-H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS

ExecReload=/bin/kill-s HUP $MAINPID

TimeoutSec=0

RestartSec=2

Restart=always

EnvironmentFile=-/etc/default/docker

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.

# Both the old, and new location are accepted by systemd 229 and up, so using the old location

# to make them work for either version of systemd.

StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.

# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make

# this option work for either version of systemd.

StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead

# in the kernel. We recommend using cgroups to do container-local accounting.

LimitNOFILE=infinity

LimitNPROC=infinity

LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.

# Only systemd 226 and above support this option.

TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers

Delegate=yes

# kill only the docker process, not all processes in the cgroup

KillMode=process

[Install]

WantedBy=multi-user.target

a、添加配置文件,(-代表ignore error)EnvironmentFile=-/etc/default/docker

b、在ExecStart后面添加如下内容$DOCKER_OPTS

虽然搞不懂为什么,反正接下来修改完/etc/default/docker

后重载重启

#重载

systemctl daemon-reload

#重启docker服务

service docker restart

重新启动nginx容器,我的天,终于不能访问了。

执行如下命令开启81端口

firewall-cmd--zone=public--add-port=81/tcp--permanent

firewall-cmd--reload

我的天,终于可以访问了,测一下docker启动mysql的访问,也被firewall拦截了。

真是要命的东西

结语

虽然最终解决了,但是具体原理并不是太过明了,但是最起码docker启动的容器再也不会绕过firewall的限制,服了。

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。