目录

一、数据卷

1.1  便于修改

1.2  数据共享

1.3 安全问题

1.4 数据卷的基本语法

二、 创建数据卷,并查看数据卷在宿主机的目录位置

 2.1 创建数据卷

 2.2 查看所有数据卷

 2.3 查看数据卷详细信息卷

 2.4  删除数据卷

三、挂载数据卷

3.1 创建容器并挂载数据卷到容器内的HTML目录

3.2 进入html数据卷所在位置,并修改HTML内容

3.3 数据卷不创建时是否会挂载成功?

四、创建并运行一个MYSQL容器,将宿主机目录直接挂载到容器

4.1 添加mysql镜像

4.2 添加目录及文件

4.3 创建MySQL容器

 4.4 与数据卷挂载方式的对比


一、数据卷

  容器与数据耦合的问题

   数据卷:volume,是一个虚拟的目录,指向宿主机文件系统中的某个目录

   数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

     数据卷操作:

   1.1  便于修改

         docker会管理很多很多的数据卷,所有的这些数据卷都会指向宿主机文件系统的某一个目录

        比如我们创建了一个html的数据卷,那么我们的docker就会在宿主机文件系统下创建一个html的目录,每一个数据卷都会和一个真实的目录进行映射。

       我们可以理解为数据卷是虚拟的,真正指向的是宿主机文件系统中的某个目录(真实的文件夹)

      当我们的容器创建后就可以使用这个数据卷。

      比如说我们现在有一个容器,如果我们不加以操作所有的配置文件都会存储到conf文件夹下,所有的静态资源以及html文件的都会存放到html目录下,也就是说数据和容器耦合了。

     然后我们可以让容器内的内部目录和数据卷进行关联,本质其实是跟宿主机文件系统中对应的目录文件进行关联,然后docker就可以管理这个容器了

    比如我们在容器的html文件夹下写了一些内容,这些内容会立即写到对应的宿主机文件下,反过来也可以实现。简单来说宿主机文件系统中的文件和容器内的文件是通过数据卷进行连接

     总的来说 :我们在宿主机文件系统中修改,一定会立即反应到数据卷(volumes)对应的容器内部,不用再进入容器内部修改

   

 1.2  数据共享

也方便了数据的共享第二个容器的config目录也来挂载config数据卷,也就是说两个容器可以挂载同一个卷,我们在宿主机文件系统中做的一切修改,这两个容器也能看到,这就是数据共享

1.3 安全问题

    还有一个就是安全问题,比如说我们不小心把容器给删掉了,但是数据卷还没有删,所有的数据都还在,我们可以创建一个容器,然后接着挂载到数据卷上去,就可以了

1.4 数据卷的基本语法

 

二、 创建数据卷,并查看数据卷在宿主机的目录位置

 2.1 创建数据卷

docker volume create 数据卷名称

 2.2 查看所有数据卷

docker volume ls

发现有我们刚刚创建的html

 2.3 查看数据卷详细信息卷

docker volume inspect 数据卷名

可以看出挂载点在:/var/lib/docker/volumes/html/_data

 2.4  删除数据卷

命令:删除所有的本地未使用的卷

docker volume prune

命令: 删除指定数据卷

docker volume rm  数据卷名

三、挂载数据卷

我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录

案例:创建一个nginx容器,修改容器内html目录内的index.html内容

需求说明:

        上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置

/usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。

提示:运行容器时使用-v参数挂载数据卷

3.1 创建容器并挂载数据卷到容器内的HTML目录

查看一下是否有nginx,发现并没有,下面我们就可以安心的创建nginx容器

Docker——容器命令介绍、创建Nginx容器与Redis容器_我爱布朗熊的博客-CSDN博客

 不熟悉容器命令,可以看一下上面这篇文章

