Docker 未映射端口的解決方案(兩種無(wú)需重啟容器的訪問(wèn)方法)
以mysql容器為例
實(shí)驗(yàn)背景
在開(kāi)發(fā)和測(cè)試環(huán)境中,常遇到這種情況:
- 容器內(nèi)運(yùn)行 MySQL 數(shù)據(jù)庫(kù)
- 容器啟動(dòng)時(shí)未映射 MySQL 默認(rèn)端口
3306 - 需要從宿主機(jī)或外部工具訪問(wèn)數(shù)據(jù)庫(kù)
直接訪問(wèn)宿主機(jī)端口會(huì)失敗,因?yàn)槎丝谖从成?。本文演?兩種無(wú)需重啟原容器 的方法,讓你訪問(wèn) MySQL 容器數(shù)據(jù)庫(kù):
- socat 臨時(shí)端口轉(zhuǎn)發(fā)
- Docker 代理容器方案(長(zhǎng)期訪問(wèn))
實(shí)驗(yàn)環(huán)境準(zhǔn)備
啟動(dòng) 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 沒(méi)有映射到宿主機(jī)。
獲取容器內(nèi)部 IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-test
輸出示例:
192.168.1.3
方法 1:宿主機(jī)使用 socat 臨時(shí)端口轉(zhuǎn)發(fā)
socat 可以把宿主機(jī)端口臨時(shí)映射到容器內(nèi)部端口,無(wú)需重啟容器。
1. 安裝 socat
# CentOS / RHEL yum install -y socat # Debian / Ubuntu apt install -y socat
2. 啟動(dòng)端口轉(zhuǎn)發(fā)
# 將宿主機(jī) 3306 端口轉(zhuǎn)發(fā)到容器 3306 socat TCP-LISTEN:3306,fork TCP:192.168.1.3:3306
?? 提醒:如果宿主機(jī)已有 MySQL 在運(yùn)行,請(qǐng)使用備用端口(如 3307)避免沖突。
3. 訪問(wèn) MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p'root123'
4. 注意事項(xiàng)
- socat 會(huì)占用終端,會(huì)話(huà)結(jié)束或
Ctrl+C后轉(zhuǎn)發(fā)停止 - 適合 臨時(shí)調(diào)試和開(kāi)發(fā)
方法 2:使用 Docker 代理容器(長(zhǎng)期方案)
如果希望長(zhǎng)期訪問(wèn),并且在宿主機(jī)重啟或容器重啟后仍然有效,可以使用 alpine/socat 代理容器:
1. 創(chuàng)建自定義網(wǎng)絡(luò)(推薦方式)
docker network create mysql-net
2. 啟動(dòng) MySQL 容器加入網(wǎng)絡(luò)
docker run -d \ --name mysql-test \ --network mysql-net \ -e MYSQL_ROOT_PASSWORD=root123 \ mysql:5.7.34
3. 啟動(dòng)代理容器
docker run -d \ --name mysql-proxy \ --network mysql-net \ -p 3306:3306 \ --restart always \ alpine/socat \ TCP-LISTEN:3306,fork TCP:mysql-test:3306
說(shuō)明:
TCP-LISTEN:3306,fork:宿主機(jī)監(jiān)聽(tīng) 3306TCP:mysql-test:3306:轉(zhuǎn)發(fā)到 MySQL 容器
4. 訪問(wèn) MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p'root123'
使用此方法,宿主機(jī)重啟、代理容器重啟,訪問(wèn)依然有效。
安全提示
- socat 暴露端口會(huì)直接開(kāi)放到宿主機(jī),請(qǐng)?jiān)诳尚啪W(wǎng)絡(luò)使用
- 生產(chǎn)環(huán)境建議使用防火墻限制訪問(wèn),或通過(guò) Docker Compose 管理端口
- 避免在公網(wǎng)暴露數(shù)據(jù)庫(kù)端口
總結(jié)
| 方法 | 適用場(chǎng)景 | 特點(diǎn) | 注意事項(xiàng) |
|---|---|---|---|
| socat 臨時(shí)轉(zhuǎn)發(fā) | 臨時(shí)開(kāi)發(fā)調(diào)試 | 快速、無(wú)需改動(dòng)原容器 | 進(jìn)程結(jié)束即停止 |
| Docker 代理容器 | 長(zhǎng)期訪問(wèn) | 支持宿主機(jī)/容器重啟,類(lèi)似端口映射 | 占用宿主機(jī)端口,需注意安全 |
?? 最佳實(shí)踐:
- 開(kāi)發(fā)環(huán)境:臨時(shí)調(diào)試可用 socat
- 測(cè)試/長(zhǎng)期環(huán)境:代理容器 + 自定義網(wǎng)絡(luò)
- 生產(chǎn)環(huán)境:?jiǎn)?dòng)容器時(shí)就映射端口或使用 Docker Compose 管理
到此這篇關(guān)于Docker 未映射端口的解決方案(兩種無(wú)需重啟容器的訪問(wèn)方法)的文章就介紹到這了,更多相關(guān)Docker 未映射端口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中控制服務(wù)啟動(dòng)順序的操作方法
Docker是一種開(kāi)源的應(yīng)用容器引擎,允許開(kāi)發(fā)者將應(yīng)用及其依賴(lài)打包進(jìn)容器,實(shí)現(xiàn)快速、一致的部署,Docker三劍客compose、machine和swarm提供了不同層面的服務(wù)管理和編排,使得在不同環(huán)境中部署應(yīng)用變得簡(jiǎn)單高效2024-10-10
前端轉(zhuǎn)全棧必須要掌握的一些Docker知識(shí)
對(duì)于長(zhǎng)期深耕于瀏覽器環(huán)境的前端開(kāi)發(fā)者而言,邁向全棧并非僅僅是技術(shù)棧的延伸,更是一次思維模式的根本性轉(zhuǎn)變,這篇文章主要介紹了前端轉(zhuǎn)全棧必須要掌握的一些Docker知識(shí),需要的朋友可以參考下2026-03-03
Docker?部署?OnlyOffice?文檔服務(wù)器的操作方法
本文詳細(xì)介紹了如何使用Docker部署OnlyOffice文檔服務(wù)器,包括準(zhǔn)備工作、設(shè)置變量和目錄結(jié)構(gòu)、創(chuàng)建并運(yùn)行OnlyOffice容器、訪問(wèn)OnlyOffice文檔服務(wù)器以及配置和管理,通過(guò)這些步驟,你可以在本地快速搭建一個(gè)強(qiáng)大的文檔編輯平臺(tái),感興趣的朋友一起看看吧2025-02-02
docker安裝Redis高可用實(shí)現(xiàn)一主二從三哨兵
redis提供了哨兵模式保證redis實(shí)現(xiàn)高可用,本文主要介紹了docker安裝Redis高可用實(shí)現(xiàn)一主二從三哨兵,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn)
本文主要介紹了Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
docker remote api一鍵TLS加密的實(shí)現(xiàn)
本文主要介紹了docker remote api一鍵TLS加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

