docker端口映射及外部无法访问问题

docker容器内提供服务并监听8888端口,要使外部能够访问,需要做端口映射。

docker run -it --rm -p 8888:8888 server:v1

此时出现问题,在虚机A上部署后,在A内能够访问8888端口服务,但是在B却不能访问。

这应该是由于请求被拦截。

一、查看firewall-cmd --state

如果输出的是“not running”则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了。

如果输出的是“running”,表示当前FirewallD正在运行,需要再输入下面的命令查看现在开放了哪些端口和服务:

firewall-cmd --list-ports
firewall-cmd --list-services

解决方案有两种:

1.关闭FirewallD服务:

如果您不需要防火墙,那直接关掉FirewallD服务就好了

systemctl stop firewalld.service

2.添加策略对外打开指定的端口:

比如我们现在要打开对外5000/tcp端口,可以使用下面的命令:

firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload

如果只是临时打开端口,去掉第一行命令中的“--permanent”参数,那么当再次重启FirewallD服务时,本策略将失效。

二、ip转发没有打开

sysctl net.ipv4.ip_forward

显示net.ipv4.ip_forward=0则表示未打开。

三、service iptables打开并拦截了

可关闭service iptables

service iptables stop

若docker run时出现错误:

iptables: No chain/target/match by that name.

则只需重启docker服务即可

service docker restart

或者:

#设置iptables防火墙为开机启动项
systemctl enable iptables.service

#启动防火墙使配置文件生效
systemctl start iptables.service

#停止防火墙
systemctl stop iptables.service

#重启防火墙使配置文件生效
systemctl restart iptables.service

最终版本:

启动docker并进行端口映射后,docker会在iptables中添加DNAT规则,将收到的对应端口的包转换ip并进行转发,同时添加规则将所有来自docker网域的ip进行转换。

但是在Centos7上出现docker可以正常访问外网,但是外网发出的请求在经过eth1接收转发后送达不到docker0,或者送到却出现(oui Unknown)的状况。暂时不清楚这到底是为什么经过DNAT后无法送达docker0.

最终解决办法是在启动docker后,重启iptables

service iptables restart

清空docker添加的所有规则,而后添加规则

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

将所有来自docker的包172.17.0.0/16的ip替换为本机ip并发送,以达到docker访问外网的目的。

