用 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; 无法适…