【Docker】Docker安装MySQL,并解决中文乱码和配置数据备份同步到宿主机

news2024/11/29 12:31:23

请添加图片描述


专栏精选文章

  1. 《Docker是什么?Docker从介绍到Linux安装图文详细教程》
  2. 《30条Docker常用命令图文举例总结》
  3. 《Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程》
  4. 《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程》

本期目录

  • 专栏精选文章
  • 前言
  • 1. 搜索镜像
  • 2. 拉取镜像
  • 3. 查看镜像
  • 4. 创建容器
    • 4.1 创建容器
    • 4.2 解决中文乱码
    • 4.3 重启MySQL容器生效
    • 4.4 建库建表测试中文
    • 4.5 容器数据卷的容灾性
    • 4.6 远程连接数据库



前言

笔者这里演示 MySQL 5.7 版本的安装。
你是否遇到使用 Docker 安装 MySQL 5.7 插入中文会乱码?
你是否担心 MySQL 容器被删除后数据丢失?
你是否想知道 MySQL 容器内的数据如何实时地同步出宿主机?
恭喜你,看完本篇文章,你将解决上述所有问题。


1. 搜索镜像

在 Docker Hub 上查找 MySQL 镜像。

image-20221213092057955


2. 拉取镜像

$ docker pull mysql:5.7

image-20221213092621328


3. 查看镜像

$ docker images -a

image-20221213092707318


4. 创建容器

对于像 MySQL 这样稍微复杂的软件,如果你不知道如何运行该镜像来创建容器,可以查看官网【Overview】下面的介绍。

image-20221213093337318

【注意】

  • 请确保你的 Linux 电脑上原来没有安装运行过 MySQL ,否则会有冲突。通过下面的命令来查看。

    $ ps -ef | grep mysqld
    

    image-20221213093621472

    如上图所示你的 Linux 电脑原来没有运行 MySQL 。如果有,请移步这篇文章《Linux下如何安装MySQL以及远程登录保姆级教程》来进行卸载。

  • 请确保你的 Linux 宿主机上的防火墙是关闭的或者 3306 端口是开放的。


【大坑一】

MySQL 5.7 默认字符集是 latin1 ,不支持中文,必须改成 UTF-8 字符集。

SHOW VARIABLES LIKE 'character%';

image-20221213095751596

【大坑二】

刚刚创建容器时,没有加容器数据卷,MySQL 容器 mysql1 中的数据库无法实时备份和同步到宿主机上,如果容器被删除,那么其中的所有数据库和数据表都会丢失,这是非常严重的安全隐患。如果你对【容器数据卷】感到陌生,可以参考学习我的这篇博文:《Docker多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程》

下面我们针对这两个大坑来重新演示真正企业级 MySQL 容器是怎么创建的。


4.1 创建容器

$ docker run -d -p 3306:3306 --privileged=true \
-v /xsh/mysql/log/:/var/log/mysql \
-v /xsh/mysql/data/:/var/lib/mysql \
-v /xsh/mysql/conf/:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xsh981104 \
--name=mysql2 \
mysql:5.7

其中,--privileged=true 表示开启容器数据卷的权限;这次创建 MySQL 中,增加了 3 个容器数据卷。

-v /xsh/mysql/log/:/var/log/mysql 表示同步 MySQL 的日志到宿主机;

-v /xsh/mysql/data/:/var/lib/mysql 表示同步 MySQL 的数据到宿主机;

-v /xsh/mysql/conf/:/etc/mysql/conf.d 表示同步 MySQL 的配置到宿主机。

-e MYSQL_ROOT_PASSWORD 设置的是 MySQL 的 root 用户的登录密码。

image-20221213101431946

查看正在运行的容器。

image-20221213101527423
以前台交互式进入 MySQL 容器 mysql1

$ docker exec -it mysql1 /bin/bash

image-20221213094537817

进入 MySQL 终端。

$ mysql -uroot -p

image-20221213094703382

成功进入了 MySQL 的客户端终端,后面的操作就与你原来学的 MySQL 操作一样。

SHOW DATABASES;

image-20221213094854367

查看宿主机上的数据卷同步目录,发现已经成功从 MySQL 容器内同步到宿
主机外了。

$ ls -l /xsh/mysql

image-20221213101710073


4.2 解决中文乱码

我们通过创建 my.cnf 里面配置 MySQL 的默认字符集为 UTF-8,然后通过容器数据卷同步给 MySQL 容器实例。

在宿主机上进入 MySQL 容器数据卷的配置目录 /xsh/mysql/conf

$ cd /xsh/mysql/conf

image-20221213102115909

发现里面为空。在这个目录下创建 my.cnf 配置文件。

$ vim my.cnf

然后把下面这段内容粘贴进去。

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

