前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >No zuo no die ,用Docker安装Mysql

No zuo no die ,用Docker安装Mysql

作者头像
birdskyws
发布2018-09-12 15:03:51
1.2K0
发布2018-09-12 15:03:51
举报

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

先讲案例

一、docker 安装 Mysql

1.在docker shell 下载mysql-server
代码语言:javascript
复制
docker pull mysql/mysql-server:8.0
## 8.0 可以设为7.0 5.6 5.5
2. 启动镜像
代码语言:javascript
复制
docker run --name=mysql1 -d mysql/mysql-server:8.0
3. 等待镜像完成初始化,用docker ps 命令查看状态。由于dokcer -d是后台执行,无法观察系统执行情况。当docker ps输出status 为healthy的时候,系统启动完成。
代码语言:javascript
复制
docker ps
4.获取root密码
代码语言:javascript
复制
docker logs mysql1 2>&1 | grep GENERATED

回显,GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs

5.获得mysql shell,用docker获取镜像里的进程
代码语言:javascript
复制
docker exec -it mysql1 mysql -uroot -p

输入 4步获得的密码。

6.修改root密码
代码语言:javascript
复制
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. 测试,关闭虚拟机

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

代码语言:javascript
复制
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的发布目录
代码语言:javascript
复制
docker run -v $PWD/html:/usr/share/nginx/html -d nginx 
2. Volume 分为两种类型,匿名Volume和非匿名Volume

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

代码语言:javascript
复制
docker volume create mydataVolume

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

代码语言:javascript
复制
docker run --name=nginx -v mydataVolume:/usr/share/nginx/html -d nginx

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

代码语言:javascript
复制
docker run --name=nginx -v /usr/share/nginx/html -d nginx

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、docker 安装 Mysql
    • 1.在docker shell 下载mysql-server
      • 2. 启动镜像
        • 3. 等待镜像完成初始化,用docker ps 命令查看状态。由于dokcer -d是后台执行,无法观察系统执行情况。当docker ps输出status 为healthy的时候,系统启动完成。
          • 4.获取root密码
            • 5.获得mysql shell,用docker获取镜像里的进程
              • 6.修改root密码
              • 二、docker 数据持久化
                • 1. 测试,关闭虚拟机
                  • 2. Docker 为什么不是持久化
                    • 3.docker Volume 概念
                    • 三、卷的使用方法
                      • 1. bind mount挂载一个卷,将当前目录下的html文件夹挂载到docker nginx的发布目录
                        • 2. Volume 分为两种类型,匿名Volume和非匿名Volume
                          • 3. 卷的操作
                            • 4.挂载卷
                            • 四,终于要揭开谜底 Mysql如何实现的持久化
                            相关产品与服务
                            容器镜像服务
                            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档