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

