Docker 未映射端口的解決方案(兩種無需重啟容器的訪問方法)
以mysql容器為例
實驗背景
在開發(fā)和測試環(huán)境中,常遇到這種情況:
- 容器內(nèi)運行 MySQL 數(shù)據(jù)庫
- 容器啟動時未映射 MySQL 默認(rèn)端口
3306 - 需要從宿主機或外部工具訪問數(shù)據(jù)庫
直接訪問宿主機端口會失敗,因為端口未映射。本文演示 兩種無需重啟原容器 的方法,讓你訪問 MySQL 容器數(shù)據(jù)庫:
- socat 臨時端口轉(zhuǎn)發(fā)
- Docker 代理容器方案(長期訪問)
實驗環(huán)境準(zhǔn)備
啟動 MySQL 容器(不映射端口):
docker run -d --name mysql-test -e MYSQL_ROOT_PASSWORD=root123 mysql:5.7.34
查看容器狀態(tài):
docker ps
輸出示例:
CONTAINER ID IMAGE PORTS
87162db7d5d3 mysql:5.7.34 3306/tcp, 33060/tcp
注意:3306 沒有映射到宿主機。
獲取容器內(nèi)部 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-test
輸出示例:
192.168.1.3
方法 1:宿主機使用 socat 臨時端口轉(zhuǎn)發(fā)
socat 可以把宿主機端口臨時映射到容器內(nèi)部端口,無需重啟容器。
1. 安裝 socat
# CentOS / RHEL yum install -y socat # Debian / Ubuntu apt install -y socat
2. 啟動端口轉(zhuǎn)發(fā)
# 將宿主機 3306 端口轉(zhuǎn)發(fā)到容器 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 會占用終端,會話結(jié)束或
Ctrl+C后轉(zhuǎn)發(fā)停止 - 適合 臨時調(diào)試和開發(fā)
方法 2:使用 Docker 代理容器(長期方案)
如果希望長期訪問,并且在宿主機重啟或容器重啟后仍然有效,可以使用 alpine/socat 代理容器:
1. 創(chuàng)建自定義網(wǎng)絡(luò)(推薦方式)
docker network create mysql-net
2. 啟動 MySQL 容器加入網(wǎng)絡(luò)
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:宿主機監(jiān)聽 3306TCP:mysql-test:3306:轉(zhuǎn)發(fā)到 MySQL 容器
4. 訪問 MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p'root123'
使用此方法,宿主機重啟、代理容器重啟,訪問依然有效。
安全提示
- socat 暴露端口會直接開放到宿主機,請在可信網(wǎng)絡(luò)使用
- 生產(chǎn)環(huán)境建議使用防火墻限制訪問,或通過 Docker Compose 管理端口
- 避免在公網(wǎng)暴露數(shù)據(jù)庫端口
總結(jié)
| 方法 | 適用場景 | 特點 | 注意事項 |
|---|---|---|---|
| socat 臨時轉(zhuǎn)發(fā) | 臨時開發(fā)調(diào)試 | 快速、無需改動原容器 | 進(jìn)程結(jié)束即停止 |
| Docker 代理容器 | 長期訪問 | 支持宿主機/容器重啟,類似端口映射 | 占用宿主機端口,需注意安全 |
?? 最佳實踐:
- 開發(fā)環(huán)境:臨時調(diào)試可用 socat
- 測試/長期環(huán)境:代理容器 + 自定義網(wǎng)絡(luò)
- 生產(chǎn)環(huán)境:啟動容器時就映射端口或使用 Docker Compose 管理
到此這篇關(guān)于Docker 未映射端口的解決方案(兩種無需重啟容器的訪問方法)的文章就介紹到這了,更多相關(guān)Docker 未映射端口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker?部署?OnlyOffice?文檔服務(wù)器的操作方法
本文詳細(xì)介紹了如何使用Docker部署OnlyOffice文檔服務(wù)器,包括準(zhǔn)備工作、設(shè)置變量和目錄結(jié)構(gòu)、創(chuàng)建并運行OnlyOffice容器、訪問OnlyOffice文檔服務(wù)器以及配置和管理,通過這些步驟,你可以在本地快速搭建一個強大的文檔編輯平臺,感興趣的朋友一起看看吧2025-02-02
docker安裝Redis高可用實現(xiàn)一主二從三哨兵
redis提供了哨兵模式保證redis實現(xiàn)高可用,本文主要介紹了docker安裝Redis高可用實現(xiàn)一主二從三哨兵,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Docker上部署mysql8主從復(fù)制的實現(xiàn)
本文主要介紹了Docker上部署mysql8主從復(fù)制的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
docker remote api一鍵TLS加密的實現(xiàn)
本文主要介紹了docker remote api一鍵TLS加密的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11

