Docker 容器数据卷

数据卷特点

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

总结: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据卷

容器中直接使用命令来添加

# 挂载命令 
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名 

# 测试
[root@iZwz98zi7ua638a1dxozhyZ ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@e039976cef28 /]#

# 查看数据卷是否挂载成功
[root@iZwz98zi7ua638a1dxozhyZ ~]# docker inspect e039976cef28
[
    {
        // ...
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        // ...
    }
]

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

# 容器
[root@e039976cef28 /]# cd /home/
[root@e039976cef28 home]# ls
[root@e039976cef28 home]# touch test.log
[root@e039976cef28 home]# ls
test.log

# 宿主机
[root@iZwz98zi7ua638a1dxozhyZ /]# cd /home/ceshi/
[root@iZwz98zi7ua638a1dxozhyZ ceshi]# ls
test.log

测试容器停止退出后,主机修改数据是否会同步!

  1. 停止容器
  2. 在宿主机上修改文件,增加些内容
  3. 启动刚才停止的容器
  4. 然后查看对应的文件,发现数据依旧同步!ok

使用 docker 安装 mysql

思考:mysql 数据持久化的问题!

# 1、搜索镜像
[root@iZwz98zi7ua638a1dxozhyZ home]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11608     [OK]       
...

# 2、拉取镜像
[root@iZwz98zi7ua638a1dxozhyZ home]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b380bbd43752: Already exists 
f23cbf2ecc5d: Already exists 
30cfc6c29c0a: Already exists 
b38609286cbe: Already exists 
8211d9e66cd6: Already exists 
2313f9eeca4a: Already exists 
7eb487d00da0: Already exists 
a71aacf913e7: Pull complete 
393153c555df: Pull complete 
06628e2290d7: Pull complete 
ff2ab8dac9ac: Pull complete 
Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

# 3、启动容器 -e 环境变量!
# 注意: mysql的数据应该不丢失!先体验下 -v 挂载卷! 参考官方文档
[root@iZwz98zi7ua638a1dxozhyZ home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
fc7aa88270a249114df59b3199f22c448a09056bcb4ef4b4e3daf3e822b550ac

# 4、使用本地的sqlyog连接测试一下 3310

# 5、查看本地的 /home/mysql 目录
[root@iZwz98zi7ua638a1dxozhyZ home]# cd /home/mysql/data/
[root@iZwz98zi7ua638a1dxozhyZ data]# pwd
/home/mysql/data

# 可以看到我们刚刚建立的mysql数据库在本地存储着
[root@iZwz98zi7ua638a1dxozhyZ data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem

# 6、删除mysql容器
# 删除容器,然后发现远程连接失败!
[root@iZwz98zi7ua638a1dxozhyZ data]# docker rm -f mysql01
mysql01

# 可以看到我们刚刚建立的mysql数据库在本地存储着
[root@iZwz98zi7ua638a1dxozhyZ data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem

匿名和具名挂载

# 匿名挂载
# -v 容器内路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b380bbd43752: Already exists 
fca7e12d1754: Pull complete 
745ab57616cb: Pull complete 
a4723e260b6f: Pull complete 
1c84ebdff681: Pull complete 
858292fd2e56: Pull complete 
Digest: sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36
Status: Downloaded newer image for nginx:latest
cc3b003bd095e3b3a9ac16aa196ce24090e96610f7a3a7ca1b66e9c3a16e8a18

# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume 维护
[root@iZwz98zi7ua638a1dxozhyZ home]# docker volume ls
DRIVER    VOLUME NAME
local     66ef490eef3840222f12448c8e9beb9e36f5f72185626b86cf390e2210794593

# 具名挂载
# -v 卷名:/容器内路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
85bda31b7f8160e1731793223d27bb34cefda6c549eb8f5ed6be6a528a6f30f3

# 查看挂载的路径
[root@iZwz98zi7ua638a1dxozhyZ home]# docker volume inspect nginxconfig
[
    {
        "CreatedAt": "2021-10-29T22:28:02+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
        "Name": "nginxconfig",
        "Options": null,
        "Scope": "local"
    }
]

# 怎么判断挂载的是卷名而不是本机目录名?
不是/开始就是卷名,是/开始就是目录名

# 改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值