1.下载mysql的镜像
我们先通过docker命令
docker pull mysql:latest
下载docker的镜像
这里我们可以在
mysql:
后加上我们想要的版本,这里如果没有指定版本将会下载最新的
latest
版本
2.数据卷挂载
在创建mysql容器之前,我们先了解一下什么时数据卷挂载:
首先,每当我们创建一个容器,容器内部的文件和宿主机文件是分离开的,这里会有两个比较重要的问题:
- 我们如果要直接操作mysql容器中的文件会很麻烦,在容器中目录层级可能会很复杂
- 我们如果要对mysql进行升级或者其他操作,那么数据卷会随之丢失,我们的数据库中的数据也会随之一起丢失
那么我们有什么方法去解决呢?当然就是数据卷挂载,我们先创建一个mysql容器来体验一下什么是容器
docker run -d\--name mysql-demo \-p3306:3306 \-eTZ=Asia/Shanghai \-eMYSQL_ROOT_PASSWORD=123\
mysql
我这里因为3306端口已经有一个mysql容器,所以我用3307端口来演示
下面逐条来解释一下每一条命令的含义
# 创建并运行一个容器,-d 是让容器在后台运行 docker run
# 给容器起一个名字(mysql),必须唯一--name mysql
# 设置端口映射 <宿主机端口>:<容器内端口>-p3306:3306
# 设置环境变量-eKEY=VALUE
# 指定运行时的镜像的名字,一般由两部分组成:[repository]:[tag],其中repostory就是镜像名,tag是镜像的版本,没有指定tag时,默认是latest,代表最新版本的镜像
mysql
接下来可以通过
docker ps
来查看我们的已经启动的容器
通过
docker inspect mysql-demo
可以查看我们mysql-demo容器的详细信息,我们这里找到Mounts这里,这里就是我们mysql-demo容器的详细挂载信息。
看到这里你可能会问,我还不会设置容器的数据卷挂载,为什么他这里直接自动挂载了呢?
这是因为我们在创建容器的时候,docker会帮我们自动生成一个匿名卷,然后和我们的mysql容器进行挂载,我们可以
docker volume ps
通过查看所有的数据卷信息,对应上图发现,这个就是我们对应的数据卷,我们mysql容器的数据都会存放在这里。
但是这名字也太长了,我们后期也不好维护,我们可以在创建容器的时候就指定数据卷的挂载
先将刚刚创建的mysql容器删除
docker rm -f mysql-demo
现在我们可以挑选一个地方来存储我们的数据卷,我这里以
/root
目录下来演示,先创建一个目录,并进入该目录
mkdir mysql-demo
cd mysql-demo
创建conf、data、init目录
mkdir conf
mkdir data
mkdir init
进入conf目录
cd conf
创建并编写一个.cnf配置文件,只要后缀是cnf即可,名字可以任意,我这里命名为custom.cnf
vi custom.cnf
编写内容如下,作用:在linux系统中查看数据库内容出现中文乱码
[client]default_character_set=utf8mb4
[mysql]default_character_set=utf8mb4
[mysqld]character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
到这里我们可以直接来创建并运行MySQL容器
docker run -d\--name mysql-demo \-p3306:3306 \-eTZ=Asia/Shanghai \-eMYSQL_ROOT_PASSWORD=123\-v /root/mysql-demo/data:/var/lib/mysql \-v /root/mysql-demo/init:/docker-entrypoint-initdb.d \-v /root/mysql-demo/conf:/etc/mysql/conf.d \
mysql
这次我们的命令和上面不同的是多出了三个
-v
开头的命令,这就是指定数据卷目录挂载的命令
我们可以再次查看mysql容器的挂载信息
docker inspect mysql-demo
到这里,我们就实现了数据卷的挂载,那么到底有什么用呢?
3.为什么要实现数据卷挂载?
实现数据卷挂载,只要我们每次创建容器挂载的是同一目录,那么我们就可以将数据保留,不会造成数据的丢失
我们可以先进入mysql容器
docker exec -it mysql-demo bash
然后连接mysql
mysql -u root -p123
接着我们可以创建一个数据库
create database mysql_test;
查看当前所有的数据库
show databases;
我们退出mysql
exit
再推出mysql容器
exit
删除刚刚创建的mysql容器
docker rm -f mysql-demo
现在我们可以通过
docker ps -a
命令来查看当前的所有容器,发现mysql-demo已经被删除,我们再次运行上面的创建容器命令,这里我们可以给我们的容器改一个名称
docker run -d\--name mysql-demo2 \-p3306:3306 \-eTZ=Asia/Shanghai \-eMYSQL_ROOT_PASSWORD=123\-v /root/mysql-demo/data:/var/lib/mysql \-v /root/mysql-demo/init:/docker-entrypoint-initdb.d \-v /root/mysql-demo/conf:/etc/mysql/conf.d \
mysql
进入mysql容器,发现我们之前创建的mysql_test表还在,相信你也对数据卷挂载有了一个清晰的认识
版权归原作者 本科生也有大厂梦 所有, 如有侵权,请联系我们删除。