在Docker中安装Mysql
前⾔
此篇幅内容较多,讲解的很详细,也有很多知识点。能耐⼼认真的读完,就很不错了~
如果你觉得此⽂章不错的话,或者是根据此⽂档进⾏安装mysql的话,抽空在⽂档最下⽅留个⾔吧让我看到你的⽀持
Docker 中国官⽅镜像加速
如果觉得国外下载速度太慢,可以配置⼀个“Docker 中国官⽅镜像加速”,来提⾼镜像下载的速度。
⼀般情况下,都会永久性的配置镜像加速,在Linux中修改 /etc/docker/daemon.json ⽂件,填⼊以下内容:
{
"registry-mirrors": ["registry.docker-cn"]
}
如果daemon.json不存在的话,需要⾃⼰创建⼀下。
⽂件修改保存成功之后,记得重启⼀下Docker服务,以便让这个镜像加速⽣效。
重启Docker服务
我们在【在centos系统中安装Docker】⼀节中讲过Docker随着服务器重启⾃动启动的内容,正好可以通过命令service docker restart来实现Docker服务的重启。
然后我们在Linux中执⾏命令:
service docker restart
出现下图所⽰结果,表明Docker服务已经重新启动了!这样就可以永久性的使⽤Docker加速服务了。
如果不做特别的配置的话,之前处于运⾏状态的容器,随着Docker服务的重启也会停⽌运⾏。
下载mysql镜像
docker pull mysql
如果配置了镜像加速,那么在下载mysql镜像或者其他⽐较⼤的⽂件的时候,会发现下载速度变得⾮常快!
启动mysql容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql
其中 -e 的作⽤是⽤于设置环境变量,mysql默认⽤户名为root,则MYSQL_ROOT_PASSWORD即为root设置密码,即123456
查看运⾏的mysql容器
docker ps
如下图:
mysql容器已经正常启动了!
进⼊mysql容器
既然mysql服务启动了,如果我们想对mysql进⾏操作(⽐如进⼊命令⾏操作、客户端连接等操作),该怎么办?
通过 docker exec 命令进⼊mysql容器:
docker exec -it c9 /bin/bash
其中的“c9”指的当前mysql容器ID的前⾯部分值(在上图就可以看出来mysql容器的ID是 c94faeed480a)。
回车运⾏效果如下图:
其实这个时候,命令⾏控制台可以输⼊mysql相关的命令了。
连接mysql数据库
mysql -u root -p123456
如下图:
这个就是我们⾮常熟悉的mysql命令⾏界⾯了!
我们可以在这⾥创建数据库、表等操作。再次印证了Docker的强⼤和⽅便!
查看当前所有的数据库
在mysql命令⾏中执⾏命令:
show databases;
如下图所⽰:
完全就是和平常使⽤mysql⼀样。
创建数据库、表、新增测试数据
创建数据库
create database docker_test;
效果如下图:
这⾥我就创建了⼀个数据库docker_test
选择数据库
⾸先需要选择具体的数据库,执⾏命令选择刚刚创建的数据库:
use docker_test
创建表:
create table test(name varchar(20),age int(11));
创建了test表,有2个字段:name、age
添加测试数据:
insert into test values("Kitty",26),("Tom",18),("Jack",36);
这⾥就简单添加3条测试数据。
我们查询⼀下数据是否存在于数据库中:
select * from test;
⼀切OK!
客户端连接mysql数据库
既然mysql成功启动并运⾏,除了能在命令⾏中操作mysql数据库之外,肯定也是必须要能在客户端上连接和操作数据库才⾏。
下⾯我就在我本地电脑上通过数据库客户端软件连接⼀下这个mysql数据库,看看能不能正常连接和操作。
打开本地DataGrip客户端,新建连接mysql数据库
输⼊正确的mysql相关信息,连接数据库:
输⼊完成之后,可以点击下⽅的 Test Connection 按钮,来测试连接是否正常。
查看创建的****数据库和表:
到此,mysql的相关服务已经正常访问和操作了。这和我们传统的使⽤mysql没有什么不同。
客户端中操作表数据
我们通过DataGrip客户端,在test表中⼿动再添加⼀条数据,然后我们在docker中看看是否能查看到新增的数据:
【注意】:我这⾥添加了⼀条带有中⽂的数据。
进⼊mysql容器中查询表数据
呀!是不是发现问题了~ 没错,中⽂乱码!怎么解决呢?
mysql容器中解决表数据中⽂乱码
查看mysql容器的ID:
进⼊mysql的docker容器:
docker exec -it c9 /bin/bash
编辑mysql配置⽂件:
vim /etc/mysql/myf
如果提⽰ vim: command not found 的错误信息,需要安装相关依赖包,执⾏下⾯两个命令即可:
apt-get update
apt-get install vim
在myf⽂件中加⼊以下配置:
[mysqld]
character-set-server=utf8mysql下载完如何使用
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
最终修改结果为:
重新进⼊mysql容器,查询表数据,显⽰结果为:
可以看到,已经正常显⽰中⽂了!
停⽌并重启mysql容器,再次查看效果
客户端DataGrip重新连接mysql:
客户端连接正常!
进⼊mysql容器,查看表数据:
mysql容器重启之后,查询数据正常显⽰中⽂!⼀切没什么问题了~
通过commit命令提交新的镜像
根据在mysql容器中所做的更改,创建新的mysql镜像。
回想⼀下,我们在mysql容器中做了什么更改?
创建数据库、表、新增数据、修改myf配置⽂件,就是这些吧~
使⽤commit命令****提交新镜像
通过在Linux命令⾏中执⾏命令,提交新的镜像:
docker commit c9 mysql-new
其中,“c9”就是指的容器ID,新的镜像名称为“mysql-new”。
如下图:
查看所有镜像列表:
是不是发现了我们创建的新的镜像mysql-new了。
启动新创建的mysql镜像
由于上⾯我们已经运⾏了⼀个mysql的容器了,端⼝是3306,所以我们新运⾏⼀个mysql容器的时候,端⼝号就不能是3306了,这⾥我指定为3307,且容器的别名是mysql-new,⽅便区分查看。
进⼊新创建的mysql容器
查看mysql数据库信息
查看myf配置⽂件内容
从上⾯2张图中,可以明显的看到,我们之前创建的数据库docker_test、表test,都没有了!但是修改的myf配置⽂件的内容还是保留着的。
why为什么会这样呢?
官⽅⽂档在commit命令的介绍中,有这样⼀段话:
The commit operation will not include any data contained in volumes mounted inside the container.
意思是commit操作并不会包含容器内挂载数据卷中的数据。
如果对于“数据卷”不了解的话,确实看不懂是什么意思。
数据卷与数据卷容器
⽣产环境中使⽤Docker的过程中,往往需要对数据进⾏持久化,或者需要在多个容器之间进⾏数据共享,这必然涉及容器的数据管理操作。
容器中管理数据主要有两种⽅式:
数据卷(Data Volumes):数据卷是⼀个可供容器使⽤的特殊⽬录,它将主机操作系统⽬录直接映射进容器。
数据卷容器(Data Volume Containers):数据卷容器也是⼀个容器,但是它的⽬的是专门⽤来提供
数据卷,供其他容器挂载使⽤的。
根据官⽅⽂档对于commit的介绍中,可以猜测到为何之前创建的数据库、表都不见了,原因是因为mysql容器的挂载数据卷引起的。
我们可以通过命令查看到别名是“mysql”的容器挂载数据卷的⽬录。
看⼀下我们的“mysql”容器的ID信息,⽅便查看。
通过命令docker inspect查看mysql这个容器的数据卷挂载信息:
docker inspect c9
执⾏命令之后,由于显⽰的内容⽐较多,这⾥我们就贴⼀下重要的信息:
通过图中可以看到,mysql容器将容器内的/var/lib/mysql路径作为volume挂载。真正的数据库相关数据⽂件所在的⽬录就是“Source”对应的⽬录,
即:/var/lib/docker/volumes/1b0b17f6a4f78d357a187116d75991db8ee784213e67cc9b9988c8ef647fe563/_data
我们可以进⼊mysql容器查看/var/lib/mysql⽬录下的内容:
发现的确是mysql数据库的数据⽂件(红⾊区域)。
这时候,我们切换到Linux命令⾏,进⼊到mysql容器的数据挂载⽬录,看看该⽬录下有什么内容:
/var/lib/docker/volumes/1b0b17f6a4f78d357a187116d75991db8ee784213e67cc9b9988c8ef647fe563/_data
如下图所⽰:
咦~ 是不是发现了什么!把黄⾊区域的内容与上图中红⾊区域内容进⾏对⽐,是不是内容⼀模⼀样!
这也就印证了,当初我们在mysql容器中创建的数据库、表等,真正的数据库⽂件存放的位置就是在宿主机下⾯,⽽不是存放在容器中。
到此,我们终于知道了为何mysql-new容器中的数据库、表都不见了,原来数据库⽂件是存放在宿主机上的。
那该如何解决这个问题呢?怎样才能让mysql-new容器启动之后可以正常加载我们之前创建的数据库、表等数据呢?这就引⼊了下⾯的正题 —— 数据挂载。
数据挂载
上⾯的⽂章⾥⾯,把问题描述的⾮常详细清楚。我这⾥就不多做说明了。
使⽤ -v 实现数据挂载(数据卷)
如果我们想在 run ⼀个新的mysql容器的时候,可以正常访问我们之前在mysql容器中创建的数据库、表数据,则在docker run命令启动容器的时候,就需要指定挂载⽬录。
注意:要想让新的mysql容器能正常挂载名称是“mysql”容器,前提是需要先停⽌名称是“mysql”的容器,不然的话,即使run命令配置正确,容器启动的时候会⼀直报错:
上图就是因为没有事先停⽌mysql容器导致的。
下⾯开始具体操作:
先停⽌mysql容器
重新启动⼀个新的mysql容器,命令如下:
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-v -v /var/lib/docker/volumes/1b0b17f6a4f78d357a187116d75991db8ee784213e67cc9b9988c8ef647fe563/_data:/var/lib/mysql mysql
最重要的⼀个参数 -v :挂载数据卷。-v 后⾯的值中间有“:”号,前半部分指的是宿主机的⽬录(也就是我们上⾯的mysql容器的数据库存储的⽬录),后半部分指的是容器的⽬录。
实现的效果就是说:新启动的容器,挂载宿主机的⽬录,实现数据共享。
运⾏结果:
登录新的mysql-v容器,查看数据库信息
直接看下图的命令操作吧:
看到效果了吧!在这个mysql-v的新容器⾥⾯,已经可以看到我们⼀开始在“mysql”容器中创建的数据库和表了。
也就实现了容器之间的数据共享。
核⼼的实现就是在run命令⾥⾯加⼊了 -v 参数。如果不太明⽩-v的含义的,可以⾃⾏⽹上查询资料了解学习,加深印象。
上⾯我们解决了容器挂载数据卷的问题,但是细⼼的朋友,可能还有⼀个疑问:
为什么修改了myf配置⽂件、以及运⾏mysql镜像时指定的MYSQL_ROOT_PASSWORD=123456,却依然可以在新容器mysql-new中使⽤呢,为什么这俩样数据不会消失
呢?
官⽅⽂档对于commit命令还有这样⼀段描述:
It can be useful to commit a container’s file changes or settings into a new image.
⾕歌翻译过来的意思就是:将容器的⽂件更改或设置提交到新映像可能很有⽤。
还记得我们当初运⾏第⼀个mysql容器的时候,docker run 命令是怎样的,这⾥贴⼀下当时启动容器的命令:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql
其中,⾥⾯使⽤到了 -e 参数,设置了root⽤户的密码为123456。
所以,结合官⽅⽂档对commit的介绍(It can be useful to commit a container’s file changes or settings into a new image. ),就可以知道,通过 -e 设置的信息,在使⽤commit提交新镜像的时候,这些设置被容器保留了下来,commit命令使⽤这些设置构建了新的镜像,在新容器⾥⾯使⽤的是相同的设置。
这也印证了,我们在mysql-new容器中登录数据库的时候,登录密码写的是123456。因为在第⼀次启动mysql服务的时候,⽤户root密码是通过 -e 指定的,所以在commit提交新的镜像的时候,是被⼀同提交到了新镜像mysql-new中。
数据卷容器
通过数据卷容器也可以实现多个容器间的数据共享。
如果要授权⼀个容器访问另⼀个容器的数据卷,我们可以使⽤-volumes-from参数来执⾏docker run。
(这⾥就不多做说明了,有兴趣的可以⽹上⾃⾏查阅资料研究)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论