09Dcoker容器数据卷 命令-v挂载

目录

Dcoker容器数据卷

介绍

总结一句话:容器的持久化和同步操作!容器之间也是可以数据共享的

方式一:本地挂载  使用命令的方式来挂载 -v

容器停止,此时Linux修改文件,docker 容器在启动的时候,会更新过去 

举例:

测试:(本地能否链接成功)

​ ​

好处:我们修改只需在本地修改即可,容器内会自动同步!

假设我们将容器删除

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名挂载和匿名挂载

具名挂载: 

匿名挂载(推荐):

 docker volume ls 查看挂载名列表

 docker volume inspect 挂载名 查看挂载情

docker目录 /var/lib/docker/

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 具名挂载

区分三种挂载方式

拓展:

查看卷挂载的路径 docekr inspect

数据卷容器 --volumes-from

测试:

多个mysql实现数据共享

结论:


Dcoker容器数据卷

介绍

我们会有这么一种需求,我们需要容器中的一些目录可以同步到本地,这个做的目的有两个:

第一:对于一些容器我们我往往需要经常的修改配置文件,频繁的进入容器显得们麻烦。

第二:对于容器(mysql)中的数据,我们希望可以持久化到本地,作为一种备份。

针对上面的两个需求,docker给我提供了一种数据卷的技术,我们可以通过数据卷将docker容器中的目录与本地的Linux的目录进行挂载(双向绑定)。除了上述的本机与容器之间的数据挂载,容器与容器之间也是可以进行挂载的。09Dcoker容器数据卷 命令-v挂载_第1张图片

 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

总结一句话:容器的持久化和同步操作!容器之间也是可以数据共享的

方式一:本地挂载  使用命令的方式来挂载 -v

容器停止,此时Linux修改文件,docker 容器在启动的时候,会更新过去 

docker run -it -v 主机目录:容器目录
#测试
[root@master ~]# doceke run -it -v /home/ceshi:/home centos bin/bash

#启动起来时候我们可以通过 docker inspect 容器id  来查看详细信息

举例

        MySQL的数据持久化问题(需要数据持久化的需要思考) data

        下面我们将mysql中的/etc/mysql/conf.d/var/lib/mysql目录挂载到本地的/home/mysql/config/home/mysql/data目录下。

# 1、启动(挂载)   #安装mysql时需要配置密码  需要注意
[root@gh ~]# docker run --name mysql-test01 -itd -p 3306:3306 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
cac43dce9d011ee0cda595361e9915cc1b64ac2a5d5aab57fa9db3327a23e03a

    -p 端口映射
    -v 卷挂载
    -e 环境配置
    --name 容器名字

查看挂载是否成功 docker inspect  去查看容器的详细信息

[root@gh ~]# docker inspect cac43dce9d01

09Dcoker容器数据卷 命令-v挂载_第2张图片

# 未挂载前
[root@gh home]# cd /home
[root@gh home]# ls
gh  www

# 挂载 后
[root@gh home]# ls
gh  mysql  www
[root@gh home]# cd mysql

# 发现多出两个目录 config  data 
[root@gh mysql]# ls
config  data 
[root@gh mysql]# cd config
[root@gh config]# ls
[root@gh config]# cd ..

# 发现data目录下 的文件确实是/var/lib/mysql目录下的东西
[root@gh mysql]# cd data/
[root@gh data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@gh data]# 

测试:(本地能否链接成功)

09Dcoker容器数据卷 命令-v挂载_第3张图片 09Dcoker容器数据卷 命令-v挂载_第4张图片

好处:我们修改只需在本地修改即可,容器内会自动同步!

假设我们将容器删除

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名挂载和匿名挂载

我们上述讲的挂载方式为指定路径挂载(我们是指定了宿主机的挂载路径)。我们也可以通过具名和匿名两种方式进行挂载。具名和匿名挂载我们都不需要指定宿主机的挂载路径。

具名挂载: 

        docker run -d -P --name nginx01 -v /etc/nginx nginx

