用 Docker 安裝并啟動 MySQL:從零到實戰的完整指南

用 Docker 安裝并啟動 MySQL:從零到實戰的完整指南

MySQL 是目前最流行的關系型數據庫之一,廣泛應用于各類應用系統中。使用 Docker 部署 MySQL 可以極大簡化環境配置,保證開發、測試和生產環境的一致性。本文將詳細介紹如何使用 Docker 安裝、配置和管理 MySQL 容器,適合初學者快速上手。

一、準備工作:安裝 Docker 環境

在開始之前,請確保你的系統已經安裝了 Docker。如果尚未安裝,可以按照以下步驟操作:

1. 安裝 Docker(以 Ubuntu 為例)

bash

# 更新系統包索引
sudo apt-get update# 安裝必要的依賴包
sudo apt-get install -y ca-certificates curl gnupg lsb-release# 添加Docker官方GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 設置Docker穩定版倉庫
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安裝Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io# 啟動Docker服務并設置開機自啟
sudo systemctl start docker
sudo systemctl enable docker# 驗證Docker是否安裝成功
sudo docker --version

2. 安裝 Docker(以 CentOS 為例)

bash

# 更新系統包
sudo yum update -y# 安裝Docker依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker軟件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安裝Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io# 啟動Docker服務并設置開機自啟
sudo systemctl start docker
sudo systemctl enable docker# 驗證Docker是否安裝成功
sudo docker --version

3. 非 root 用戶配置(可選)

為了避免每次使用docker命令都需要sudo權限,可以將當前用戶添加到docker用戶組:

bash

sudo usermod -aG docker $USER
# 生效配置(需要重新登錄)
newgrp docker

二、Docker 安裝 MySQL:兩種常用方式

方式 1:快速啟動默認配置的 MySQL

如果只需要臨時使用 MySQL 進行測試,最簡單的方式是直接運行官方鏡像:

bash

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest

參數說明:

  • --name mysql-test:給容器命名為mysql-test
  • -e MYSQL_ROOT_PASSWORD=root:設置 root 用戶密碼為 root
  • -p 3306:3306:將主機的 3306 端口映射到容器的 3306 端口
  • -d:后臺運行容器
  • mysql:latest:使用最新版本的 MySQL 官方鏡像

方式 2:自定義配置啟動 MySQL(推薦生產環境)

對于實際生產環境,我們需要自定義 MySQL 配置,并確保數據持久化到主機,避免容器刪除后數據丟失。

步驟 1:創建配置文件和數據目錄

bash

# 創建存放MySQL配置、數據和日志的目錄
mkdir -p /opt/mysql/{conf,data,logs}# 設置目錄權限(確保容器內用戶可以讀寫)
sudo chmod -R 777 /opt/mysql
步驟 2:編寫 MySQL 配置文件

創建并編輯 MySQL 配置文件:

bash

vi /opt/mysql/conf/my.cnf

添加以下基礎配置(可根據需求調整):

ini

[mysqld]
# 數據庫默認字符集
character-set-server=utf8mb4
# 數據庫字符集對應一些排序等規則,注意要和character-set-server對應
collation-server=utf8mb4_unicode_ci
# 服務端口號
port=3306
# 數據庫存儲路徑(容器內路徑)
datadir=/var/lib/mysql
# 日志文件路徑(容器內路徑)
log-error=/var/log/mysql/error.log
# 允許最大連接數
max_connections=1000
# SQL模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES[client]
# 客戶端默認字符集
default-character-set=utf8mb4[mysql]
# MySQL客戶端默認字符集
default-character-set=utf8mb4
步驟 3:啟動 MySQL 容器

bash

docker run -d \--name mysql \--restart=always \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=your_secure_password \-e TZ=Asia/Shanghai \-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \-v /opt/mysql/data:/var/lib/mysql \-v /opt/mysql/logs:/var/log/mysql \mysql:8.0

