Docker端口映射实现网络访问

本文详细介绍了如何使用Docker的端口映射功能来实现容器内外的网络访问。包括基本概念、不同端口映射格式的应用场景,以及如何映射特定端口和UDP端口的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker端口映射实现网络访问

首先,大家如果看到有什么不懂的地方,欢迎吐槽!!!
我会在当天或者第二天及时回复,并且改进~~


Docker运行容器之后却发现没IP,没端口,那要如何访问容器呢?
下面我来介绍下Docker通过端口映射来实现网络访问

一、从外部访问容器应用

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射。
先来说说p和P吧

  • -p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器
  • -P 它会随机映射一个端口至容器内部开放的网络端口(范围不详,似乎都上万)

先申明一下,我这边
client ip address 为192.168.0.225
registry ip address 为192.168.0.216:5000

docker run -d -it --name nginx -P 192.168.0.216:5000/nginx
docker ps -a            #查看容器是否在运行 
docker logs nginx       #查看nginx容器的log

端口映射支持的格式有:

ip:hostport:containerport   #指定ip、指定主机port、指定容器port
ip::containerport           #指定ip、未指定主机port、指定容器port
hostport:container          #未指定ip port、指定主机port、指定容器port     

二、映射所有接口ip

下列命令查看到0.0.0.0监听5000端口
docker run -d -it -p 5000:5000 --name registry 192.168.0.216:5000/registry
docker ps -a | grep 5000     

多次使用-p标记可以绑定多个端口
docker run -d -it -p 800:80 -p 8088:8080 --name tomcat 192.168.0.216:5000/tomcat
docker ps -a | egrep "(80|8080)"

三、映射到指定地址的指定端口

将容器的80 port映射到192.168.0.225:800
docker run -d -it -p 192.168.0.225:800:80 --name web_server 192.168.0.216:5000/nginx
curl 192.168.0.225:800     #验证是否可以访问默认首页

四、映射到指定地址的udp端口

这里且不说能不能访问,只是一种映射方式。大家别见怪
docker run -d -it -p 192.168.0.225:300:3000/udp --name unknown 192.168.0.216:5000/nginx
netstat -anpu |grep udp
udp    0    0    192.168.0.225:300    0.0.0.0:*     24588/docker-proxy

五、查看映射端口配置

通过docker port container_ID 可以查看到容器映射了哪些端口及协议
[root@docker ~]#docker port tomcat
8080/tcp -> 192.168.0.225:32769
[root@docker ~]#docker port unknown
3000/udp -> 192.168.0.225:300
### 如何通过 Docker 端口映射实现公网访问 #### 一、Docker 端口映射基础 Docker 容器可以通过 `-p` 参数将容器内的服务端口映射到宿主机上,从而让外部网络能够访问容器中的应用。例如,在启动 Portainer 的时候使用命令 `docker run -d -p 8088:9000 ...` 将容器的 9000 端口映射到了宿主机的 8088 端口[^1]。 #### 二、公网访问的前提条件 为了使容器的服务可以被公网访问,除了完成本地端口映射外,还需要满足以下几个前提条件: - **路由器配置**:如果服务器位于 NAT 后面,则需要在路由器上设置端口转发规则,将外部请求的特定端口指向服务器的对应端口。 - **防火墙规则**:确保服务器上的防火墙允许来自外部的流量到达指定端口。例如,使用 `iptables` 添加规则以支持公网访问[^3]。 - **IP 地址绑定**:确认容器监听的是所有可用接口(即 `0.0.0.0`),而不是仅限于 localhost 或其他受限范围。 #### 三、具体操作流程 以下是实现 Docker 容器服务对外部公网开放的具体方法: ##### 1. 映射端口至宿主机 当创建或运行一个新的容器时,利用 `-p` 参数定义端口映射关系。例如,对于 MongoDB 数据库镜像,执行以下命令将其默认端口 27017 映射到宿主机的任意端口(如 27017): ```bash sudo docker run -d -p 27017:27017 mongo ``` 此命令会使得宿主机上的 27017 端口与容器内部的相同端口建立连接[^2]。 ##### 2. 路由器端口转发 假设您的服务器拥有固定的公共 IP 地址或者动态 DNS 解析名称,那么您需要登录到宽带调制解调器/无线路由设备界面,找到虚拟服务器或端口触发选项,添加一条新纪录把互联网上的目标端口号(比如上面提到的 27017)重定向给局域网内实际提供该服务机器的真实地址及其对应的私有端口。 ##### 3. 设置 Linux 防火墙规则 为了让远程客户端顺利抵达上述已设定完毕的路径之上,还需适当放宽本机的安全防护策略。假如采用的是标准 netfilter 架构下的工具集——iptables 来构建边界防御体系的话,可尝试输入下面这样的指令片段来新增例外项以便放行必要的 TCP 流量进入系统并最终送达目的进程那里去处理它: ```bash iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination <YourServerPrivateIP>:8000 iptables -A FORWARD -p tcp -d <YourServerPrivateIP> --dport 8000 -j ACCEPT ``` ##### 4. 修改应用程序配置文件 (如有必要) 某些情况下可能还需要调整程序本身的参数才能真正意义上达成预期效果;就像前面所举的例子那样,在 Scrapyd 平台里头就得重新规划好 deployment URL 字段的内容形式才行[#ref_4_]。 --- ### 注意事项 尽管以上措施可以让更多的人轻松接触到部署在线上的资源,但也伴随着潜在风险增加的可能性因此建议采取额外手段加强保护力度譬如启用 HTTPS 加密传输机制以及实施严格的认证授权控制等等。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值