Docker搭建MySQL數(shù)據(jù)庫的完整步驟及報錯解決
前言
在本篇文章中,我們將詳細(xì)介紹如何通過 Docker 快速搭建一個 MySQL 數(shù)據(jù)庫環(huán)境,并通過一些簡單的配置來實現(xiàn)數(shù)據(jù)持久化、日志管理和定制化的配置文件。
一、準(zhǔn)備工作
首先,確保你的系統(tǒng)上已經(jīng)安裝了 Docker。
Linux上進(jìn)行Docker安裝有兩種方式:
- Docker自動化安裝
- Docker手動安裝
可以根據(jù)該文章的步驟進(jìn)行安裝:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502
二、設(shè)置 MySQL 容器的目錄結(jié)構(gòu)
為了確保容器中的 MySQL 數(shù)據(jù)持久化并且能夠方便地訪問,我們需要在宿主機(jī)上創(chuàng)建一些本地目錄來掛載到 Docker 容器中。這里我們在 /opt/docker/demo 路徑下創(chuàng)建 MySQL 相關(guān)的目錄,包括日志、數(shù)據(jù)和配置文件目錄。
# 安裝路徑 DIR="/opt/docker/demo" DOCKER_NAME="docker-mysql" # 創(chuàng)建目錄結(jié)構(gòu) mkdir -p "$DIR/mysql/log" mkdir -p "$DIR/mysql/data" mkdir -p "$DIR/mysql/conf"
這里我們創(chuàng)建了以下幾個目錄:
log:存放 MySQL 容器的日志文件。data:存放 MySQL 容器的數(shù)據(jù)文件。conf:存放 MySQL 配置文件。
三、配置 MySQL 容器
接下來,我們將使用 Docker 運(yùn)行一個 MySQL 容器。Docker 提供了一個官方的 mysql:8.0 鏡像,我們將基于該鏡像來創(chuàng)建容器。
以下是啟動 MySQL 容器的命令:
docker run -d \ --restart=always \ --name "$DOCKER_NAME" \ --network host \ -v "$DIR/mysql/log:/var/log/mysql" \ -v "$DIR/mysql/data:/var/lib/mysql" \ -v "$DIR/mysql/conf:/etc/mysql/conf.d" \ -e MYSQL_ROOT_PASSWORD=root \ mysql:8.0
解釋各個參數(shù):
-d:后臺運(yùn)行容器。--restart=always:容器在崩潰或機(jī)器重啟后會自動重啟。--name "$DOCKER_NAME":指定容器名稱為docker-mysql。--network host:將容器連接到宿主機(jī)的網(wǎng)絡(luò),以便外部可以訪問 MySQL 服務(wù)。-v "$DIR/mysql/log:/var/log/mysql":將宿主機(jī)的日志目錄掛載到容器內(nèi)的日志目錄。-v "$DIR/mysql/data:/var/lib/mysql":將宿主機(jī)的數(shù)據(jù)目錄掛載到容器的數(shù)據(jù)目錄,確保數(shù)據(jù)持久化。-v "$DIR/mysql/conf:/etc/mysql/conf.d":將宿主機(jī)的配置文件目錄掛載到容器內(nèi)的配置目錄。-e MYSQL_ROOT_PASSWORD=root:設(shè)置 MySQL 根用戶的密碼為root。mysql:8.0:使用官方的 MySQL 8.0 鏡像
四、自定義 MySQL 配置
MySQL 的配置文件可以通過掛載宿主機(jī)的配置目錄到容器內(nèi)進(jìn)行自定義。你可以在 conf 目錄下創(chuàng)建一個 custom.cnf 文件,配置 MySQL 的監(jiān)聽端口等參數(shù)。
例如,我們可以設(shè)置 MySQL 監(jiān)聽的端口為 3307,而不是默認(rèn)的 3306,或設(shè)置時區(qū) +08:00。只需要在 custom.cnf 中添加如下配置:
[mysqld] port = 3307 default-time-zone = '+08:00'
然后,確保該文件掛載到容器內(nèi)的正確位置(/etc/mysql/conf.d/)。
五、端口配置:Host 網(wǎng)絡(luò)模式 vs Port 映射模式
在 Docker 中,容器的網(wǎng)絡(luò)配置和端口管理是非常重要的。對于 MySQL 容器,有兩種常見的端口配置方式:
Host 網(wǎng)絡(luò)模式
在 Docker 中使用
--network host選項時,容器會直接使用宿主機(jī)的網(wǎng)絡(luò)棧,這意味著容器將使用宿主機(jī)的 IP 地址和端口。當(dāng)你使用 Host 網(wǎng)絡(luò)模式時,容器中的 MySQL 服務(wù)將直接暴露在宿主機(jī)的默認(rèn)端口(如
3306)。無需進(jìn)行端口映射,MySQL 容器將與宿主機(jī)共享網(wǎng)絡(luò)接口。配置命令:
docker run -d \ --restart=always \ --name "$DOCKER_NAME" \ --network host \ -v "$DIR/mysql/log:/var/log/mysql" \ -v "$DIR/mysql/data:/var/lib/mysql" \ -v "$DIR/mysql/conf:/etc/mysql/conf.d" \ -e MYSQL_ROOT_PASSWORD=root \ mysql:8.0
- 優(yōu)點(diǎn)
- 容器共享宿主機(jī)的網(wǎng)絡(luò),性能較高。
- 無需顯式端口映射,容器與宿主機(jī)共享相同的網(wǎng)絡(luò)。
- 缺點(diǎn)
- 容器與宿主機(jī)的網(wǎng)絡(luò)完全共享,可能會有端口沖突,尤其是多個容器或服務(wù)同時運(yùn)行時。
- 容器的端口與宿主機(jī)端口相同,可能存在安全隱患。
- 優(yōu)點(diǎn)
Port 映射模式
如果你希望對容器的端口進(jìn)行靈活配置,可以使用
-p參數(shù)將容器的端口映射到宿主機(jī)的特定端口。通過這種方式,你可以將容器內(nèi)的 MySQL 端口(默認(rèn)為3306)映射到宿主機(jī)上的另一個端口。例如,將容器內(nèi)的
3306端口映射到宿主機(jī)的3307端口:配置命令:
docker run -d \ --restart=always \ --name "$DOCKER_NAME" \ -p 3307:3306 \ -v "$DIR/mysql/log:/var/log/mysql" \ -v "$DIR/mysql/data:/var/lib/mysql" \ -v "$DIR/mysql/conf:/etc/mysql/conf.d" \ -e MYSQL_ROOT_PASSWORD=root \ mysql:8.0
- 優(yōu)點(diǎn)
- 容器端口與宿主機(jī)端口不同,可以避免端口沖突。
- 容器與宿主機(jī)之間有更好的網(wǎng)絡(luò)隔離性。
- 支持多個容器映射到宿主機(jī)不同的端口,適合多容器環(huán)境。
- 缺點(diǎn)
- 可能會導(dǎo)致稍微的性能損失,因為需要進(jìn)行額外的端口映射。
- 需要手動管理和指定端口映射。
- 優(yōu)點(diǎn)
六、檢查 MySQL 容器狀態(tài)
容器啟動后,你可以通過以下命令檢查容器是否正常運(yùn)行:
docker ps
該命令會列出所有正在運(yùn)行的容器。如果你的 MySQL 容器沒有出現(xiàn)在列表中,可以通過查看容器日志來排查問題:
docker logs docker-mysql
七、連接到 MySQL 容器
如果你需要連接到容器內(nèi)的 MySQL 數(shù)據(jù)庫,可以使用 docker exec 命令進(jìn)入容器并使用 mysql 客戶端進(jìn)行連接:
docker exec -it docker-mysql mysql -u root -p
輸入密碼后,你將進(jìn)入 MySQL 提示符,可以執(zhí)行 SQL 查詢等操作。
八、備份與恢復(fù)
為了確保數(shù)據(jù)的安全性,你可以定期備份 MySQL 數(shù)據(jù)。因為數(shù)據(jù)已經(jīng)掛載到宿主機(jī)目錄 $DIR/mysql/data,所以你可以直接備份該目錄中的數(shù)據(jù)文件。
例如,你可以使用 tar 命令將數(shù)據(jù)目錄打包備份:
tar -czvf mysql_backup.tar.gz -C "$DIR/mysql" data
恢復(fù)時,只需要將備份文件解壓到相應(yīng)的目錄即可。
九、報錯問題
在使用 Docker 安裝 MySQL 后,容器啟動失敗。查看日志后發(fā)現(xiàn)如下錯誤信息:

