容器数据卷

docker的理念回顾

将应用和环境打包成一个镜像

需求:数据可以持久化和同步

使用数据卷

指定路径挂载

docker run -it -v 主机目录:容器内目录

# 测试
[root@hwh1 ~]# docker run -it -v /home/test:/home tomcat10.0.0:1.0 /bin/bash
[root@hwh1 ~]# docker inspect 4446060c16ca
....... "Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
], ....... [root@hwh1 home]# ls
hwh test # 可以看到已经有文件夹了
# 测试容器内新增文件是否会添加到 主机
root@3e7209654d79:/home# touch test1.txt
root@3e7209654d79:/home# ls
test1.txt
# 主机内同步添加
[root@hwh1 test]# pwd
/home/test
[root@hwh1 test]# ls
test1.txt # 测试当容器停止时,在主机上添加文件 重新启动后 会发现容器中也会增加
# 新增文件
[root@hwh1 test]# touch test2.txt
[root@hwh1 test]# ls
test1.txt test2.txt
# 启动容器
[root@hwh1 ~]# docker start 3e7209654d79
3e7209654d79
[root@hwh1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e7209654d79 tomcat10.0.0:1.0 "/bin/bash" 4 hours ago Up 3 seconds 8080/tcp practical_archimedes
# 进入容器查看
[root@hwh1 ~]# docker attach 3e7209654d79
root@3e7209654d79:/usr/local/tomcat# cd /home/
root@3e7209654d79:/home# ls
test1.txt test2.txt

测试:安装 MySQL

# 拉取镜像
[root@hwh1 ~]# docker pull mysql:5.7
[root@hwh1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 9cfcce23593a 2 weeks ago 448MB # 运行容器 挂载数据,设置密码
[root@hwh1 ~]# docker run -d -p 3306:3306
-v /home/mysql/conf/:/etc/mysql/conf.d
-v /home/mysql/data/:/var/lib/mysql --name mysql1.0 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# -d 后台运行
# -p 暴露端口
# -v 卷挂载
# --name 设置名字
# -e 环境配置
# MYSQL_ROOT_PASSWORD=123456 mysql密码设置 [root@hwh1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3954a6cf0d8a mysql:5.7 "docker-entrypoint.s…" 10 seconds ago Up 8 seconds 33060/tcp, 0.0.0.0:3306->3306/tcp mysql1.0
# 用 mysql 连接工具测试 # 查看 data
[root@hwh1 data]# pwd
/home/mysql/data
[root@hwh1 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

具名和匿名挂载

# 查看所有卷  的情况
[root@hwh1 ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume 创建一个 volume
inspect Display detailed information on one or more volumes 显示一个或多个卷的详细信息
ls List volumes 列表查看 volume
prune Remove all unused local volumes 移除所有不用的 volumes
rm Remove one or more volumes 移除一个或者多个 volumes # 匿名挂载
# -v 容器内路径
[root@hwh1 ~]# docker run -d --name nginx02 -P -v /etc/nginx nginx:1.19.0
1baf9eb9dc56967b790999942bdb346a8ade8eff8636f1776ef7996eb63ec2ae
# 因为在挂载的时候,只写了容器内路径,而没有写 主机路径,这就是匿名挂载
[root@hwh1 ~]# docker volume ls
DRIVER VOLUME NAME
local 0586a6dd5c3052d18e9baff561bc0c2fb310428b3791efa80d424646e0a6912a # 具名挂载
# -v 卷名:容器内目录
[root@hwh1 ~]# docker run -d -P -v obviousNginx:/etc/nginx nginx:1.19.0
cb7f8b00b8b5ff926696e48f63fe7ce71db8de5332d41cbd3ce1d5efbd780bf8
[root@hwh1 ~]# docker volume ls
DRIVER VOLUME NAME
local obviousNginx
[root@hwh1 ~]# docker volume inspect obviousNginx
[
{
"CreatedAt": "2020-06-24T20:50:01+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/obviousNginx/_data",
"Name": "obviousNginx",
"Options": null,
"Scope": "local"
}
]

所有的 docker容器内的卷,没有指定目录的情况下都是在 “/var/lib/docker/volumes/卷名/_data”

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

具体区别

-v 容器内路径           # 一 匿名挂载
-v 卷名:容器内目录 # 二 具名挂载
-v 主机目录:容器内目录 # 三 指定路径挂载

扩展

# 设置权限 ro rw 改变读写权限
# -v 容器内路径:ro/rw
ro readonly # 只读,只能通过主机操作,容器内部无法操作
rw readwrite # 可读可写

初识Dockerfile

Dockerfile就是用来构建 docker镜像的构建文件

# 简单构建测试
[root@hwh1 home]# mkdir dockerfile_test
[root@hwh1 home]# cd dockerfile_test/
[root@hwh1 dockerfile_test]# pwd
/home/dockerfile_test
[root@hwh1 dockerfile_test]# vim dockerfile1
[root@hwh1 dockerfile_test]# cat dockerfile1
FROM centos VOLUME ["volume01","volume02"] # 挂载目录,匿名挂载 CMD echo"success" # 输出成功证明脚本运行成功
CMD /bin/bash # 默认 bash 控制台 # -f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile') dockerfile 路径
# --tag list Name and optionally a tag in the 'name:tag' format 版本 [root@hwh1 dockerfile_test]# docker build -f dockerfile1 -t centos:1.0 . # 注意这里有个点 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos # 分布设置
latest: Pulling from library/centos
6910e5a164f7: Pull complete
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
---> 831691599b88
Step 2/4 : VOLUME ["volume01","volume02"] # 挂载目录
---> Running in 982ae0c60dd5
Removing intermediate container 982ae0c60dd5
---> 8c5dc67775f3
Step 3/4 : CMD echo"success"
---> Running in 5c3d0ee1ba60
Removing intermediate container 5c3d0ee1ba60
---> e391fd4d40e6
Step 4/4 : CMD /bin/bash
---> Running in 2ec7cb4632dc
Removing intermediate container 2ec7cb4632dc
---> 4f7354d57ff3
Successfully built 4f7354d57ff3
Successfully tagged centos:1.0
[root@hwh1 dockerfile_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1.0 4f7354d57ff3 27 seconds ago 215MB

# 启动自己写的镜像测试
[root@hwh1 ~]# docker run -it 4f7354d57ff3 /bin/bash
[root@1d2a9a575139 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jun 28 13:48 dev
drwxr-xr-x. 1 root root 66 Jun 28 13:48 etc
drwxr-xr-x. 2 root root 6 May 11 2019 home
lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------. 2 root root 6 Jun 11 02:35 lost+found
drwxr-xr-x. 2 root root 6 May 11 2019 media
drwxr-xr-x. 2 root root 6 May 11 2019 mnt
drwxr-xr-x. 2 root root 6 May 11 2019 opt
dr-xr-xr-x. 350 root root 0 Jun 28 13:48 proc
dr-xr-x---. 2 root root 162 Jun 11 02:35 root
drwxr-xr-x. 11 root root 163 Jun 11 02:35 run
lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 May 11 2019 srv
dr-xr-xr-x. 13 root root 0 Jun 28 08:21 sys
drwxrwxrwt. 7 root root 145 Jun 11 02:35 tmp
drwxr-xr-x. 12 root root 144 Jun 11 02:35 usr
drwxr-xr-x. 20 root root 262 Jun 11 02:35 var
drwxr-xr-x. 2 root root 6 Jun 28 13:48 volume02
drwxr-xr-x. 2 root root 6 Jun 28 13:48 volume01

# 只有容器内路径挂载,匿名挂载
# 外部查看
[root@hwh1 ~]# docker volume ls
DRIVER VOLUME NAME
local 3147ec56df4ec370dadee55edc42c5f8a10d2e352b5eb0d74969b7ff64b06670
local 351272828a359dd2095d9f9caced693a1bf6272924637e3edfdead2945dd0782 # 查看容器的外部路径
[root@hwh1 ~]# docker inspect 1d2a9a575139
.......
"Mounts": [
{
"Type": "volume",
"Name": "351272828a359dd2095d9f9caced693a1bf6272924637e3edfdead2945dd0782",
"Source": "/var/lib/docker/volumes/351272828a359dd2095d9f9caced693a1bf6272924637e3edfdead2945dd0782/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "3147ec56df4ec370dadee55edc42c5f8a10d2e352b5eb0d74969b7ff64b06670",
"Source": "/var/lib/docker/volumes/3147ec56df4ec370dadee55edc42c5f8a10d2e352b5eb0d74969b7ff64b06670/_data",
"Destination": "volum02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
.......

数据卷容器

如果你有一些要在容器之间共享的持久性数据,或者希望在非持久容器中使用,那么最好创建一个命名的数据卷容器,然后从其挂载数据。

实现两个或者多个容器之间实现数据同步和共享

# 启动测试 用刚刚创建的镜像测试,启动三个容器
[root@hwh1 ~]# docker run -it --name docker01 centos:1.0
[root@6815ba3aebfa /]# # Ctrl + P +Q 不停止容器退出 # --volumes-from 指定容器载入卷
[root@hwh1 ~]# docker run -it --name docker02 --volumes-from docker01 centos:1.0 # 到 docker01 中的 volume01 或者 volume02 进行修改测试,查看是否同步到 docker02
[root@hwh1 ~]# docker exec -it cc6698c7e1ae /bin/bash
[root@cc6698c7e1ae volume01]# pwd
/volume01
[root@cc6698c7e1ae volume01]# mkdir test # 新增测试
[root@cc6698c7e1ae volume01]# ls
test # 回到 docker02 查看,已经实现同步数据
[root@f71dd97f742f /]# cd volume01
[root@f71dd97f742f volume01]# ls
test # 创建第三个容器 测试同步
[root@hwh1 ~]# docker run -it --name docker03 --volumes-from docker01 centos:1.0
[root@06b74c606532 /]# cd volume01
[root@06b74c606532 volume01]# ls
test
# 同样可以同步数据 # 测试删除 docker01 ,查看文件是否还存在
[root@hwh1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06b74c606532 centos:1.0 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker03
f71dd97f742f centos:1.0 "/bin/sh -c /bin/bash" 9 minutes ago Up 9 minutes docker02
cc6698c7e1ae centos:1.0 "/bin/sh -c /bin/bash" 30 minutes ago Up 30 minutes docker01
[root@hwh1 ~]# docker rm -f cc6698c7e1ae
cc6698c7e1ae
# docker02 还存在原来的文件
[root@f71dd97f742f /]# cd volume01
[root@f71dd97f742f volume01]# ls
test # 原理:相当于双向复制进行备份的形式,进行同步数据
# 在这种情况下,如果移除其中已经挂载的容器,无论是移除哪个,都不会被移除。
# 要将卷从硬盘上删除,必须使用 docker rm -v 删除所有引用该卷的容器

Docker(六)容器数据卷的更多相关文章

  1. docker 2 容器数据卷

    docker 启动tomcat docker run -it -p 8888:8080 tomcat 提交一个容器使之成为一个镜像 docker commit -a=“作者” -m=“提交信息” 模板 ...

  2. docker系列之六容器数据卷

    docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...

  3. Docker——容器数据卷

    为什么需要容器数据卷 角度:遇到问题,尝试以朴素的道理解决问题.问题复杂化,解决的方式也变得复杂 问题的提出:docker将应用和环境打包成一个镜像,但是对于容器内的数据,如果不进行外部的保存,那么当 ...

  4. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  5. docker 12 docker容器数据卷

    数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...

  6. Docker容器数据卷

    ⒈Docker容器中数据如何持久化? ①通过commit命令使容器反向为镜像 ②以容器数据卷的方式将数据抽离 ⒉容器数据卷的作用? ①容器数据的持久化 ②容器间继承.共享数据 ⒊能干嘛? 卷就是目录或 ...

  7. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  8. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  9. Docker 容器数据卷(Data Volume)与数据管理

    卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...

随机推荐

  1. Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)

    小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...

  2. Java实现 LeetCode 684 冗余连接(并查集)

    684. 冗余连接 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, -, N) 的树及一条附加的边构成.附加的边的两个顶点包含在1到N中间 ...

  3. Java实现 LeetCode 495 提莫攻击

    495. 提莫攻击 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和 ...

  4. Java实现 蓝桥杯VIP 算法提高 计算器

    算法提高 计算器 时间限制:1.0s 内存限制:256.0MB [问题描述] 王小二的计算器上面的LED显示屏坏掉了,于是他找到了在计算器维修与应用系学习的你来为他修计算器. 屏幕上可以显示0~9的数 ...

  5. Java实现 LeetCode 96 不同的二叉搜索树

    96. 不同的二叉搜索树 给定一个整数 n,求以 1 - n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 ...

  6. 关于EF的五种状态

    最近半个多月没更新原因是在赶项目...在做项目的时候就会发现自己很多问题,也有很多东西要记录,今天就记录一下对ef新的认识. 也就是关于ef的五种状态管理. Unchanged(持久态) Midifi ...

  7. 内核与驱动文件的version magic匹配问题

    https://blog.csdn.net/yubing_615/article/details/52183185 1.问题:本地编译的一整套底层代码down到设备跑都正常,但是由这套代码上传SVN服 ...

  8. [转] 浅谈C++中的那些内存泄露

    点击阅读原文 尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放. 今晚上我就犯了这种低级错误 ...

  9. nsswitch名称解析框架

    name service switch 名称解析框架(逻辑图) 让多种应用程序能灵活进行名称解析的通用框架 与各种类型存储进行交互的公共实现 规定通过哪些途径以及按照什么顺序通过这些途径来查找特定类型 ...

  10. 从JRaft来看Raft协议实现细节

    分布式系统和一致性问题 一致性问题(consensus problem)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...