Docker-08.Docker基础-本地目录挂载

一.需求说明

我们先来看一个需求:

首先查看mysql容器,是否有数据卷挂载。我们之前是没有对mysql容器进行数据卷挂载的。

复制代码
docker inspect mysql

使用该命令可以查看容器的具体信息:

复制代码
"Mounts": [
            {
                "Type": "volume",
                "Name": "65e9f00956e191fe2aa144ace8f03904e738945d0b6d40cafdb3292a0097d4c3",
                "Source": "/var/lib/docker/volumes/65e9f00956e191fe2aa144ace8f03904e738945d0b6d40cafdb3292a0097d4c3/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

可以找到Mounts里面展示了挂载信息。其中Source目录是在宿主机上的挂载路径。而Destination是在容器内部的路径。容器内该路径"/var/lib/mysql"是mysql容器的数据存储目录。因为mysql要不断的进行数据存储。因此其存储数据会不断增加。容器会不断变大。如果不做挂载,容器将来想要做迁移会非常麻烦。因此挂载是合理的。

Name是数据卷的名字,而这个名字不是我们起的,是自动生成的。这种由容器自动生成的数据卷因此又叫做匿名卷。我们不想使用这个名字,因为太长了很不方便记忆和使用。

假如我们现在要针对mysql进行版本升级,要把旧的mysql删掉。创建新的容器。删除后数据卷还在,数据还在。创建新的mysql容器,生成卷的名字就变了,原来的数据在旧的卷中就丢失了,等于只做了版本升级而没有进行数据迁移。

因此我们要使用本地目录挂载。将mysql容器挂载到本地目录。挂载到任何你想要挂载的地方。即宿主机和容器内目录直接挂载。

二.本地目录挂载

请注意,在挂载本地目录时一定要以./或者/开头而不能以字段名开头,否则将会被识别成数据卷而非目录。

我们首先创建要挂载的目录和文件夹。

复制代码
mkdir mysql

进入mysql目录下创建data,conf,init用来挂载mysql数据目录、配置文件和初始化脚本。

复制代码
mkdir conf

mkdir data

mkdir init

目录创建好了,那么容器内的哪些目录要和这些新创建的目录进行挂载呢?我们在官方文档中进行查阅。

配置文件目录(该目录也可以通过容器具体信息查看):

数据存储目录:

初始化目录:

明确了挂载点和被挂载的路径,我们就可以执行docker run命令进行本地目录的挂载了。

首先我们删除原来的MySQL容器,然后进行本地目录挂载。

复制代码
# 1.删除原来的MySQL容器
docker rm -f mysql

# 2.进入root目录
cd ~

我们首先将准备好的两个文件放入挂载点目录中。

接着运行命令:

复制代码
# 3.创建并运行新mysql容器,挂载本地目录
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql

挂载过后,有很多新数据产生。说明挂载成功的挂载到本地目录。

以上就容器本地目录挂载的方式。