Fatal glibc error: CPU does not support x86-64-v2
經(jīng)過排查,這是由于所使用的 MySQL 鏡像(如 mysql:8.0)基于較新的 glibc 編譯,要求宿主機(jī) CPU 支持 x86-64-v2 指令集。而一些老舊物理機(jī)或低配置云主機(jī)并不具備這些新指令集,導(dǎo)致容器無法啟動并反復(fù)重啟。
解決方案:
更換為兼容舊 CPU 架構(gòu)的 MySQL 鏡像版本。例如使用下列鏡像即可成功運(yùn)行:
mysql:8.4.0-oraclelinux8
該鏡像基于 Oracle Linux 構(gòu)建,對老舊 CPU 有更好的兼容性。替換后容器可正常啟動,問題順利解決。
總結(jié)
通過 Docker 搭建 MySQL 數(shù)據(jù)庫環(huán)境非常簡單,并且能夠通過掛載宿主機(jī)目錄的方式實現(xiàn)數(shù)據(jù)持久化和日志管理。通過修改容器內(nèi)的配置文件,你還可以自定義 MySQL 的參數(shù),例如監(jiān)聽端口等。
Docker 提供了兩種常見的端口配置方式:Host 網(wǎng)絡(luò)模式和Port 映射模式。選擇哪種方式取決于你的需求:
- Host 網(wǎng)絡(luò)模式:適用于需要高性能、直接使用宿主機(jī)網(wǎng)絡(luò)的場景。
- Port 映射模式:適用于需要靈活配置端口、避免端口沖突或需要更好網(wǎng)絡(luò)隔離的場景。
無論選擇哪種方式,Docker 都能夠通過簡單的配置幫助你快速搭建 MySQL 數(shù)據(jù)庫,并且根據(jù)你的需求進(jìn)行靈活的端口管理。
到此這篇關(guān)于Docker搭建MySQL數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Docker搭建MySQL數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL中row_number()?over(partition?by)的用法說明
這篇文章主要介紹了SQL中row_number()?over(partition?by)的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
MySQL?數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)的實現(xiàn)
數(shù)據(jù)恢復(fù)的過程包括將備份文件導(dǎo)入到數(shù)據(jù)庫中、重建索引、應(yīng)用日志等,本文主要介紹了MySQL數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)的實現(xiàn),感興趣的可以了解一下2023-08-08
PostgreSQL物化視圖(materialized view)過程解析
這篇文章主要介紹了PostgreSQL物化視圖(materialized view)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02

