文章目录
- 实验背景
- 实验环境准备
- [方法 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 容器数据库:
- socat 临时端口转发
- 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:宿主机监听 3306TCP: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 管理