创建nginx容器

      docker run 创建容器

      --name mn  容器的名字是mn 

      -p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(如果没有  这个,没有人能访问这个容器),宿主机的端口只要没有被占用就可写(我的80端口被占用了,我用的81),容器内往往取决于应用程序本身,一般Nginx是80

    -v 数据卷名称(html):容器内目录(/usr/share/nginx/html)

    -d  : 后台运行程序 

    nginx:镜像的名称,例如:some-content-nginx,没写tag就是最新

docker run --name mn -p 81:80 -v html:/usr/share/nginx/html -d nginx

如果不记得了/usr/share/nginx/html,去官网查

我们先查看一下数据卷的位置:/var/lib/docker/volumes/html/_data

进入到数据卷的位置我们电脑下面

 \\wsl$\docker-desktop-data\data\docker\volumes    这是Windows版本

 cd /var/lib/docker/volumes/html/_data     这是linux版本

在下面这个路径下的html/_data

或者直接从我们的可视化界面查看 ,如果出现的话,就说明挂载成功了

 
 

3.2 进入html数据卷所在位置,并修改HTML内容

\\wsl$\docker-desktop-data\data\docker\volumes\html\_data

 之后我们修改一下代码,我是在这个文件下用vscode编译器打开修改的,记得保存!!!

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>风里雨里,山东等你</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

然后我们来页面看一下,因为我配置的是81,配置的什么端口号,这里就填什么端口号

上面是Windows版本的,下面是linux版本的

    直接找到,打开修改,简单粗暴,最好用编程工具打开

 

  3.3 数据卷不创建时是否会挂载成功?

  在我们刚刚完成的案例中,我们的数据卷是创建好的,如果数据卷不存在,会不会成功?

先删除之前的容器和清楚数据卷

再次创建nginx容器(在此之前不创建html数据卷)

 创建容器并挂载数据卷到容器内的HTML目录 (没有创建数据卷,直接运行命令挂载)

 

我们查看一下数据卷,发现是是存在的,说明自动把卷创建出来了

页面也恢复了之前的内容

四、创建并运行一个MYSQL容器,将宿主机目录直接挂载到容器

提示: 目录挂载与数据卷挂载的语法是类似的(数据卷挂载是   -v  数据卷名称:目录)

  • -v[宿主机目录]:[容器内目录]
  • -v[宿主机文件]:[容器内文件]   (这个功能数据卷没有)

4.1 添加mysql镜像

   如果对添加镜像陌生,可以查看下面这篇博客

Docker——镜像操作命令_我爱布朗熊的博客-CSDN博客

我们查看一下镜像,也确实存在

那Linux版本呢?

 直接拖过去

 加载

 

创建目录

然后再将文件拖进去

 

4.2 添加目录及文件

 创建两个目录

 在conf文件夹下添加下面的文件

4.3 创建MySQL容器

去dockerhub查阅资料,创建并运行mysql容器

  要求:挂载/tmp/mysql/data到mysql容器内数据存储目录

             挂载/tep/mysql/conf/hmy.cnf到mysql容器的配置文件

             设置MySQL密码

Docker Hub 

-e  环境变量    -e MYSQL_ROOT_PASSWORD=12 表示搞定密码为12

 如果不是最新版本的话,记得在mysql后面写上,比如mysql:5.7.25

docker run \
 --name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql  \   
-d  \
mysql:5.7.25 
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123  -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf  -v /tmp/mysql/data:/var/lib/mysql     -d mysql:5.7.25 

 

 我们可以看到,已经创建出来了

 

然后我们在Navicat连接一下试试

 

 切记:当我们连接的时候,我们运行时创建的什么密码,下面的密码就填写什么,否则就会报错

           当我是linux连接的时候,下面的主机一定是192.168.174.100 和linux中的静态ip相同才能成功连接,亲测有效

 4.4 与数据卷挂载方式的对比

数据卷的方式相当于全交给了docker去管理,我们不用关系但是劣势是目录不是我们创建的,我们想要找就比较的麻烦

  目录挂载的优势就是我们可以很好的知道文件在哪,不用代理,麻烦的地方就是需要我们自己管理创建目录,说实话还是可以的

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