容器数据卷:可以实现宿主机与容器进行共享、容器数据持久化,容器与容器共享数据。可以在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 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化相关推荐

  1. CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口

    CentOS7使用docker 启动容器后 , 宿主机连接访问不到容器的端口 注意第一种方法是在网上找的 , 我并没有执行成功 , 但是他分析的很不错, 可以参考第二种方法 首先需要明确docker的 ...

  2. docker容器内服务访问宿主机服务

    我的个人博客:逐步前行STEP 本文背景: 操作系统:macOs 笔者的docker虚拟机中运行了nginx.node服务用来部署一个前后端分离的网站,但是由于docker内的node服务运行效率极低 ...

  3. 解决Docker容器没有权限写入宿主机目录

    在应用docker容器的时候,更多的时候我们会把宿主机的目录挂载到docker容器中. 在宿主机的文件夹权限隶属于root时,我们需要将文件夹的权限用户进行 chown 设置,才能保证目录的内容的正常 ...

  4. 正在运行的容器目录映射到宿主机的讲解

    不想重新 run 容器,但是又必须改目录映射,怎么办? 容器内的目录映射到宿主机上有两种情况,这两种情况无论是哪一种都需要重启docker服务方可生效. 容器目录映射是有两个(hostconfig.j ...

  5. VMware与宿主机文件夹共享、虚拟机磁盘映射

    文章目录 一.要解决的问题 二.虚拟机磁盘映射 三.VMware与宿主机文件夹共享 一.要解决的问题 在VMware的win7虚拟机上使用phpstudy搭建网站服务器(使用wordpress模板), ...

  6. ubantu18.04使用docker部署mysql5.7及在宿主机登录容器内mysql

    1.docker切换成国内源 cd /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors ...

  7. docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题...

    我以为经过前面四篇博文的学习,自己对docker的了解最起码入门了,但是当我用docker启动一个81端口的nginx后(宿主机:容器/81:80),在宿主机的firwall防火墙没有添加81端口的情 ...

  8. 使Docker容器拥有可被宿主机以外的机器直接访问的独立IP

    我们常用的docker容器都是将ip端口映射到宿主机,通过宿主机IP进行访问.外部无法直接访问容器IP,下面简单介绍下怎么做到局域网内直接访问docker容器IP. 自动化脚本见 https://gi ...

  9. docker网络问题解决办法“大全”:宿主机访问不了docker容器中web服务,容器内访问不了外网的问题的解决办法...

    ubuntu kylin 15 安装docker后 ,启动包含web应用的容器,在宿主机上死活访问不了web服务.后来发现进入容器后,安装不了软件,访问不了外网.因此网上查原因,有大神说让重建dock ...

最新文章

  1. 什么是REST?以及RESTful的实现之二
  2. 算法杂货铺——k均值聚类(K-means)
  3. C语言文件操作(三)读取指定路径txt文件,并输出文件内容
  4. Leetcode 146. LRU 缓存机制
  5. 银行家算法总结及实现
  6. 获得SD卡的剩余容量
  7. css实现强制不换行/自动换行/强制换行
  8. Oracle中listener does not currently know of SID given in connect descriptor
  9. python爬取拉勾网_(转)python爬取拉勾网信息
  10. cmake 多次编译_Part01_CMakeLists构建管理多个模块的C代码
  11. t-sql还原数据库_如何更新T-SQL工具箱数据库
  12. 蚂蚁员工人均都能买1套杭州的房子了?!好后悔,当初错失了蚂蚁...
  13. 应用Mongoose开发MongoDB(1)数据库连接
  14. chrome插件“京东商品佣金助手”之京东云java web环境搭建(二)
  15. 海康大华PC客户端集成播放器
  16. python 中搞错工作路径的意思导致的相对路径产生bug:[Errno 2] No such file or directory:
  17. EM78P468 义隆单片机 单键触控
  18. mysql数据库范围之内_是mysql范围
  19. java 个人通讯录_java web个人通讯录系统设计
  20. windows PHP 5 版本的下载

热门文章

  1. 【LeetCode】一年中的第几天
  2. 让无线路由器告别电源束缚
  3. Linux - 系统安装
  4. iOS 高德地图(二)(进阶具体使用的细节)
  5. 使用canvas画出满天繁星
  6. 微软Win10彻底封杀exFAT/FAT32磁盘,格式化只剩NTFS/REFS
  7. LC3编码开源代码测试
  8. xp oracle10g安装图解,虚拟机xp系统中Oracle 10g的安装
  9. EXCEL中怎么把单元格中的数值提取出来?Excel提取单元格数字或某格式的字符串,支持正则式提取的绿色工具
  10. 小程序解决上拉加载更多时数据超过1024KB