Docker 未映射端口的解决方案(两种无需重启容器的访问方法)

 更新时间:2026年04月02日 09:33:46   作者:XMYX-0  
本文介绍了两种无需重启MySQL容器的方法,让你访问其数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

以mysql容器为例

实验背景

在开发和测试环境中,常遇到这种情况:

  • 容器内运行 MySQL 数据库
  • 容器启动时未映射 MySQL 默认端口 3306
  • 需要从宿主机或外部工具访问数据库

直接访问宿主机端口会失败,因为端口未映射。本文演示 两种无需重启原容器 的方法,让你访问 MySQL 容器数据库:

  1. socat 临时端口转发
  2. Docker 代理容器方案(长期访问)

实验环境准备

启动 MySQL 容器(不映射端口):

docker run -d --name mysql-test -e MYSQL_ROOT_PASSWORD=root123 mysql:5.7.34

查看容器状态:

docker ps

输出示例:

CONTAINER ID   IMAGE          PORTS
87162db7d5d3   mysql:5.7.34   3306/tcp, 33060/tcp

注意:3306 没有映射到宿主机。

获取容器内部 IP:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-test

输出示例:

192.168.1.3

方法 1:宿主机使用 socat 临时端口转发

socat 可以把宿主机端口临时映射到容器内部端口,无需重启容器。

1. 安装 socat

# CentOS / RHEL
yum install -y socat
# Debian / Ubuntu
apt install -y socat

2. 启动端口转发

# 将宿主机 3306 端口转发到容器 3306
socat TCP-LISTEN:3306,fork TCP:192.168.1.3:3306

⚠️ 提醒:如果宿主机已有 MySQL 在运行,请使用备用端口(如 3307)避免冲突。

3. 访问 MySQL

mysql -h 127.0.0.1 -P 3306 -u root -p'root123'

4. 注意事项

  • socat 会占用终端,会话结束或 Ctrl+C 后转发停止
  • 适合 临时调试和开发

方法 2:使用 Docker 代理容器(长期方案)

如果希望长期访问,并且在宿主机重启或容器重启后仍然有效,可以使用 alpine/socat 代理容器:

1. 创建自定义网络(推荐方式)

docker network create mysql-net

2. 启动 MySQL 容器加入网络

docker run -d \
  --name mysql-test \
  --network mysql-net \
  -e MYSQL_ROOT_PASSWORD=root123 \
  mysql:5.7.34

3. 启动代理容器

docker run -d \
  --name mysql-proxy \
  --network mysql-net \
  -p 3306:3306 \
  --restart always \
  alpine/socat \
  TCP-LISTEN:3306,fork TCP:mysql-test:3306

说明:

  • TCP-LISTEN:3306,fork:宿主机监听 3306
  • TCP:mysql-test:3306:转发到 MySQL 容器

4. 访问 MySQL

mysql -h 127.0.0.1 -P 3306 -u root -p'root123'

使用此方法,宿主机重启、代理容器重启,访问依然有效。

安全提示

  • socat 暴露端口会直接开放到宿主机,请在可信网络使用
  • 生产环境建议使用防火墙限制访问,或通过 Docker Compose 管理端口
  • 避免在公网暴露数据库端口

总结

方法适用场景特点注意事项
socat 临时转发临时开发调试快速、无需改动原容器进程结束即停止
Docker 代理容器长期访问支持宿主机/容器重启,类似端口映射占用宿主机端口,需注意安全

💡 最佳实践

  • 开发环境:临时调试可用 socat
  • 测试/长期环境:代理容器 + 自定义网络
  • 生产环境:启动容器时就映射端口或使用 Docker Compose 管理

到此这篇关于Docker 未映射端口的解决方案(两种无需重启容器的访问方法)的文章就介绍到这了,更多相关Docker 未映射端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker搭建tomcat运行环境的实现步骤

    docker搭建tomcat运行环境的实现步骤

    很多时候我们测试web系统需要一个tomcat运行环境,这时docker就派上用场了,本篇文章主要介绍了docker搭建tomcat运行环境的实现步骤,感兴趣的可以了解一下
    2017-01-01
  • 如何解决Docker镜像缺少字体的问题

    如何解决Docker镜像缺少字体的问题

    在使用Spire.Office.Free将Excel转换为HTML时,遇到字体缺失错误,通过在Dockerfile中添加字体文件,成功解决了问题,建议在遇到类似问题时,可以尝试在Dockerfile中添加缺失的字体文件
    2025-02-02
  • docker 复制容器的实现步骤

    docker 复制容器的实现步骤

    本文主要介绍了docker 复制容器的实现步骤,主要介绍了三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Docker容器中修改root密码的正确方法

    Docker容器中修改root密码的正确方法

    在使用 Docker 容器时,有时我们需要在容器创建后动态修改其中用户的密码,尤其是 root 用户的密码,本文详细介绍了如何使用dockerexec命令在运行中的Docker容器中动态修改root用户的密码,并提供了多个示例,需要的朋友可以参考下
    2026-01-01
  • docker安装rocketMq5x以上的版本

    docker安装rocketMq5x以上的版本

    本文主要介绍了docker安装rocketMq5x以上的版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • Higress基于Docker Compose进行独立部署方式

    Higress基于Docker Compose进行独立部署方式

    文章介绍了如何使用Docker和Docker Compose安装Higress网关,并详细说明了每个服务组件的作用以及安装和配置参数,安装完成后,可以通过控制台进行域名管理、服务配置和路由设置,并提供了官方文档链接以便进一步学习
    2026-03-03
  • docker 部署hbase并且java Api连接的操作过程

    docker 部署hbase并且java Api连接的操作过程

    这篇文章主要介绍了docker 部署hbase并且java Api连接的操作过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Docker为网络bridge模式指定容器ip的方法

    Docker为网络bridge模式指定容器ip的方法

    Docker在创建容器时有四种网络模式,bridge为默认不需要用--net去指定,其他三种模式需要在创建容器时使用--net去指定。那Docker为网络bridge模式指定容器ip该如何实现呢?下面通过通过这篇文章一起看看吧,文中给出了详细的示例代码,有需要的可以参考借鉴。
    2016-11-11
  • docker部署zabbix_agent的方法步骤

    docker部署zabbix_agent的方法步骤

    这篇文章主要介绍了docker部署zabbix_agent的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • centos8安装docker(containerd.io与podman-manpages问题解决)及镜像加速详解

    centos8安装docker(containerd.io与podman-manpages问题解决)及镜像加速详解

    在CentOS 8中安装Docker需先安装VirtualBox,root用户执行卸载旧版、安装基础包、设置仓库、安装Docker Engine-Community及containerd.io,解决包冲突后配置阿里云镜像加速器,最后运行hello-world测试
    2025-09-09

最新评论