參數詳解:

  • --name mysql:容器名稱為 mysql
  • --restart=always:容器退出時自動重啟
  • -p 3306:3306:端口映射,主機端口:容器端口
  • -e MYSQL_ROOT_PASSWORD=your_secure_password:設置 root 用戶密碼
  • -e TZ=Asia/Shanghai:設置時區為上海
  • -v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:掛載配置文件
  • -v /opt/mysql/data:/var/lib/mysql:掛載數據目錄,實現數據持久化
  • -v /opt/mysql/logs:/var/log/mysql:掛載日志目錄
  • mysql:8.0:使用 MySQL 8.0 版本(生產環境建議指定具體版本)

三、驗證 MySQL 容器是否正常運行

1. 查看容器狀態

bash

# 查看容器運行狀態
docker ps | grep mysql# 查看容器詳細日志
docker logs mysql

如果看到類似ready for connections的日志,說明 MySQL 啟動成功。

2. 連接 MySQL 進行測試

bash

# 進入MySQL容器
docker exec -it mysql mysql -u root -p# 輸入密碼后,測試創建數據庫和表
mysql> CREATE DATABASE testdb;
mysql> USE testdb;
mysql> CREATE TABLE users (id INT, name VARCHAR(50));
mysql> INSERT INTO users VALUES (1, 'Docker MySQL');
mysql> SELECT * FROM users;

如果能正常執行以上 SQL 命令,說明 MySQL 工作正常。

四、MySQL 容器管理常用命令

1. 基本操作

bash

# 啟動已停止的MySQL容器
docker start mysql# 停止運行中的MySQL容器
docker stop mysql# 重啟MySQL容器
docker restart mysql# 查看容器詳細信息
docker inspect mysql

2. 配置文件更新

當需要修改 MySQL 配置時,只需更新主機上的/opt/mysql/conf/my.cnf文件,然后重啟容器即可:

bash

# 編輯配置文件
vi /opt/mysql/conf/my.cnf# 重啟容器使配置生效
docker restart mysql

3. 升級 MySQL 版本

bash

# 1. 停止并備份當前容器數據(關鍵步驟)
docker stop mysql
sudo cp -r /opt/mysql/data /opt/mysql/data_backup# 2. 刪除當前容器
docker rm mysql# 3. 拉取新版本鏡像
docker pull mysql:8.0.33  # 替換為目標版本# 4. 使用相同命令啟動新容器
docker run -d \--name mysql \--restart=always \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=your_secure_password \-e TZ=Asia/Shanghai \-v /opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \-v /opt/mysql/data:/var/lib/mysql \-v /opt/mysql/logs:/var/log/mysql \mysql:8.0.33  # 使用新拉取的版本

