Docker 未映射端口 两种无需重启容器的访问方法

文章目录

  • 实验背景
  • 实验环境准备
  • [方法 1:宿主机使用 socat 临时端口转发](#方法 1:宿主机使用 socat 临时端口转发)
    • [1. 安装 socat](#1. 安装 socat)
    • [2. 启动端口转发](#2. 启动端口转发)
    • [3. 访问 MySQL](#3. 访问 MySQL)
    • [4. 注意事项](#4. 注意事项)
  • [方法 2:使用 Docker 代理容器(长期方案)](#方法 2:使用 Docker 代理容器(长期方案))
    • [1. 创建自定义网络(推荐方式)](#1. 创建自定义网络(推荐方式))
    • [2. 启动 MySQL 容器加入网络](#2. 启动 MySQL 容器加入网络)
    • [3. 启动代理容器](#3. 启动代理容器)
    • [4. 访问 MySQL](#4. 访问 MySQL)
  • 安全提示
  • 总结

以mysql容器为例


实验背景

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

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

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

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

实验环境准备

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

bash 复制代码
docker run -d --name mysql-test -e MYSQL_ROOT_PASSWORD=root123 mysql:5.7.34

查看容器状态:

bash 复制代码
docker ps

输出示例:

复制代码
CONTAINER ID   IMAGE          PORTS
87162db7d5d3   mysql:5.7.34   3306/tcp, 33060/tcp

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

获取容器内部 IP:

bash 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-test

输出示例:

复制代码
192.168.1.3

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

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

1. 安装 socat

bash 复制代码
# CentOS / RHEL
yum install -y socat

# Debian / Ubuntu
apt install -y socat

2. 启动端口转发

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

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

3. 访问 MySQL

bash 复制代码
mysql -h 127.0.0.1 -P 3306 -u root -p'root123'

4. 注意事项

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

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

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

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

bash 复制代码
docker network create mysql-net

2. 启动 MySQL 容器加入网络

bash 复制代码
docker run -d \
  --name mysql-test \
  --network mysql-net \
  -e MYSQL_ROOT_PASSWORD=root123 \
  mysql:5.7.34

3. 启动代理容器

bash 复制代码
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

bash 复制代码
mysql -h 127.0.0.1 -P 3306 -u root -p'root123'

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


安全提示

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

总结

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

💡 最佳实践

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

相关推荐
修罗王12 小时前
Linux Docker 服务管理与排查实战指南(新手速查版)
运维·docker
云川之下14 小时前
【k8s】NAD(NetworkAttachmentDefinition)与SR‑IOV‑Operator 关系
云原生·容器·kubernetes
张龙68714 小时前
Docker 镜像瘦身实战:从 1.2GB 到 128MB,我踩过的 7 个坑和一套可复制的方法论
运维·后端·docker
杨浦老苏16 小时前
开源堡垒机 Warpgate:一个容器搞定 SSH、MySQL 和 Web 访问
运维·docker·ssh·堡垒机·群晖
ERD Online17 小时前
docker-compose 一键部署的 MIT 开源数据库建模平台
数据库·docker·开源
ZzzZZzzzZZZzzzz…17 小时前
K8S实战:NFS+StorageClass+PV/PVC+Deployment
运维·云原生·容器·kubernetes·storageclass·linux运维·持久卷
三言老师18 小时前
CentOS7.9 + Kubernetes 1.18.20 -清理所有 docker / containerd 残留
docker·容器·kubernetes
circuitsosk18 小时前
从Docker到Kubernetes:AI应用服务化与弹性伸缩的落地实践
人工智能·docker·kubernetes·ai应用部署
showyoui19 小时前
K8s 集群迁移踩坑:Istio 升级后 nginx 403
网络·docker·kubernetes·istio·service_mesh
云川之下21 小时前
【k8s】sriov‑device‑plugin、sriov‑network‑config‑daemon详解
云原生·容器·kubernetes