# 匿名挂载
-v 容器内路径!
$ docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume(卷)的情况
$ docker volume ls    
DRIVER              VOLUME NAME # 容器内的卷名(匿名卷挂载)
local     264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3
local     867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0
local     d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
local     e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
        
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径!

匿名挂载(推荐)

        docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

        -v juming-nginx:/etc/nginx  命了一个名字 不是一个目录  

        -v juming-nginx:/etc/nginx 加了/ 绝对目录开头   没有加 就是普通的配置

# 具名挂载 -P:表示随机映射端口
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee

# 查看所有的volume(卷)的情况
$ docker volume ls                  
DRIVER    VOLUME NAME
local     264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3
local     867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0
local     d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
local     e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
local     juming-nginx #多了一个名字


# 通过 -v 卷名:查看容器内路径
# 查看一下这个卷
$ docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-03-23T13:55:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #默认目录
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

 docker volume ls 查看挂载名列表

 docker volume inspect 挂载名 查看挂载情

docker目录 /var/lib/docker/

所有docker容器内的卷,没有制定目录的情况下的都在 /var/lib/docker/volumes/xxx_data

# docekr 目录 /var/lib/docker
[root@gh ~]# cd /var/lib/docker/
[root@gh docker]# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
[root@gh docker]# cd volumes/
[root@gh volumes]# ls
264e5fc71bbad5a329b28300f35713f4882546d95b91740a89cc882819843aa3  d355f4d2c1d8ff7d0baeb9147552e5d730b8201993e7dee5805c71b7b25ab6ec
867bf5dfd84b154d0cb262b69c8284b7c88cd43bf6bc0d0f05bd35f6d0f07fd0  e6aa6b909e1139822136e5232ee1ba0932bc308afaa6cbcac6458966cb80be15
backingFsBlockDev                                                 metadata.db
[root@gh volumes]# 

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 具名挂载

区分三种挂载方式

#区分三种挂载方式

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的

拓展:

# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写

#一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定了
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

查看卷挂载的路径 docekr inspect

09Dcoker容器数据卷 命令-v挂载_第5张图片

数据卷容器 --volumes-from

        多个容器之间同步数据

09Dcoker容器数据卷 命令-v挂载_第6张图片

# 启动docker 01
[root@gh ~]# docker run -it  --name docker01 cacef2eba361 /bin/bash
[root@f90a7cb23452 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 21 04:01 dev
drwxr-xr-x   1 root root 4096 Mar 21 04:01 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 108 root root    0 Mar 21 04:01 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Mar 21 04:01 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Mar 21 04:01 volume01
drwxr-xr-x   2 root root 4096 Mar 21 04:01 volume02

# 挂载上 docker02 volumes-form
[root@gh ~]# docker run -it  --name docker02 --volumes-from docker01 cacef2eba361 /bin/bash
[root@173c46baf306 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 21 04:02 dev
drwxr-xr-x   1 root root 4096 Mar 21 04:02 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 110 root root    0 Mar 21 04:02 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Mar 21 04:02 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Mar 21 04:01 volume01
drwxr-xr-x   2 root root 4096 Mar 21 04:01 volume02


# 进入docker 01   attacth
[root@gh /]# docker attach f90a7cb23452
[root@f90a7cb23452 /]# 

# 在docker01 的 volume01 中创建一个文件 docker01-test
[root@173c46baf306 /]# cd volume01
[root@173c46baf306 volume01]# touch docker01-test


# 在docker 02 的容器中查看 vilume01 发现有 docker01 创建的文件  
[root@f90a7cb23452 volume01]# ls
docker01-test
docker 01 创建的数据同步到了docker02上面

测试:

测试:可以删除docekr01,查看一下docker02和docker03是否还可以访问这个文件
测试依旧可以访问

多个mysql实现数据共享

[root@gh~]# docker run -d -p 3310:3306 -v/etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7


[root@gh~]# docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 
--volumes-from mysql01 mysql:5.7

#这个时候,可以实现连个容器数据同步

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

你可能感兴趣的:(#,Docker,docker,容器,运维,linux,centos)