五、安全最佳實踐

  1. 設置強密碼:務必為 root 用戶設置復雜密碼,避免使用簡單密碼
  2. 限制網絡訪問:生產環境建議通過防火墻限制 3306 端口的訪問來源
  3. 使用固定版本鏡像:避免使用latest標簽,應指定具體版本(如mysql:8.0.33
  4. 定期備份數據:雖然數據已持久化到主機,仍建議定期備份/opt/mysql/data目錄
  5. 最小權限原則:運行容器時可考慮添加--user參數指定非 root 用戶運行
  6. 啟用 SSL 連接:生產環境應配置 MySQL 使用 SSL 加密客戶端連接
  7. 定期更新鏡像:及時更新 MySQL 鏡像以獲取安全補丁

六、常見問題解決

1. 容器啟動后立即退出

檢查日志定位問題:

bash

docker logs mysql

常見原因:配置文件錯誤、目錄權限不足(可嘗試調整/opt/mysql目錄權限)

2. 無法遠程連接 MySQL

  • 檢查主機防火墻是否開放 3306 端口
  • 確認 MySQL 用戶是否允許遠程連接(默認 root 用戶只允許本地連接):

    sql

    -- 進入MySQL后執行
    use mysql;
    update user set host = '%' where user = 'root';
    flush privileges;
    

3. 數據持久化失敗

  • 確認掛載目錄權限正確
  • 檢查日志文件是否有相關錯誤信息
  • 確保啟動命令中的數據目錄掛載正確

4. 中文亂碼問題

  • 確保配置文件中已正確設置character-set-server=utf8mb4
  • 新建數據庫和表時指定字符集:

    sql

    CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

總結

通過 Docker 安裝和管理 MySQL 可以顯著簡化部署流程,提高環境一致性。本文介紹的方法既適用于開發測試環境,也可通過適當調整配置應用于生產環境。核心在于理解數據持久化的實現方式和容器與主機的交互機制,以便更好地管理和維護 MySQL 服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918533.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態規劃----1.爬樓梯

70. 爬樓梯 - 力扣(LeetCode) /** 1階:1步,即1種; 2階:1步1步或直接2步,即2種 f(1) 1,f(2) 2 3階:由1階邁2步,或2階邁一步; 4階:由2階邁2步,或3階1步; n階:由n-2階邁2步,或n-1階邁1步 f(n) f(n - 1) f(n - 2) */ class Solution {/**1階:1步,即1種…

special topic 11 (1)

preface 雖然我知道專業課必須得學,但是要學的東西,好多,我對專業課很害怕,稍微往后挪一挪,今天學了兩個強化網課之后再學專業課吧。今天的目標是學完 11 到 14.任重道遠,加油!從今天開始盡量早…

MTD和FTL的關系

在嵌入式存儲系統里,MTD(Memory Technology Device)和 FTL(Flash Translation Layer)是上下兩層、互相配合的概念。你可以把它想成**“原始硬件接口”和“硬盤驅動”**的關系。1. MTD 是什么定位:內核里對原…

自動駕駛 HIL 測試:構建 “以假亂真” 的實時數據注入系統

01 引言在端到端自動駕駛的研發競賽中,算法的迭代速度遠超物理世界的測試能力。單純依賴路測不僅成本高昂、周期漫長,更無法窮盡決定系統安全性的關鍵邊緣場景(Corner Cases)。因此,硬件在環(HIL&#xff0…

jdk升級

列出所有的jdk版本 /usr/libexec/java_home -V 永久切換版本 export JAVA_HOME(/usr/libexec/javahome?v11)exportPATH(/usr/libexec/java_home -v 11) export PATH(/usr/libexec/javah?ome?v11)exportPATHJAVA_HOME/bin:$PATH 保存后執行 source ~/.zshrc

Openlayers基礎教程|從前端框架到GIS開發系列課程(24)openlayers結合canva繪制矩形繪制線

本章節講解Canvas如何結合 Openlayer 使用&#xff0c;首先我們講解Canvas的繪圖基礎。我們初始化地圖的時候可以看見&#xff0c;實際上Openlayer的地圖就是用Canvas實現繪制的。Canvas繪制基本概念什么是canvas&#xff1f;HTML5 <canvas> 元素用于圖形的繪制&#…

深度學習——01 深度學習簡介

1 什么是深度學習&#xff1f;人工智能是個大范疇&#xff0c;目標是打造智能機器和程序&#xff1b; 機器學習是實現人工智能的一種途徑&#xff0c;它能讓機器在不被明確編程的情況下自主學習&#xff1b;而深度學習&#xff0c;是機器學習的一個分支&#xff0c;它是基于深度…

自然語言處理( NLP)基礎

一、基本概念自然語言處理也就是Natural Language Processing&#xff0c;簡稱NLP。NLP就是人工只能和語言學領域的一個分支&#xff0c;涉及到計算機與人類語言之間的相互作用。主要目標是讓計算機能夠理解、解釋和生成人類語言的數據。1 自然語言處理的基本介紹NLP包括但不限…

云原生作業(nginx)

目錄 1 Web 服務基礎介紹 1.1 Web 服務介紹 1.1.1 Apache 經典的 Web 服務端 1.1.2 Nginx-高性能的 Web 服務端 1.1.3 用戶訪問體驗和性能 1.1.4 服務端 I/O 流程 1.2 I/O 模型 1.2.1 I/O 模型相關概念 1.2.2 網絡 I/O 模型 1.2.3 五種 IO 對比 1.2.4 I/O 的具體實現…

NY198NY203美光固態閃存NY215NY216

NY198NY203美光固態閃存NY215NY216技術架構與核心創新突破美光NY系列&#xff08;含NY198/NY203/NY215/NY216&#xff09;作為新一代企業級存儲解決方案&#xff0c;其底層采用232層NAND閃存三維堆疊工藝&#xff0c;如同垂直建造數字世界的摩天大樓&#xff0c;在有限芯片面積…

後端開發技術教學(四) 數據交互延伸

書接上回&#xff1a;後端開發技術教學(三) 表單提交、數據處理-CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 前言 大家好&#xff0c;我是小楓。書接上期說到的後…

華清遠見25072班C語言學習day7

重點內容&#xff1a;二維整形數組&#xff1a;定義&#xff1a;數據類型 數組名[行數][列數];數組中元素的訪問&#xff1a;通過行標和列標來訪問、行標從0開始&#xff0c;列標從0開始初始化和賦值&#xff1a;int arr1[2][3]{1,2,3,4,5,6}; -->二維數組完全初始化int arr…

FPGA實現Aurora 64B66B數據回環傳輸,基于GTX高速收發器,提供2套工程源碼和技術支持

目錄1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;為何要用你這個&#xff1f;工程概述免責聲明2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 GT 高速接口解決方案本方案在Aurora 8B10B上的應用3、工程詳細設計方…

實用硬件設計規范要點-原理圖

此處所涉及的并非指導硬件工程師如何繪制原理圖&#xff0c;而是旨在規范原理圖的模板&#xff0c;統一原理圖的設計方式&#xff0c;確保原理圖具備良好的可閱讀性&#xff0c;并統一與下一環節——PCB LAYOUT的接口。具體的硬件設計方法&#xff0c;諸位需在未來的工作中加以…

用 Apache Iceberg 與 Apache Spark 在 Google Cloud 打造高性能、可擴展的數據湖倉

大數據分析版圖不斷演進&#xff0c;組織正尋求更靈活、可擴展且具成本效益的方式來管理與分析海量數據。這一追求催生了數據湖倉范式&#xff0c;它將數據湖的低成本存儲與靈活性&#xff0c;與數據倉庫的數據管理能力和事務一致性相結合。站在這場變革中心的是 Apache Iceber…

【PyTorch學習筆記 - 02】 Datasets DataLoaders

前言 處理數據樣本的代碼可能會變得雜亂無章且難以維護&#xff1b;為了獲得更好的可讀性和模塊化&#xff0c;我們理想的情況是將數據集代碼與模型訓練代碼解耦。PyTorch 提供了兩個數據處理類&#xff1a; torch.utils.data.DataLoader 和 torch.utils.data.Dataset&#x…

JavaWeb 30 天入門:第七天 —— 異常處理機制

在前六天的學習中&#xff0c;我們掌握了 Java 的基礎語法、面向對象核心特性、抽象類與接口等知識。今天我們將學習 Java 中的異常處理機制&#xff0c;這是保證程序健壯性的關鍵技術。在 JavaWeb 開發中&#xff0c;無論是用戶輸入錯誤、數據庫連接失敗還是網絡異常&#xff…

編譯器默認生成的c++類六大成員函數

編譯器默認生成的c類六大成員函數 編譯器默認生成的六大成員函數 當你定義一個空類時&#xff0c;例如&#xff1a; class Empty {};如果代碼中沒有顯式定義任何成員函數&#xff0c;C編譯器會在需要時&#xff08;例如&#xff0c;代碼中實際調用了這些函數&#xff09;為你…

人工智能概念:常見的大模型微調方法

文章目錄一、微調技術的底層邏輯1.1 預訓練與微調的關系1.2 核心目標&#xff1a;適配任務與數據二、經典微調方法詳解2.1 全量微調&#xff08;Full Fine-Tuning&#xff09;2.2 凍結層微調&#xff08;Layer-Freezing Fine-Tuning&#xff09;2.3 參數高效微調&#xff08;Pa…

動態路由協議(一)

1. 動態路由 概述 靜態路由在大網絡里太麻煩&#xff08;設備多、配置量大&#xff0c;拓撲變了還要手動改&#xff09; 靜態路由是由工程師手動配置和維護的路由條目&#xff0c;命令行簡單明確&#xff0c;適用于小型或穩定的網絡。靜態路由有以下問題&#xff1a; 無法適…