image-20221213102444184

:wq 保存退出。


4.3 重启MySQL容器生效

重启MySQL容器实例,再重新进入并查看 MySQL 容器的字符集。

$ docker restart mysql2

image-20221213102741862

以前台交互式进入 MySQL 容器 mysql2

$ docker exec -it mysql2 /bin/bash

进入 MySQL 终端。

$ mysql -uroot -p

查看 MySQL 5.7 容器的字符集是否已经改为 UTF-8 。

SHOW VARIABLES LIKE 'character%';

image-20221213103041528

已经成功改为 UTF-8 字符集了。


4.4 建库建表测试中文

创建测试数据库。

CREATE DATABASE IF NOT EXISTS testdb01;

image-20221213103422497

切换进数据库 testdb01

USE testdb01;

image-20221213103518352

创建测试数据表。

CREATE TABLE test1(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);

image-20221213103856049

往数据表 test1 插入中文数据测试是否有乱码。

INSERT INTO test1(last_name) VALUES
('Mike'),
('张三');

image-20221213104434552

没有乱码,MySQL 5.7 的字符集修改成功。

【结论】

Docker 安装完 MySQL 并 run 出容器实例后,推荐先修改完字符集编码后再建库建表和插入数据。


4.5 容器数据卷的容灾性

在实际开发中,我一再强调创建 MySQL 容器时必须挂载容器数据卷。这样,即使 MySQL 容器被删除,宿主机中的数据卷目录仍保存有数据备份。只要再次把被删除的 MySQL 容器创建出来,那么宿主机就可以自动把数据同步回这个 MySQL 容器中。

【举例】

我把 MySQL 容器 mysql2 删除,这时容器内的数据库和数据表都一并被删除。

$ docker rm -f mysql2

image-20221213110729286

但是由于我挂载了容器数据卷,这个容器的数据在宿主机中都有完整备份。

image-20221213110936400

这时我再次把被删除的 MySQL 容器实例创建出来。

$ docker run -d -p 3306:3306 --privileged=true \
-v /xsh/mysql/log/:/var/log/mysql \
-v /xsh/mysql/data/:/var/lib/mysql \
-v /xsh/mysql/conf/:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xsh981104 \
--name=mysql2 \
mysql:5.7

image-20221213111053394

image-20221213111107957

以前台交互式进入 MySQL 容器 mysql2

$ docker exec -it mysql2 /bin/bash

进入 MySQL 终端。

$ mysql -uroot -p

查看 MySQL 5.7 容器之前在宿主机中的数据有没有自动同步回来。

SHOW DATABASES;

image-20221213111318094

USE testdb01;
SELECT * FROM test1;

image-20221213111419501

MySQL 数据会在容器再次创建时自动同步回来,并且与宿主机的数据卷同步也会自动回复。因此,在创建 MySQL 容器实例时必须挂载数据卷。


4.6 远程连接数据库

接下来我们使用 Windows 客户端 SQLyog 远程连接这个 MySQL 容器。

image-20221213095130021

连接成功。

image-20221213095157013

image-20221213095238842

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银河麒麟操作系统V10SP1创建网页快捷方式至桌面的方法

修改浏览器配置文件添加快捷方式 1.在桌面点击鼠标右键,选择‘’打开终端‘’,终端界面显示‘桌面’ 2.在终端界面输入命令行 sudo vim qaxbrowser-safe.desktop (奇安信浏览 器的快捷方式) 进去后按‘/’然后输入‘Exec’,最后按回车键。…

Android监听UEvent之UEventObserver分析

(1)背景概述 众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。 比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。…

wy的leetcode刷题记录_Day58

wy的leetcode刷题记录_Day58 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2022-12-2 前言 力扣每日一题简单模拟左右抵消和二叉平衡搜索树 1769. 移动所有球到每个盒子所需的最小操作数和108. 将有序数组转换为二叉搜索树 目录wy的l…

无线路由器首次配置、修改WiFi名称和密码—— Cisco实验/家里实验

一、Csico实验 192.168.0.1、192.168.1.0和192.168.1.1是路由器常用的默认IP 1. 在PC打开浏览器(PC用网线直连无线路由器), 输入无线路由器在局域网内的静态IP:192.168.0.1 2. 输入管理者的账号和密码,默认都是admin…

搜索与图论- Dijkstra 算法

文章目录一、Dijkstra 算法1. 简介2. 基本思想3. 朴素 Dijkstra 算法(重点)3.1 朴素 Dijkstra 算法实现步骤3.2 朴素 Dijkstra 算法伪代码4. 朴素 Dijkstra 算法具体实现详见例题 Dijkstra 求最短路 I 。5. 堆优化朴素 Dijkstra 算法6. 堆优化 Dijkstra …

