6.运行mysql容器-理解容器数据卷

运行mysql容器-理解容器数据卷

  • 1.什么是容器数据卷
  • 2.如何使用容器数据卷
    • [2.1 数据卷挂载命令](#2.1 数据卷挂载命令)
    • [2.2 容器数据卷的继承](#2.2 容器数据卷的继承)
    • [2.3 数据卷的读写权限](#2.3 数据卷的读写权限)
    • [2.4 容器数据卷的小实验(加深理解)](#2.4 容器数据卷的小实验(加深理解))
      • [2.4.1 启动挂载数据卷的centos容器](#2.4.1 启动挂载数据卷的centos容器)
      • [2.4.2 启动后,在宿主机的data目录下会出现一个test的目录](#2.4.2 启动后,在宿主机的data目录下会出现一个test的目录)
      • [2.4.3 在宿主机的test目录下,新建一个a.go的文件](#2.4.3 在宿主机的test目录下,新建一个a.go的文件)
      • [2.4.4 在docker容器内部的home目录下,可以看到同步出现了a.go](#2.4.4 在docker容器内部的home目录下,可以看到同步出现了a.go)
      • 2.4.5在docker容器内部的home目录下,新建一个b.go文件
      • 2.4.6在宿主机的data/test目录下,可以看到出现一个b.go文件
      • [2.4.7 在容器的home目录下删除b.go,可以看到宿主的test目录下,b.go文件也被同步删除了](#2.4.7 在容器的home目录下删除b.go,可以看到宿主的test目录下,b.go文件也被同步删除了)
      • [2.4.8 使用docker inspect 查询挂载的数据卷](#2.4.8 使用docker inspect 查询挂载的数据卷)
    • [2.5 小结](#2.5 小结)
  • [3. 容器运行MySQL实战](#3. 容器运行MySQL实战)
    • [3.1 安装前的思考](#3.1 安装前的思考)
    • [3.2 制作MySQL的配置文件](#3.2 制作MySQL的配置文件)
    • [3.3 运行MySQL容器](#3.3 运行MySQL容器)
    • [3.4 验证](#3.4 验证)
      • [3.4.1 创建数据](#3.4.1 创建数据)
    • [3.4.2 验证容器重启后,数据不会丢失](#3.4.2 验证容器重启后,数据不会丢失)
    • [3.4.3 验证删除后,重启运行数据不会丢失](#3.4.3 验证删除后,重启运行数据不会丢失)
      • [3.4.3.1 删除容器](#3.4.3.1 删除容器)
      • [3.4.3.2 重新运行容器](#3.4.3.2 重新运行容器)
      • [3.4.3.3 验证](#3.4.3.3 验证)
    • 4.注意

1.什么是容器数据卷

将应用和环境打包成一个镜像,如果数据都在容器,一旦容器删除了,数据就会丢失了。要解决这个问题,就必须要进行数据的持久化

容器之间可以有一个数据共享的技术。Docker容器中产生的数据,同步到宿主机,这就是卷技术。目录的挂载,将我们容器内的目录,挂载到Linux上面!

所谓容器卷,就是容器的持久化和同步操作!容器间也是可以数据共享的!

2.如何使用容器数据卷

2.1 数据卷挂载命令

直接使用命令来挂载 -v

bash 复制代码
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录 镜像名

这里我们看到加了一个privileged=true的参数,这是为了解决Docker挂载主机目录如果出现cannot open directory.:Permission denied

如果是centos7安全模块会比之前系统版本加强,不安全的会禁止,所以目录挂载的情况被默认为不安全的行为。在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

2.2 容器数据卷的继承

这里所谓的继承,其实就是让一个容器使用另外一个容器的数据卷配置

bash 复制代码
docker run -it --privileged=true --volumes- from 父类容器 --name 新容器名称 镜像

2.3 数据卷的读写权限

这里所说的读写权限,指的是容器对数据卷的读写权限,千万别以为是宿主机!!!

默认可读可写rw

bash 复制代码
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录:rw 镜像名

只读权限

bash 复制代码
docker run -it --privileged=true -v 宿主机绝对路目录:/容器内目录:ro 镜像名

2.4 容器数据卷的小实验(加深理解)

2.4.1 启动挂载数据卷的centos容器

bash 复制代码
docker run --name mycentos  -it -v /data/test:/home centos /bin/bash

2.4.2 启动后,在宿主机的data目录下会出现一个test的目录

2.4.3 在宿主机的test目录下,新建一个a.go的文件

2.4.4 在docker容器内部的home目录下,可以看到同步出现了a.go

2.4.5在docker容器内部的home目录下,新建一个b.go文件

2.4.6在宿主机的data/test目录下,可以看到出现一个b.go文件

2.4.7 在容器的home目录下删除b.go,可以看到宿主的test目录下,b.go文件也被同步删除了

bash 复制代码
rm -rf b.go


2.4.8 使用docker inspect 查询挂载的数据卷

bash 复制代码
docker inspect --format='{{.Mounts}}' mycentos

2.5 小结

通过上面的小实验我们看到,使用容器数据卷,我们只需要在本地修改即可,容器内会自动同步。

3. 容器运行MySQL实战

3.1 安装前的思考

  • 我们知道,容器如果不对数据做持久化(挂载数据卷),那么容器一旦重启或者删除,数据也就消失。所以我们要对MySQ数据做持久化,也就是挂载数据卷
  • 之前在物理机上安装过MySQL的小伙伴都知道,安装完成后,我们要修改基本的配置,主要是编码。而如果要在容器内修改,那么容器删除后,配置也就消失了,并且在容器内写配置,也不是很方便,所以我们这里要挂载数据卷,实现配置的共享(和宿主机)。

3.2 制作MySQL的配置文件

vim my.cnf

bash 复制代码
[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

并把这个文件放到/data/mysql/conf下。

3.3 运行MySQL容器

bash 复制代码
docker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/msql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7.44

3.4 验证

3.4.1 创建数据


上面我创建了一个mmp的数据库,并且也创建了表sys_user

3.4.2 验证容器重启后,数据不会丢失

下面我重启这个容器,看容器会不会丢失。

bash 复制代码
docker restart mysql5.7

验证配置是否丢失

我们看到,这还是之前容器的配置,没有改变。

验证数据是否丢失

数据也没有丢失。

所以挂载容器数据卷后,容器重启后,数据不会丢失,配置也不会消失。

3.4.3 验证删除后,重启运行数据不会丢失

3.4.3.1 删除容器

bash 复制代码
docker rm -f mysql5.7

3.4.3.2 重新运行容器

bash 复制代码
docker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/msql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7.44

3.4.3.3 验证

验证配置是否丢失

我们看到,这还是之前容器的配置,没有改变。

验证数据是否丢失

数据也没有丢失。

所以挂载容器数据卷后,容器重启后,数据不会丢失,配置也不会消失。

4.注意

注意,这里运行的MySQL容器仅供自己学习使用,不能用于生产,因为配置太简单,并且也没有做基本的主从复制。

相关推荐
cooldream200910 个月前
一起学docker系列之七docker容器卷技术
运维·docker·容器·容器数据卷