前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 容器已经运行的情况下,如何对外暴露端口

Docker 容器已经运行的情况下,如何对外暴露端口

作者头像
somenzz
发布2024-04-01 10:28:45
7810
发布2024-04-01 10:28:45
举报
文章被收录于专栏:Python七号Python七号

运维时,你可能会遇到这样的问题,那就是Docker 容器已经运行的情况下,我希望宿主机外的程序,比如数据库客户端,能够连接容器内部的端口,如数据库端口。

一旦 Docker 容器已经运行起来后,原则上是不能直接修改容器配置来新增端口的。Docker 容器的端口映射是在启动容器时通过 -p 或者 --publish 参数来设置的,一旦设置好并且容器运行起来后,这些设置就固定下来了。

不过,如果你需要在已经运行的容器对外暴露新的端口,有一些间接的方法可以尝试:

  1. 使用 docker commit 命令创建一个新的镜像,然后基于这个新的镜像启动一个新的容器,并在启动时指定需要暴露的端口。但这样就不是原来的容器了,数据可能不是实时更新的。
  2. 可以通过 iptables 等工具在宿主机上手动设置端口转发规则,将流量重定向到容器的端口。
  3. 使用 Docker 的网络功能,如创建一个新的网络桥接或者使用 docker network connect 将容器连接到另一个网络接口,这样可以在不重启容器的情况下改变网络设置。

这里分享下方法 2 的具体做法:如何在宿主机上使用 iptables 设置端口转发规则可以将外部请求转发到 Docker 容器的端口上。

基本的步骤:

1、确保 IP 转发已开启:要让 iptables 能够进行端口转发,你需要确认宿主机已经开启了 IP 转发功能。可以通过以下命令查看和开启:

查看 IP 转发是否开启:

代码语言:javascript
复制
sysctl net.ipv4.ip_forward

如果结果为 0,说明 IP 转发功能没有开启,你可以通过以下命令临时开启 IP 转发:

代码语言:javascript
复制
sudo sysctl -w net.ipv4.ip_forward=1

要永久开启 IP 转发,在 /etc/sysctl.conf 文件中设置 net.ipv4.ip_forward=1,然后重新加载配置:

代码语言:javascript
复制
sudo sysctl -p /etc/sysctl.conf

2、设置 NAT 转发规则:使用 iptables 命令设置 NAT 转发规则,将宿主机上的端口转发到容器的端口上。以下是一个 iptables 命令的示例:

代码语言:javascript
复制
sudo iptables -t nat -A PREROUTING -p tcp --dport < 宿主机端口 > -j DNAT --to-destination < 容器 IP>:< 容器端口 >

例如,如果你想将宿主机的 8080 端口转发到容器的 80 端口,且容器的 IP 是 172.17.0.2,可以使用以下命令:

代码语言:javascript
复制
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80

3、设置过滤规则:为了确保转发的数据包能够被正确处理,你可能还需要添加一条规则来允许经过宿主机的转发流量:

代码语言:javascript
复制
sudo iptables -A FORWARD -p tcp -d < 容器 IP> --dport < 容器端口 > -j ACCEPT

使用上面的例子,命令将会是:

代码语言:javascript
复制
sudo iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT

4、保存规则:在某些 Linux 发行版中,iptables 规则在重启后不会自动保存。你可以使用 iptables-save 和 iptables-restore 命令来保存和重载规则。对于 Debian/Ubuntu 系统,可以安装 iptables-persistent 包来保存规则。

在执行这些命令时,请特别小心,因为 iptables 的配置错误可能会导致网络服务中断。如果你不熟悉 iptables,建议在测试环境中先进行实验。

如果不嫌麻烦,你还可以在 GitHub 下载一个 gost 来进行端口转发,这个工具我认为是最强转发工具,没有之一。

上述方法并不是直接通过修改现有运行容器来实现的,而是通过一些外部操作或容器重建来实现端口暴露的目的。如果你希望对外暴露端口,建议在设计 Docker 容器时提前规划好端口映射。

最后,好久没更新了,如果本文有帮助,欢迎收藏、关注、转发。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python七号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档