Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
如果容器删除后,数据自然也就没有了。
使用数据卷能保存Docker容器的数据|
总结:容器的持久化和同步操作,容器间也可以数据共享
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点:
运行容器,指定挂载数据卷命令:
docker run -it -v 主机目录:容器目录
将主机目录/home/test和容器/home建立数据卷,
首先在容器目录下创建test.java文件,再去主机目录下查看是否有该文件。
两个文件夹相互同步,一个发生改变,另一个也会变
将外部文件夹/home/test 与 容器的/home 关联起来
[root@localhost ccc]# docker run -it -v /home/test:/home centos /bin/bash
[root@3f268c07d9a0 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@3f268c07d9a0 /]# cd home
[root@3f268c07d9a0 home]# ls
[root@3f268c07d9a0 home]# touch test.java //创建一个test.java文件
[root@3f268c07d9a0 home]# ls
test.java
[ccc@localhost /]$ ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[ccc@localhost /]$ cd home
[ccc@localhost home]$ ls
ccc test
[ccc@localhost home]$ cd test
[ccc@localhost test]$ ls //可以发现,多了test.java
test.java
查看容器对应元数据
docker inspect 容器id
,可以在Mounts节点查看建立的数据卷信息。
[root@localhost test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f268c07d9a0 centos "/bin/bash" 11 minutes ago Up 11 minutes awesome_rosalind [root@localhost test]# docker inspect 3f268c07d9a0 ........... "Mounts": [ { "Type": "bind", "Source": "/home/test", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ], ...........
即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。
docker run -d -p 3306: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 (加版本号,不加则用最新的)
-d 后台启动
-p 设置端口
-v 卷挂载
-e 环境配置
--name 容器名字
如果使用配置的密码连接mysql服务失败,原因很大可能是本机挂载的配置文件中已有文件,将容器中的配置给覆盖了,我们将相应的本机文件中的文件配置删除即可.
(1)创建数据卷
docker volume create my-vol
(2)查看所有的数据卷
$ docker volume ls
local my-vol
(3)查看指定数据卷的信息
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
(4)删除数据卷 docker volume rm ...
$ docker volume rm my-vol
(5)删除容器之时删除相关的卷
$ docker rm -v ...
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
(5)使用 --mount创建数据卷
挂载一个主机目录作为数据卷。使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp
python app.py
上面的命令挂载主机的/src/webapp目录到容器的/opt/webapp目录。用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
Docker 挂载主机目录的默认权限是读写 ,用户也可以通过添加readonly 参数指定为只读 。
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system
匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。
如下运行并匿名挂载Nginx容器:
[root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
d3a27b969d122d5516cac75e99b17dff7aaaf1e0c042385c6b05990053f1259
查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过 docker volume ls
命令可以查看当前数据卷的目录情况。
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
4ceaff19e5275dcd3014a8e7a8af618f7f7ce0da18d605c7c41a8653e78bf912
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26
local 668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956
local e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a
local juming-nginx <----------具名(-v juming-nginx:/etc/nginx nginx)
查看指定的数据卷信息的命令:docker volume inspect数据卷名称
[root@localhost ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-12-29T22:40:25+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
可以看到主机数据卷挂载在/var/lib/docker/volumes/juming-nginx/_data上
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
[root@localhost volumes]# ls
0cd45ab893fc13971219ac5127f9c0b02491635d76d94183b0261953bdb52d26 backingFsBlockDev juming-nginx
668a94251e562612880a2fdb03944d67d1acdbbdae6ef7c94bee8685644f2956 e605f3dc4bf11ab693972592b55fb6911e5bf2083425fd58869c5f574998a09a metadata.db
匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 # 匿名挂载-v 具名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
指定数据卷映射的相关参数:
ro —— readonly 只读。只能通过宿主机来改变,容器内无法操作
rw ----- readwrite 可读可写(默认)
# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx
我们可以在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
下面使用Dockerfile构建一个新的镜像,dockerfile01文件的内容,
匿名挂载了volume01和volume02两个目录:( docker inspect 容器ID,可以查到对应的文件地址)
创建一个Dockerfile文件,内容如下
FROM centos
VOLUME ["volume01","volume02"] #这两个目录会添加到镜像里面,互相同步
CMD echo "----end----"
CMD /bin/bash
执行构建镜像
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t ethan/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 215ef28fd5a6
Removing intermediate container 215ef28fd5a6
---> f506ddf133d2
Step 3/4 : CMD echo "----end----"
---> Running in 62a1c4b9dc7b
Removing intermediate container 62a1c4b9dc7b
---> bbea81a6e94e
Step 4/4 : CMD /bin/bash
---> Running in 245d239f3776
Removing intermediate container 245d239f3776
---> 1df90e6fd790
Successfully built 1df90e6fd790
Successfully tagged ethan/centos:1.0
[root@localhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ethan/centos 1.0 1df90e6fd790 13 minutes ago 209MB
mytomcat 1.0 f189aac861de 25 hours ago 653MB
mysql 5.7 f07dfa83b528 7 days ago 448MB
tomcat latest feba8d001e3f 11 days ago 649MB
nginx latest ae2feff98a0c 13 days ago 133MB
centos latest 300e315adb2f 3 weeks ago 209MB
portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 9 months ago 791MB
完成镜像的生成后,启动自己生成的容器
[root@localhost docker-test-volume]# docker run -it 1df90e6fd790 /bin/bash
[root@828d43dba78e /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 29 15:41 dev
drwxr-xr-x 1 root root 4096 Dec 29 15:41 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 111 root root 0 Dec 29 15:41 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume01 <---
drwxr-xr-x 2 root root 4096 Dec 29 15:41 volume02 <---
可以看到自动挂载的数据卷目录。下面查看对应宿主机的数据卷目录
[root@localhost docker-test-volume]# docker inspect 828d43dba78e
[
......
#重点:
"Mounts": [
{
"Type": "volume",
"Name": "c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc",
"Source": "/var/lib/docker/volumes/c51c75b11a69c526a97a07b03ce2ec74d8e77aa150b736291777c1c204a8aecc/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f",
"Source": "/var/lib/docker/volumes/1ae2d34c56c4352ba906b5bc261706b235a07ca2b3c9df6c612bb4380db8983f/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
]
可以看到Mounts下有宿主机的挂载目录。因为dockerfile中没有指定宿主机目录,所以属于匿名挂载,在/var/lib/docker/volumes/目录下生成了随机命名的路径。
--volumes-from
)容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
首先启动容器1,volume01、volume02为挂载目录。
[root@localhost ~]# docker run -it --name centos01 ethan/centos:1.0
[root@731d53b8c3d5 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
然后启动容器2,通过参数--volumes-from
,设置容器2和容器1建立数据卷挂载关系。
docker run -it --name 子容器名 --volumes-from 父容器名 镜像名:版本
[root@localhost /]# docker run -it --name centos02 --volumes-from cnetos01 ethan/centos:1.0
[root@7f90d4147511 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Dec 30 14:58 dev
drwxr-xr-x 1 root root 4096 Dec 30 14:58 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 108 root root 0 Dec 30 14:58 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Dec 29 15:41 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume01
drwxr-xr-x 2 root root 4096 Dec 30 14:54 volume02
首先在容器2中的volume01中添加文件
[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java
然后就可以看到容器1的文件也会添加上了
如果删除容器1,容器2的文件依旧存在
与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载,示例:
[root@localhost home]# docker run -d -p 6603: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
[root@localhost home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
文章浏览阅读3.3k次。下载对应的版本到本地,然后pip install xxxx.wheel安装即可。_error: could not build wheels for wxpython, which is required to install pyp
文章浏览阅读1.4w次,点赞6次,收藏73次。几种无线通讯介绍与比较(蓝牙,WiFi,IrDA,NFC,Zigbee,UWB)_蓝牙 wifi zigbee nfc比较
文章浏览阅读359次。prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270: error: unsupported reloc 43prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270: error:_error: unsupported reloc 43
文章浏览阅读81次。题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 targe..._java 二维数组 时间复杂度 ( + )o(n+m)
文章浏览阅读4.5k次,点赞5次,收藏32次。PVN3D_pvn3d怎么使用pointnet++的
文章浏览阅读2.3w次,点赞44次,收藏283次。Android Studio 实现播放本地/网络视频 目的工具及环境功能设计VideoView简介常用方法代码解释本地视频播放器activity_main.xmlMainActivity.java网络视频播放器AndroidManifest.xmlMainActivity.java完整代码activity_main.xmlAndroidManifest.xmlMainActivity.java最终效果本地视频播放器网络视频播放器暂停、停止视频拉动进度条关于VideoView的坑参考目的利用Android_android studio rtsp 播放
文章浏览阅读819次,点赞13次,收藏8次。SIT报告
文章浏览阅读413次。最近Xcode版本升级到10之后,运行项目时出现library not found for -lstdc++.6.0.9错误。项目中有用到libstdc++、libstdc++.6、libstdc++6.0.9这三个库文件的Xcode10谨慎更新报错原因是:使用之前的Xcode版本开发的项目中有用到libstdc++、libstdc++.6、libstdc++6.0.9这三个库文件,而Xcod..._-lstdc++.6.0.9
文章浏览阅读2.2k次。1.在app.config.js中的window配置项的内容替换为:"navigationStyle":"custom"custom表示自定义导航栏,但会保留右上角胶囊按钮。window: { // backgroundTextStyle: 'light', // navigationBarBackgroundColor: '#fff', // navigationBarTitleText: 'WeChat', // navigationBarTextStyle: _taro navigationstyle
文章浏览阅读1.1k次,点赞21次,收藏13次。本系列文章致力于用最简单的语言讲解Transformer架构,帮助朋友们理解它的强大,本文是第六篇:Transformer自注意力机制图文详解。_transformer 自注意力机制
文章浏览阅读2.2k次,点赞21次,收藏20次。【代码】安卓逆向学习之ADB的配置和使用及刷机root。_adb root
文章浏览阅读788次。若有代数式3ae/bc,则不正确的C语言表达式是( )更多相关问题Python字典支持双向索引。正则表达式模块re的_______方法用来在字符串开始处进行指定模式的匹配。Python字典中的“键”可以是元组。Python字典中的“键”不允许重复。表达式sorted([111, 2, 33], key=lambda x: len(str(x))) 的值为________________。已知 x ..._代数式3ae/bc,如何计算