一文詳解MySQL在Docker中的部署與數(shù)據(jù)持久化指南
前言
在 Docker 或 Docker Compose 中跑 MySQL 時(shí),若未做數(shù)據(jù)持久化,容器刪除后數(shù)據(jù)會(huì)丟失。正確做法是把數(shù)據(jù)目錄掛載到宿主機(jī)或命名卷,并合理設(shè)置 root 密碼、字符集、以及可選的自建庫(kù)和用戶。本文只講 MySQL 在 Docker 中的核心配置與持久化方式,不貼完整可運(yùn)行 Demo。
單容器運(yùn)行 MySQL
docker run -d \ --name mysql \ -e MYSQL_ROOT_PASSWORD=your_root_password \ -e MYSQL_DATABASE=appdb \ -e MYSQL_USER=app \ -e MYSQL_PASSWORD=your_app_password \ -p 3306:3306 \ -v mysql_data:/var/lib/mysql \ mysql:8
要點(diǎn):
- MYSQL_ROOT_PASSWORD:必填,root 密碼。
- MYSQL_DATABASE:容器首次啟動(dòng)時(shí)創(chuàng)建的數(shù)據(jù)庫(kù)名。
- MYSQL_USER / MYSQL_PASSWORD:可選,創(chuàng)建普通用戶及密碼;該用戶默認(rèn)對(duì) MYSQL_DATABASE 有權(quán)限。
- -v mysql_data:/var/lib/mysql:把數(shù)據(jù)目錄掛載到命名卷
mysql_data,容器刪除后卷仍在,下次用同一卷可保留數(shù)據(jù)。 - -p 3306:3306:僅本機(jī)或內(nèi)網(wǎng)訪問(wèn)時(shí)可去掉
-p,避免 3306 對(duì)公網(wǎng)暴露。
Docker Compose 中的 MySQL
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: appdb
MYSQL_USER: app
MYSQL_PASSWORD: ${MYSQL_APP_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306" # 僅本機(jī)訪問(wèn)時(shí)可改為 "127.0.0.1:3306:3306" 或不暴露
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql_data:
其他服務(wù)通過(guò)服務(wù)名 mysql 連接,主機(jī)名為 mysql,端口 3306。敏感信息用 .env 或環(huán)境變量傳入。
數(shù)據(jù)持久化方式
- 命名卷(推薦):
mysql_data由 Docker 管理,路徑在宿主機(jī)某目錄下,備份時(shí)可docker run --rm -v mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/mysql_backup.tar.gz -C /data .等方式導(dǎo)出。 - 綁定目錄:
-v /host/path/mysql:/var/lib/mysql,數(shù)據(jù)直接在宿主機(jī)目錄,便于直接拷貝或用宿主機(jī)工具備份;需保證目錄權(quán)限允許容器內(nèi) mysql 用戶寫(xiě)入(通常 UID 999 或 1000,視鏡像而定)。
首次啟動(dòng)若掛載的目錄或卷已有數(shù)據(jù),會(huì)直接使用;若為空,MySQL 會(huì)初始化。不要用同一數(shù)據(jù)目錄同時(shí)起多個(gè) MySQL 容器,會(huì)導(dǎo)致數(shù)據(jù)損壞。
字符集與時(shí)區(qū)(可選)
若需統(tǒng)一字符集和時(shí)區(qū),可在 docker run 或 compose 中加參數(shù):
environment: MYSQL_ROOT_PASSWORD: xxx MYSQL_CHARSET: utf8mb4 command: ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
或使用自定義 my.cnf 掛載進(jìn)容器。時(shí)區(qū)可在應(yīng)用連接串中設(shè)置 ?connectionTimeZone=Asia/Shanghai,或在 MySQL 內(nèi)設(shè)置 time_zone。
健康檢查
Compose 中已用 mysqladmin ping 做健康檢查,便于 depends_on: condition: service_healthy 等待 MySQL 就緒后再啟動(dòng)應(yīng)用。單容器運(yùn)行時(shí)也可加 --health-cmd(語(yǔ)法以 Docker 版本為準(zhǔn))。
小結(jié)
- MySQL 在 Docker 中必須設(shè)置 root 密碼,并通過(guò)
-v或 volumes 做數(shù)據(jù)持久化(命名卷或綁定目錄)。 - Compose 中可為應(yīng)用創(chuàng)建 MYSQL_DATABASE 和 MYSQL_USER,其他服務(wù)用服務(wù)名
mysql連接。 - 生產(chǎn)環(huán)境不要將 3306 對(duì) 0.0.0.0 開(kāi)放,僅本機(jī)或內(nèi)網(wǎng)訪問(wèn)即可;備份時(shí)針對(duì)數(shù)據(jù)卷或綁定目錄做定期備份。
按上述方式即可在 Docker 中穩(wěn)定運(yùn)行 MySQL 并保留數(shù)據(jù)。
到此這篇關(guān)于一文詳解MySQL在Docker中的部署與數(shù)據(jù)持久化指南的文章就介紹到這了,更多相關(guān)Docker部署MySQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的方法詳解
這篇文章主要給大家介紹了關(guān)于MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
mysql分區(qū)表的增刪改查的實(shí)現(xiàn)示例
增刪查改在數(shù)據(jù)庫(kù)中是很常見(jiàn)的操作,本文主要介紹了mysql分區(qū)表的增刪改查的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
MySQL 表新增字段時(shí)報(bào)丟失連接錯(cuò)誤
MySQL在新增字段時(shí)遇到"Lost connection to MySQL server during query"錯(cuò)誤,可能由于網(wǎng)絡(luò)問(wèn)題、查詢超時(shí)或內(nèi)存不足等原因,下面就來(lái)詳細(xì)的介紹一下該問(wèn)題的解決,感興趣的可以了解一下2026-01-01
MySQL數(shù)據(jù)庫(kù)壓縮版本安裝與配置詳細(xì)教程
今天教各位小伙伴怎么安裝及配置Mysql數(shù)據(jù)庫(kù),文中有非常詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)剛?cè)腴Tmysql的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
MySQL臨時(shí)表滿了/臨時(shí)表空間耗盡的解決方法
當(dāng)你收到“臨時(shí)表滿了”的警報(bào)時(shí),通常意味著 MySQL 在處理查詢時(shí)創(chuàng)建的臨時(shí)表空間已經(jīng)耗盡,本文主要介紹了MySQL臨時(shí)表滿了/臨時(shí)表空間耗盡的解決方法,感興趣的可以了解一下2024-08-08
MySQL中日期比較時(shí)遇到的編碼問(wèn)題解決辦法
這篇文章主要介紹了MySQL中日期比較時(shí)遇到的字符集問(wèn)題解決辦法,本文遇到的問(wèn)題是date_format函數(shù)和timediff函數(shù)之間比較時(shí),編碼問(wèn)題導(dǎo)致出錯(cuò),本文使用convert()函數(shù)解決了這個(gè)問(wèn)題,需要的朋友可以參考下2014-07-07
mysql使用SQLyog導(dǎo)入csv數(shù)據(jù)不成功的解決方法
給mysql導(dǎo)入數(shù)據(jù),選中某個(gè)表選擇導(dǎo)入--導(dǎo)入使用本地csv數(shù)據(jù)即可,單有的時(shí)候不知道什么問(wèn)題導(dǎo)入不成功2014-07-07
解決Linux安裝mysql報(bào)錯(cuò):失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x
mysql是一款常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),常常被用于各類web應(yīng)用中,這篇文章主要給大家介紹了關(guān)于如何解決Linux安裝mysql報(bào)錯(cuò):失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x86_64?GPG的相關(guān)資料,需要的朋友可以參考下2024-08-08
MySQL內(nèi)核探秘之主鍵與唯一鍵的深度解析以及設(shè)計(jì)哲學(xué)
主鍵和唯一鍵都是用來(lái)保證MySQL數(shù)據(jù)表中數(shù)據(jù)完整性的約束,但它們?cè)诒举|(zhì)和使用上存在一些關(guān)鍵區(qū)別,這篇文章主要介紹了MySQL內(nèi)核探秘之主鍵與唯一鍵的深度解析以及設(shè)計(jì)哲學(xué)的相關(guān)資料,需要的朋友可以參考下2026-04-04

