Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
容器数据卷:可以实现宿主机与容器进行共享、容器数据持久化,容器与容器共享数据。可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数据卷,使用dockerfile构建镜像后,通过该镜像创建容器,那么会在宿主机中自动生成一个与之挂载的目录。使用这个dockerfile构建的镜像在run时使用参数volumes-from指定另外一个该镜像的容器,可以实现容器与容器进行数据盘挂载。
一 使用-v实现宿主机与容器数据共享
使用centos镜像,进行演示,进行镜像拉取:
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 4 months ago 209MB
创建并启动容器,使用-v参数实现宿主机与容器数据盘挂载
docker run -it -v /myhost:/mycontainer 300e315adb2f
使用docker inspcet 查看容器信息,可以看到数据已挂载,并且在宿主机创建了myhost目录,在容器创建了mycontainer目录,经写入文件可以看到数据会同步。
docker inspect centos
"Mounts": [{"Type": "bind","Source": "/myhost","Destination": "/mycontainer","Mode": "","RW": true,"Propagation": "rprivate"}],
可以看到RW是读写都支持,如果想让容器只读,可以如下设置
docker run -it -v /myhost:/mycontainer:ro 300e315adb2f
使用docker inspect查看 发现是只读模式
"Mounts": [{"Type": "bind","Source": "/myhost","Destination": "/mycontainer","Mode": "ro","RW": false,"Propagation": "rprivate"}],
二 创建dockerfile进行挂载
首先创建一个dockerfile文件,在该文件使用volume指定容器挂载的目录(不能指定宿主机目录,宿主机目录自动生成,使用inspect查看宿主机目录),对该文件进行build会得到一个新的镜像,使用这个镜像创建容器,将会实现容器与宿主机数据挂载。
创建dockerfile:在/myDocker目录下创建一个文件,名称为Dockerfile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]CMD echo "finished,--------success1"CMD /bin/bash
对dockerfile进行build生成自定义的镜像 mycentos (注意结尾处有一个 .)
docker build -f /mydocker/Dockerfile -t mycentos .
-f 指定dockerfile的目录,当不指定时在当前目录下找Dockerfile文件,-t 指定镜像名称 命名空间/镜像名称:标签,命名空间可以不写,标签不写默认是latest
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest---> 300e315adb2f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]---> Running in c08751afe82b
Removing intermediate container c08751afe82b---> d7ab4215ac34
Step 3/4 : CMD echo "finished,--------success1"---> Running in 04941c2e5c86
Removing intermediate container 04941c2e5c86---> c204038019a5
Step 4/4 : CMD /bin/bash---> Running in 7db403016320
Removing intermediate container 7db403016320---> 2a327c3561b0
Successfully built 2a327c3561b0
Successfully tagged mycentos:latest
镜像mycentos创建成功,看到镜像中指定了容器数据卷 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
使用镜像mycentos创建容器,容器名称指定为r1
[root@localhost mydocker]# docker run -it --name="r1" mycentos
[root@d8fe749fd7fe /]#
按ctr+p+q退出而不停止容器。
使用docker inspcet查看容器数据卷挂载信息
{"Type": "volume","Name": "e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1","Source": "/var/lib/docker/volumes/e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1/_data","Destination": "/dataVolumeContainer2","Driver": "local","Mode": "","RW": true,"Propagation": ""}
source就是自动生成的宿主机挂载目录
三 容器与容器通过容器数据卷进行数据挂载
容器使用相同的镜像创建(上一步构建的镜像mycentos),一个容器在创建并启动时,使用--volumes-from 指定另外一个容器的id,则实现了两个容器数据卷的数据挂载。
在上一步创建了容器r1
[root@localhost mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8fe749fd7fe mycentos "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes r1
再次创建两个容器r2 r3,这两个容器的volumes-from指向r1
[root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r2 mycentos
[root@e5992892fd8b /]#
[root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r3 mycentos
[root@c01d90b3c1f0 /]#
[root@localhost mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c01d90b3c1f0 mycentos "/bin/sh -c /bin/bash" 24 seconds ago Up 23 seconds r3
e5992892fd8b mycentos "/bin/sh -c /bin/bash" About a minute ago Up About a minute r2
d8fe749fd7fe mycentos "/bin/sh -c /bin/bash" 14 minutes ago Up 14 minutes r1
进入 r3 在容器数据卷挂载的目录下创建文件,发现r1 r2也出现了该文件,挂载成功。
[root@localhost mydocker]# docker attach r3
[root@c01d90b3c1f0 /]# ls
bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var
dataVolumeContainer1 dev home lib64 media opt root sbin sys usr
[root@c01d90b3c1f0 /]# cd dataVolumeContainer1
[root@c01d90b3c1f0 dataVolumeContainer1]# touch r3.txt
[root@c01d90b3c1f0 dataVolumeContainer1]# read escape sequence
[root@localhost mydocker]# docker attach r2
[root@e5992892fd8b /]# cd dataVolumeContainer1
[root@e5992892fd8b dataVolumeContainer1]# ls
r3.txt
[root@e5992892fd8b dataVolumeContainer1]# read escape sequence
[root@localhost mydocker]# docker attach r1
[root@d8fe749fd7fe /]# cd dataVolumeContainer1
[root@d8fe749fd7fe dataVolumeContainer1]# ls
r3.txt
[root@d8fe749fd7fe dataVolumeContainer1]#
Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化相关推荐
- CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口
CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口 注意第一种方法是在网上找的 , 我并没有执行成功 , 但是他分析的很不错, 可以参考第二种方法 首先需要明确docker的 ...
- docker容器内服务访问宿主机服务
我的个人博客:逐步前行STEP 本文背景: 操作系统:macOs 笔者的docker虚拟机中运行了nginx.node服务用来部署一个前后端分离的网站,但是由于docker内的node服务运行效率极低 ...
- 解决Docker容器没有权限写入宿主机目录
在应用docker容器的时候,更多的时候我们会把宿主机的目录挂载到docker容器中. 在宿主机的文件夹权限隶属于root时,我们需要将文件夹的权限用户进行 chown 设置,才能保证目录的内容的正常 ...
- 正在运行的容器目录映射到宿主机的讲解
不想重新 run 容器,但是又必须改目录映射,怎么办? 容器内的目录映射到宿主机上有两种情况,这两种情况无论是哪一种都需要重启docker服务方可生效. 容器目录映射是有两个(hostconfig.j ...
- VMware与宿主机文件夹共享、虚拟机磁盘映射
文章目录 一.要解决的问题 二.虚拟机磁盘映射 三.VMware与宿主机文件夹共享 一.要解决的问题 在VMware的win7虚拟机上使用phpstudy搭建网站服务器(使用wordpress模板), ...
- ubantu18.04使用docker部署mysql5.7及在宿主机登录容器内mysql
1.docker切换成国内源 cd /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors ...
- docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题...
我以为经过前面四篇博文的学习,自己对docker的了解最起码入门了,但是当我用docker启动一个81端口的nginx后(宿主机:容器/81:80),在宿主机的firwall防火墙没有添加81端口的情 ...
- 使Docker容器拥有可被宿主机以外的机器直接访问的独立IP
我们常用的docker容器都是将ip端口映射到宿主机,通过宿主机IP进行访问.外部无法直接访问容器IP,下面简单介绍下怎么做到局域网内直接访问docker容器IP. 自动化脚本见 https://gi ...
- docker网络问题解决办法“大全”:宿主机访问不了docker容器中web服务,容器内访问不了外网的问题的解决办法...
ubuntu kylin 15 安装docker后 ,启动包含web应用的容器,在宿主机上死活访问不了web服务.后来发现进入容器后,安装不了软件,访问不了外网.因此网上查原因,有大神说让重建dock ...
最新文章
- 什么是REST?以及RESTful的实现之二
- 算法杂货铺——k均值聚类(K-means)
- C语言文件操作(三)读取指定路径txt文件,并输出文件内容
- Leetcode 146. LRU 缓存机制
- 银行家算法总结及实现
- 获得SD卡的剩余容量
- css实现强制不换行/自动换行/强制换行
- Oracle中listener does not currently know of SID given in connect descriptor
- python爬取拉勾网_(转)python爬取拉勾网信息
- cmake 多次编译_Part01_CMakeLists构建管理多个模块的C代码
- t-sql还原数据库_如何更新T-SQL工具箱数据库
- 蚂蚁员工人均都能买1套杭州的房子了?!好后悔,当初错失了蚂蚁...
- 应用Mongoose开发MongoDB(1)数据库连接
- chrome插件“京东商品佣金助手”之京东云java web环境搭建(二)
- 海康大华PC客户端集成播放器
- python 中搞错工作路径的意思导致的相对路径产生bug:[Errno 2] No such file or directory:
- EM78P468 义隆单片机 单键触控
- mysql数据库范围之内_是mysql范围
- java 个人通讯录_java web个人通讯录系统设计
- windows PHP 5 版本的下载