到此这篇关于docker端口映射及外部无法访问问题的文章就介绍到这了,更多相关docker端口映射及外部访问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker 给运行中的容器设置端口映射的方法

    一.概念 Docker 端口映射即映射容器内应用的服务端口到本机宿主机器. 二.实现 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过 -P 或 -p 参数两种方式来指定端口映射. 1. 随机映射 使用 -P 参数时,Docker 会随机映射一个端口到内部容器开放的网络端口,如下开启一个 nginx 服务: $ docker run -d -P nginx e93349d539119dc48dc841e117f6388d6afa6a6065b75a5b4aedaf5fb2a051fc

  • docker容器启动后添加端口映射

    概要 网上有许多人在查找关于容器启动后能否进行端口映射的问题.我曾经也问过度娘,很遗憾我没找到.本文就这个问题给出一个解决方法,旨在抛砖引玉.本文的思路是使用iptables的端口转发,这也是docker端口映射内部的实现机制,只不过我是显示地写出来罢了,为的就是让查找这个问题的人对docker的端口映射有一个直观的了解. 结论:容器启动后是可以添加端口映射的,但不建议手工添加,最好使用docker提供的功能. 步骤 创建两个容器并进行了端口映射,结果如图所示: 假如,我start一个容器,其内

  • Docker端口映射的实现

    docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 亦可使用Dockerfile文件中的EXPOSE指令来配置. 端口映射可使用-p.-P来实现: -p指定要映射的端口,一个指定端口上只可以绑定一个容器 -P将容器内部开放的网络端口随机映射到宿主机的一个端口上 端口映射支持的格式: ip:hostport:containerport #指定ip.指定宿主机port.指定容器port ip::containerport #指定ip.未指定

  • Docker端口映射实现网络访问的方法

    Docker运行容器之后却发现没IP,没端口,那要如何访问容器呢? 下面我来介绍下docker通过端口映射来实现网络访问 一.从外部访问容器应用 在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射. 先来说说p和P吧 -p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器 -P 它会随机映射一个端口至容器内部开放的网络端口(范围不详,似乎都上万) 先申明

  • 详解Docker 端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定端口映射.当使用-P(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万): [root@docker ~]# docker run -d --name nginx_1 -P nginx:latest

  • Docker 端口映射详细介绍

    Docker 端口映射: 最近抽空,把Docker 端口映射的资料整理了一下,以便后续项目应用,大家也可以参考下. # Find IP address of container with ID <container_id> 通过容器 id 获取 ip $ sudo docker inspect <container_id> | grep IPAddress | cut -d '"' -f 4 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的.此外

  • Docker容器端口映射后突然无法连接的排查过程

    一.背景 一般需要对外提供服务的Docker容器,我们在启动时后使用-p命令将对外访问端口暴露给外部,例如启动Docker Registry,我们将5000端口映射出来供外部访问: docker run -d -p 5000:5000 registry 但最近碰到一个非常奇怪的情况:研发组里一个CentOS 7测试环境里部署有Docker Registry,并对外暴露了端口.启动容器后一段时间内都是可以正常工作的,但在不定时间间隔后,外部主机就会出现无法从仓库中拉取镜像的情况,提示TimeOut

  • 用KWF打造与众不同的VPN服务器

    大家常用Windows系统的"路由和远程访问"组件架设VPN服务器,但此方法配置较为复杂.如果能将网络防火墙和VPN功能集成在一起,就可以简化架设过程,并且还可以利用防火墙策略增强VPN服务的安全.Kerio Winroute Firewall(以下简称KWF)就是这样一款工具,它内置了VPN服务器,并且还可以利用KWF的内置功能增强安全.方便VPN管理,如何利用KWF架设VPN服务器,下面就一起来看吧! 安装VPN服务器 KWF内置了VPN服务,并且VPN服务的安装过程非常简单,不需

  • Docker学习笔记之Docker端口映射

    最近在学习docker,今天了解了Docker端口映射,给自己留个小笔记,也分享给大家 为什么要端口映射? 在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口. 端口映射的指令是什么? docker指令:docker run -p ip:hostPort:containerPort redis 使用-p参数会分配宿主机的端口映射到虚拟机. IP表示主机的IP地址. hostPort表示宿主机的端口. containerPort表示虚拟机的端口. 支持的格

  • docker端口映射及外部无法访问问题

    docker容器内提供服务并监听8888端口,要使外部能够访问,需要做端口映射. docker run -it --rm -p 8888:8888 server:v1 此时出现问题,在虚机A上部署后,在A内能够访问8888端口服务,但是在B却不能访问. 这应该是由于请求被拦截. 一.查看firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了. 如果输出的是"

  • Docker 动态修改容器端口映射的方法

    前言:Docker端口映射往往是Docker Run命令时通过-p将容器内部端口映射到宿主机的指定端口上,一般来说容器的端口所对应的端口是提前确定需要映射的.但是有些情况下不得不需要临时映射端口,例如Docker中运行着MySQL容器,默认端口是不开放的.那么有什么办法可以让运行中的容器暴露指定的端口呢?客官请往下看---> 方法一:更改Docker配置文件(有风险) 通过修改Docker的配置文件来达到我们的目的,一般来说需要修改以下的文件config.v2.json和hostconfig.j

  • Docker初级网络端口映射的配置

    端口映射 Docker容器启动之前,如果不进行端口映射,在容器外部是无法通过网络来访问容器内的网络应用和服务.因为容器中常常会运行一些网络应用和服务,如果想在容器外部通过网络来访问容器内的网络应用和服务,就需要对该容器进行端口映射,可以通过docker run命令中的-P或-p选项来进行端口映射. 随机端口映射 当通过docker run命令中的-P选项来进行端口映射时,Docker会随机映射一个端口到容器开放的网络端口. 以nginx为例,先拉取nginx的镜像. [root@izoq008r

随机推荐