No zuo no die ,用Docker安装Mysql
话说,小哥接触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 概念
docker 提供了三种数据持久化的方案
-
volume
-
bind mount
-
tmpfs mount
官网文章 https://docs.docker.com/storage/#good-use-cases-for-volumes 给出了Good use cases for (volume;bind mount;tmpfs)。
官网的图片就可以说明三中类型区别:
-
volume 卷,由Docker维护,保存在Filesystem中,即宿主机的文件系统中,但宿主机通常无法管理volume。
-
bind mount,磁盘挂载,将宿主机的目录挂载到docker中。我们将源码保存在工程目录里,docker挂载工程目录,实现发布测试,就是用的这种方式。
-
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是非匿名卷。
3. 卷的操作
如果镜像被删除了,匿名卷是不会被删除的,调用docker volume rm 卷名
。
如果挂载卷的docker被删除,其他镜像可以挂载这个卷。
一个卷没有任何的镜像挂载,那么它就成了无用的卷,命令docker volume prune
可以批量删除无用卷。
4.挂载卷
不能直接 -v
一个已经被其他docker挂载的volume,但是可以挂载docker,-volumes-from
命令。
四,终于要揭开谜底 Mysql如何实现的持久化
在Mysql的Dockerfile,定义了匿名卷 VOLUME /var/lib/mysql
此外docker mysql/mysql-server官方文档关于持久化主题 https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker-persisting-data-configuration
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Jenkins自动化部署容器
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/81299167 上一篇文章《Dockerfile配置APM监控实现Java容器的性能监控》实现了在tomcat容器中部署APM监控,就着这个话题我们继续扩展一下如何自动化部署。关于自动化部署容器,最常用到的是Jenkins,公司也有相关环境。但是为了全面的学习容器,我这次不用公司的Jenkins环境,而是直接用容器重新部署一套。 前提条件:需要两台装了Docker引擎的Centos7机器,一台作为Jenkins宿主机,一台作为要自动部署容器的宿主机(直接引用上一篇文章提到的设备和tomcat基础文件)。 1、编写Jenkins的Dockerfile,主要是为了安装SVN客户端 # New docker file from zgh # VERSION 1.1 # Author: zgh #基础镜像 FROM jenkins:2.60.3 #作者 #MAINTAINER <zgh@rexen.com.cn> USE...
- 下一篇
3台阿里云ECS安装CDH大数据集群过程(CentOS7.4+独立数据盘)
0x、环境说明 直接购买3台阿里云的ECS(配置4C/32G/30G系统盘+1T数据盘) 购买时先在阿里云生成一个密钥对,把.pem私钥保存到本地,然后购买时选择使用密钥进行无密码SSH登陆,注意统一使用该密钥对进行镜像部署。 服务开通后,进行如下操作。 一、配置hostname和hosts 1. 三台机器分别设置hostname为(需要重启ECS): master.bd.cn slave1.bd.cn slave2.bd.cn 2. 然后三台的/etc/hosts统一配置如下映射: <master.bd.cn的内网IP> master.bd.cn <slave1.bd.cn的内网IP> slave1.bd.cn <slave2.bd.cn的内网IP> slave2.bd.cn 二、配置三台ECS之间无密码SSH登陆 1. 将之前下载的.pem私钥上传到三台机器的/root/.ssh/目录下。 # 重命名密钥 mv xxx.pem id_rsa # 修改文件权限 chmod 600 id_rsa 2. 然后分别通过ssh访问进行验证,例如: ssh ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19