Docker MySQL啟動(dòng)問題及解決過程
更新時(shí)間:2025年09月27日 16:03:36 作者:驚鴻Randy
Docker MySQL啟動(dòng)失敗多因權(quán)限限制導(dǎo)致無法寫入/tmp和/var/run/mysqld目錄,推薦使用tmpfs掛載卷解決,同時(shí)需檢查SELinux和數(shù)據(jù)目錄權(quán)限,避免使用特權(quán)模式
問題概述
Docker 環(huán)境中的 MySQL 容器啟動(dòng)失敗,主要表現(xiàn)為兩個(gè)核心錯(cuò)誤:
- 臨時(shí)文件權(quán)限問題:
Can't create/write to file '/tmp/ibNysJx9' (Errcode: 13 - Permission denied)
- UNIX Socket 鎖文件問題:
Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock Unable to setup unix socket lock file
根本原因
這些問題的根本原因是 Docker 容器內(nèi)的權(quán)限限制。
容器中的 MySQL 進(jìn)程無法寫入特定目錄(/tmp 和 /var/run/mysqld),導(dǎo)致啟動(dòng)失敗。
解決方案
方案一:使用 tmpfs 和掛載卷(推薦)
# 創(chuàng)建必要的目錄 mkdir -p /path/to/mysql/data mkdir -p /path/to/mysql/run/mysqld # 設(shè)置正確的權(quán)限 chmod -R 777 /path/to/mysql/data chmod 777 /path/to/mysql/run/mysqld chown -R 999:999 /path/to/mysql/data # MySQL 在容器中通常使用 UID 999 # 啟動(dòng)容器 docker run --name mysql-5.7.30 \ --dns 8.8.8.8 \ --dns 114.114.114.114 \ --add-host=目標(biāo)服務(wù)器的IP:127.0.0.1 \ --tmpfs /tmp:rw,exec,mode=1777 \ -v /path/to/mysql/data:/var/lib/mysql \ -v /path/to/mysql/run/mysqld:/var/run/mysqld \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ -d mysql:5.7.30
方案二:使用自定義配置文件
# 創(chuàng)建配置目錄 mkdir -p /path/to/mysql/conf # 創(chuàng)建自定義配置文件 cat > /path/to/mysql/conf/my.cnf << EOF [mysqld] pid-file=/var/lib/mysql/mysqld.pid socket=/var/lib/mysql/mysqld.sock datadir=/var/lib/mysql skip-host-cache skip-name-resolve EOF # 啟動(dòng)容器 docker run --name gwms-mysql \ --dns 8.8.8.8 \ --dns 114.114.114.114 \ --add-host=目標(biāo)服務(wù)器的IP:127.0.0.1 \ --tmpfs /tmp:rw,exec,mode=1777 \ -v /path/to/mysql/data:/var/lib/mysql \ -v /path/to/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ -d mysql:5.7.30
方案三:使用特權(quán)模式(不推薦用于生產(chǎn)環(huán)境)
docker run --name gwms-mysql \ --privileged \ --dns 8.8.8.8 \ --dns 114.114.114.114 \ --add-host=目標(biāo)服務(wù)器的IP:127.0.0.1 \ -v /path/to/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ -d mysql:5.7.30
其他可能需要考慮的因素
- SELinux:如果系統(tǒng)啟用了 SELinux,可能需要臨時(shí)禁用或設(shè)置適當(dāng)?shù)纳舷挛?/li>
setenforce 0 # 臨時(shí)禁用 # 或者 chcon -Rt svirt_sandbox_file_t /path/to/mysql/data
- 數(shù)據(jù)目錄權(quán)限:確保數(shù)據(jù)目錄具有正確的所有權(quán)
chown -R 999:999 /path/to/mysql/data
- Docker 網(wǎng)絡(luò)問題:解決 DNS 解析問題
# 添加到 /etc/hosts echo "目標(biāo)服務(wù)器的IP mysql-host" >> /etc/hosts
選擇適合您環(huán)境的方案,建議從方案一開始嘗試,它既解決了權(quán)限問題,又不會(huì)引入過多的安全風(fēng)險(xiǎn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中l(wèi)ike模糊查詢的優(yōu)化方法小結(jié)
本文介紹了五種優(yōu)化MySQL中l(wèi)ike模糊查詢的方法,主要包含后綴匹配走索引、反向索引、縮小搜索范圍、使用緩存和借助全文搜索引擎這幾種,感興趣的可以了解一下2024-11-11

