No zuo no die ,用Docker安装Mysql

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 话说,小哥接触Mysql也有几年了,但总是感觉Mysql有很多神秘的特性,一直也不太敢折腾这家伙。昨天准备动动手,可安装过程就花了2天时间。期间,错误的以为必须要给mysql server挂载本地目录,对数据进行持久化。

话说,小哥接触Mysql也有几年了,但总是感觉Mysql有很多神秘的特性,一直也不太敢折腾这家伙。昨天准备动动手,可安装过程就花了2天时间。
期间,错误的以为必须要给mysql server挂载本地目录,对数据进行持久化。最终,还是看了docker文档才搞清楚Docker Volume的使用方法。

先讲案例

一、docker 安装 Mysql

1.在docker shell 下载mysql-server

docker pull mysql/mysql-server:8.0
## 8.0 可以设为7.0 5.6 5.5

2. 启动镜像

docker run --name=mysql1 -d mysql/mysql-server:8.0

3. 等待镜像完成初始化,用docker ps 命令查看状态。由于dokcer -d是后台执行,无法观察系统执行情况。当docker ps输出status 为healthy的时候,系统启动完成。

docker ps

4.获取root密码

docker logs mysql1 2>&1 | grep GENERATED

回显,GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs

5.获得mysql shell,用docker获取镜像里的进程

docker exec -it mysql1 mysql -uroot -p

输入 4步获得的密码。

6.修改root密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

完成以上6步,就可以得到一个mysql虚拟机,你可以通过docker exec -it mysql1 mysql -uroot -p 连接到虚拟机内部。

以上步骤,来源于docker hub上mysql server的文档。
https://hub.docker.com/r/mysql/mysql-server/

二、docker 数据持久化

如果docker 不能持久化数据,重新启动docker,那么写入mysql的数据就都丢失了?

1. 测试,关闭虚拟机

我们采用命令, 重启虚拟机,发现写入的数据没有丢失。

docker stop mysql1
docker start mysql1

2. Docker 为什么不是持久化

在docker 官方文档上,介绍了docker存储原理。docker的一种重要特性,就是分层存储,这个在编译、传输docker时都带来很大优势。

运行的docker容器也是分层的,“writeable container layer”可写层位于docker容器的最顶端,这个层的特点就是不能持久化。

docker运行过程中的写操作都保存在“writeable layer”上,但当容器停止时,这些数据是没有保存,下一次启动docker,就好像启动一块有还原卡的主机,之前操作都没有保存下来。

By default all files created inside a container are stored on a writable container layer. This means that:

  • The data doesn’t persist when that container is no longer running, and it can be difficult to get the data out of the container if another process needs it.
  • A container’s writable layer is tightly coupled to the host machine where the container is running. You can’t easily move the data somewhere else.
  • Writing into a container’s writable layer requires a storage driver to manage the filesystem. The storage driver provides a union filesystem, using the Linux kernel. This extra abstraction reduces performance as compared to using data volumes, which write directly to the host filesystem.
    https://docs.docker.com/storage/

3.docker Volume 概念

volume

docker 提供了三种数据持久化的方案

  1. volume
  2. bind mount
  3. tmpfs mount

官网文章 https://docs.docker.com/storage/#good-use-cases-for-volumes 给出了Good use cases for (volume;bind mount;tmpfs)。

官网的图片就可以说明三中类型区别:

  1. volume 卷,由Docker维护,保存在Filesystem中,即宿主机的文件系统中,但宿主机通常无法管理volume。
  2. bind mount,磁盘挂载,将宿主机的目录挂载到docker中。我们将源码保存在工程目录里,docker挂载工程目录,实现发布测试,就是用的这种方式。
  3. tmpfs是基于内存的。

三、卷的使用方法

1. bind mount挂载一个卷,将当前目录下的html文件夹挂载到docker nginx的发布目录

docker run -v $PWD/html:/usr/share/nginx/html -d nginx 

2. Volume 分为两种类型,匿名Volume和非匿名Volume

使用非匿名Volume,首先要创建一个,

docker volume create mydataVolume

挂载Volume,也是-v volume名字:docker路径

docker run --name=nginx -v mydataVolume:/usr/share/nginx/html -d nginx

匿名Volumn,在docker run的时候,创建一个volume并和镜像路径和绑定。

docker run --name=nginx -v /usr/share/nginx/html -d nginx

查看所有的Volume,每次创建新的容器,都会创建新的Volume。注,docker run创建新容器,docker stop可以运行已经停止的容器。

docker volume ls

下图,019 734等都是匿名卷,而wangsen是非匿名卷。


docker volume list

3. 卷的操作

如果镜像被删除了,匿名卷是不会被删除的,调用docker volume rm 卷名

如果挂载卷的docker被删除,其他镜像可以挂载这个卷。

一个卷没有任何的镜像挂载,那么它就成了无用的卷,命令docker volume prune可以批量删除无用卷。

4.挂载卷

不能直接 -v一个已经被其他docker挂载的volume,但是可以挂载docker,-volumes-from命令。

四,终于要揭开谜底 Mysql如何实现的持久化

在Mysql的Dockerfile,定义了匿名卷 VOLUME /var/lib/mysql

dockfile

此外docker mysql/mysql-server官方文档关于持久化主题 https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker-persisting-data-configuration

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
21天前
|
缓存 Linux Docker
【最新版正确姿势】Docker安装教程(简单几步即可完成)
之前的老版本Docker安装教程已经发生了变化,本文分享了Docker最新版安装教程,其他操作系统版本也可以参考官 方的其他安装版本文档。
657 2
【最新版正确姿势】Docker安装教程(简单几步即可完成)
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
368 11
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
23天前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
29天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
39 4
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。通过具体案例,读者可以了解如何准备环境、下载源码、编译安装、配置服务及登录 MySQL。编译源码安装虽然复杂,但提供了更高的定制性和灵活性,适用于需要高度定制的场景。
84 3
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
114 1
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。
本文介绍了在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。内容涵盖准备工作、下载源码、编译安装、配置服务、登录设置及实践心得,帮助读者根据需求选择最适合的安装方法。
59 2
|
24天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
145 0
|
28天前
|
Docker 容器
【赵渝强老师】使用二进制包方式安装Docker
本文介绍了在企业生产环境中无法直接访问外网时,如何使用Docker官方提供的二进制包进行Docker的离线安装。文章详细列出了从安装wget、下载Docker安装包、解压、复制命令到启动Docker服务的具体步骤,并提供了相关命令和示例图片。最后,还介绍了如何设置Docker为开机自启模式。
|
28天前
|
缓存 Ubuntu Linux
如何安装Docker
如何安装Docker
127 0