cookie、sessionStorage和localStorage的区别(二)

cookie、sessionStorage和localStorage的区别(一)详细精炼知识调用前言引入核心干货webstorage本地存储cookiesessionStoragelocalStorage知识调用 文章中可能用到的知识点前端学习:浏览器缓存方式有哪些( cookie localstorage s…

rocketmq源码学习-broker启动

前言 这篇笔记记录broker启动的源码学习 broker主要完成一下几件事情: 1.接收producer的发送请求,并对消息进行持久化、同步其他节点 2.接收consumer读取消息星球 3.定时向nameSrv注册心跳信息,保持连接 在启动的时候,也是分了…

Ant Design 6.0.0 实践集合

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 使用的6.0.0 beta版本 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结前言 Ant Design 简称为 Antd antd 为 Web 应用提供了丰富的基础 U…

操作指南|通过JumpServer实现Kubernetes运维安全审计

本文重点介绍如何通过JumpServer实现Kubernetes的运维安全审计。此前,我们专门介绍过在Kubernetes集群上快速部署JumpServer的方法步骤,可参见《操作指南|在Kubernetes集群上快速部署JumpServer开源堡垒机》一文。 一、Kubernetes运维审计现…

ABP Vnext 学习03-授权中心微信小程序登录

前言 小程序开发的 前置条件 1 需要服务端是https 和域名 Ip 是不可以的 2 需要申请appid 小程序的官方流程图 个人理解 对于上面的流程图 步骤一 客户端 小程序调用wx.login 方法 获取用户的code 这个code 是限时的五分钟就会过期 拿到code 就可以向服务端发起登录请求了 …

vue3中ref的作用及ref和reactive之间的转化

ref的作用&#xff1a; &#xff08;1&#xff09;第一个作用&#xff1a;和vue一样&#xff1a; 绑在dom节点上拿到的是dom节点&#xff1b;绑在组件上拿到的是组件对象&#xff1b; 定义方式&#xff1a; <template><div><input type"text" ref&…

java运行数据区域分布

Java在运行程序过程中&#xff0c;会将自己的内存划分为若干个不同的数据数据区域&#xff0c;这些若干个区域&#xff0c;每个区域都有自己的用途&#xff0c;具体看下图 java是面向对象的语言&#xff0c;那么虚拟机中的数据&#xff08;对象&#xff09;是怎么被创建出来的呢…

加密 笔记

文章目录简单异或加密对称加密DES加密AES加密1.简单的加密解密逻辑2.填充方式**noPadding**3.加密模式1、**ECB模式&#xff08;默认&#xff09;**2、**CBC模式**3、CFB模式4、OFB模式5、CTR模式代码案例ECB加密和CBC加密测试非对称加密RSA加密AES和RSA混合加密哈希散列算法什…

[附源码]Python计算机毕业设计动物保护资讯推荐网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

RabbitMQ[3]-RabbitMQ如何保证消息的可靠性投递与消费?

上篇文章&#xff1a;RabbitMQ的核心概念有哪些&#xff1f;它们的职责是什么&#xff1f;中我们详细介绍了RabbitMQ的工作模式&#xff0c;根据它的工作模式&#xff0c;一条消息从生产者发出&#xff0c;到消费者消费&#xff0c;需要经历以下4个步骤&#xff1a; 生产者将消…

Java笔记——String类各种方法的使用总结(附带实例)

String类的获取方法 String类实现获取功能的方法有 int length() —— 获取字符串长度 char charAt(int index) —— 获取指定索引处的字符值 int indexOf(int ch) —— 获取指定字符第一次出现的索引位置 int indexOf(String str) —— 获取指定字符串第一次出现的索引位…

ArrayDeque源码解析

ArrayDeque源码解析 问题 &#xff08;1&#xff09;什么是双端队列&#xff1f; &#xff08;2&#xff09;ArrayDeque 是怎么实现双端队列的&#xff1f; &#xff08;3&#xff09;ArrayDeque 是线程安全的吗&#xff1f; &#xff08;4&#xff09;ArrayDeque 是有界的…

【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十五章双目O…

基于jsp+mysql+ssm二手书交易管理系统-计算机毕业设计

项目介绍 这样一个二手书交易网站为用户提供了一个可以在网上买卖图书的平台&#xff0c;用户可以通过二手书交易管理系统进行注册或登录操作&#xff0c;登录成功后可以查看自己已发布的售书信息或者求购信息。同时&#xff0c;用户可以浏览其他用户发布的售书信息和求购信息…

基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改

基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改 仿真图proteus 8.9 程序编译器&#xff1a;keil 4/5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0027 视频演示 基于51单片机的多层电梯(1-16层)运行系统仿真设计演示视频主要功能&#xff1a; 结合实际情…