docker深入1-docker的数据卷

参考:
http://docs.docker.com/userguide/dockervolumes/

针对数据的存储,有个data volume的概念。
使用参数: -v
在container中创建一个volume,或者类似目录映射的方式,挂载一个数据盘或者目录到docker的container中。
环境准备:
[[email protected] ~]# yum install docker-io -y
[[email protected] ~]# docker -v
Docker version 1.5.0, build a8a31ef/1.5.0
[[email protected] ~]# service docker start
[[email protected] ~]# useradd Jack && usermod -a -G docker Jack
[[email protected] ~]# su Jack
[[email protected] bin]$ docker pull centos
[[email protected] bin]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              7                   fd44297e2ddb        11 days ago         215.7 MB
centos              centos7             fd44297e2ddb        11 days ago         215.7 MB
centos              latest              fd44297e2ddb        11 days ago         215.7 MB

一、简单的方式是:挂载一个数据目录到container中
[[email protected] bin]$ docker run -d -it -v /home/datacenter:/datacenter --name datacenter centos                
66f5e0e0e7042e371c092ff24117598055b7f65d4224f9738efbf13ba6273127
[[email protected] bin]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
66f5e0e0e704        centos:7            "/bin/bash"         12 seconds ago      Up 11 seconds                           datacenter             
[[email protected] bin]$ docker attach test01

[[email protected] /]# ll /
total 60
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 bin -> usr/bin
drwxr-xr-x.   2 root root 4096 May  4 02:55 datacenter
drwxr-xr-x.   5 root root  380 May  4 02:51 dev
drwxr-xr-x.  47 root root 4096 May  4 02:51 etc
drwxr-xr-x.   2 root root 4096 Jun 10  2014 home
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Apr 15 14:28 lib64 -> usr/lib64
drwx------.   2 root root 4096 Apr 15 14:26 lost+found
drwxr-xr-x.   2 root root 4096 Jun 10  2014 media
drwxr-xr-x.   2 root root 4096 Jun 10  2014 mnt
drwxr-xr-x.   2 root root 4096 Jun 10  2014 opt
dr-xr-xr-x. 235 root root    0 May  4 02:51 proc
dr-xr-x---.   2 root root 4096 Apr 15 14:29 root
drwxr-xr-x.  10 root root 4096 Apr 15 14:29 run
lrwxrwxrwx.   1 root root    8 Apr 15 14:28 sbin -> usr/sbin
drwxr-xr-x.   2 root root 4096 Jun 10  2014 srv
dr-xr-xr-x.  13 root root    0 May  4 02:51 sys
-rw-r--r--.   1 root root   11 May  4 02:52 test01
-rw-r--r--.   1 root root   11 May  4 02:52 test04
drwxrwxrwt.   7 root root 4096 May  4 02:51 tmp
drwxr-xr-x.  13 root root 4096 Apr 15 14:28 usr
drwxr-xr-x.  19 root root 4096 Apr 15 14:29 var
[[email protected] /]# df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-252:0-262241-66f5e0e0e7042e371c092ff24117598055b7f65d4224f9738efbf13ba6273127  9.8G  254M  9.0G   3% /
tmpfs                                                                                             1.9G     0  1.9G   0% /dev
shm                                                                                                64M     0   64M   0% /dev/shm
/dev/mapper/vg_svr20010-lv_root                                                                    50G  9.3G   38G  20% /etc/hosts
/dev/mapper/vg_svr20010-lv_home                                                                   405G   48G  338G  13% /datacenter
tmpfs                                                                                             1.9G     0  1.9G   0% /proc/kcore

写入数据:
[[email protected] /]# echo "`date` aaa" >/datacenter/test01
[[email protected] /]# echo "`date` 123" >/datacenter/test02   
[[email protected] /]# ls /datacenter/
test01  test02
[[email protected] /]# cat /datacenter/test0*
Mon May  4 02:57:19 UTC 2015 aaa
Mon May  4 02:57:27 UTC 2015 123

[[email protected] /]# exit 
exit

查看宿主机挂载目录的文件和内容:
[[email protected] bin]$ ll /home/datacenter
total 8
-rw-r--r--. 1 root root 33 May  4 10:57 test01
-rw-r--r--. 1 root root 33 May  4 10:57 test02
[[email protected] bin]$ cat /home/datacenter/test0*
Mon May  4 02:57:19 UTC 2015 aaa
Mon May  4 02:57:27 UTC 2015 123

[[email protected] bin]$ docker stop datacenter
datacenter
[[email protected] bin]$ docker rm datacenter  
datacenter

二、复杂一点儿:创建一个data volume container,共享给其他container
如官网所示:
If you have some persistent data that you want to share between containers, or want to use from non-persistent containers, it‘s best to create a named Data Volume Container, and then to mount the data from it.

1)创建一个container,提供一个数据卷供其他container使用:
[[email protected] bin]$ docker run -d -it -v /home/datacenter:/datacenter --name Data_Vol centos  
7691eccc73f6e4e2e2c3d6816cf6ba6a80a5f98f5067d48db6e8bafb4e4db021

[[email protected] bin]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7691eccc73f6        centos:7            "/bin/bash"         7 seconds ago       Up 5 seconds                            Data_Vol   

再创建2个container,使用刚才创建的数据卷Data_Vol来存储数据。
在启动container时,用这个参数:--volumes-from Data_Vol,而不是之前提到的-v参数,来挂载数据卷。

2)创建一个container:app1   ,写入一点儿数据  
[[email protected] bin]$ docker run -d -it --volumes-from Data_Vol --name app1 centos
1474f622b7f04c98da98e320d10864538b50b0b053677bbda039c8fb657062c1
[[email protected] bin]$ docker attach app1

[[email protected] /]# ll /
total 52
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 bin -> usr/bin
drwxr-xr-x.   2 root root 4096 May  4 02:56 datacenter
drwxr-xr-x.   5 root root  380 May  4 03:40 dev
drwxr-xr-x.  47 root root 4096 May  4 03:40 etc
drwxr-xr-x.   2 root root 4096 Jun 10  2014 home
lrwxrwxrwx.   1 root root    7 Apr 15 14:28 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Apr 15 14:28 lib64 -> usr/lib64
drwx------.   2 root root 4096 Apr 15 14:26 lost+found
drwxr-xr-x.   2 root root 4096 Jun 10  2014 media
drwxr-xr-x.   2 root root 4096 Jun 10  2014 mnt
drwxr-xr-x.   2 root root 4096 Jun 10  2014 opt
dr-xr-xr-x. 244 root root    0 May  4 03:40 proc
dr-xr-x---.   2 root root 4096 Apr 15 14:29 root
drwxr-xr-x.  10 root root 4096 Apr 15 14:29 run
lrwxrwxrwx.   1 root root    8 Apr 15 14:28 sbin -> usr/sbin
drwxr-xr-x.   2 root root 4096 Jun 10  2014 srv
dr-xr-xr-x.  13 root root    0 May  4 03:40 sys
drwxrwxrwt.   7 root root 4096 May  4 03:40 tmp
drwxr-xr-x.  13 root root 4096 Apr 15 14:28 usr
drwxr-xr-x.  19 root root 4096 Apr 15 14:29 var
[[email protected] /]# ls /datacenter/
test01  test02
[[email protected] /]# touch /datacenter/app1
[[email protected] /]# ls /datacenter/       
app1  test01  test02
[[email protected] /]# echo "`date` hello app1" >/datacenter/app1 
[[email protected] /]# cat /datacenter/app1 
Mon May  4 03:43:11 UTC 2015 hello app1
[[email protected] /]# exit
exit

2)再创建一个container:app2   ,写入一点儿数据  
[[email protected] bin]$ docker run -d -it --volumes-from Data_Vol --name app2 centos
c4d743681ec95d78b21a52d3a558b4cab40a9f7ba43e884e4686c57c313b6923

[[email protected] bin]$ docker attach app2

[[email protected] /]# df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-252:0-262241-c4d743681ec95d78b21a52d3a558b4cab40a9f7ba43e884e4686c57c313b6923  9.8G  254M  9.0G   3% /
tmpfs                                                                                             1.9G     0  1.9G   0% /dev
shm                                                                                                64M     0   64M   0% /dev/shm
/dev/mapper/vg_svr20010-lv_root                                                                    50G  9.3G   38G  20% /etc/hosts
/dev/mapper/vg_svr20010-lv_home                                                                   405G   48G  338G  13% /datacenter
tmpfs                                                                                             1.9G     0  1.9G   0% /proc/kcore
[[email protected] /]# ls /datacenter/ 
app1  test01  test02
[[email protected] /]# cat /datacenter/app1 
Mon May  4 03:43:11 UTC 2015 hello app1
[[email protected] /]# echo "`date` this is app2" >/datacenter/app2       
[[email protected] /]# exit
exit

[[email protected] bin]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
c4d743681ec9        centos:7            "/bin/bash"         6 minutes ago       Exited (0) 6 seconds ago                              app2                
1474f622b7f0        centos:7            "/bin/bash"         6 minutes ago       Exited (130) About a minute ago                       app1                
7691eccc73f6        centos:7            "/bin/bash"         7 minutes ago       Up 7 minutes                                          Data_Vol            
[[email protected] bin]$ 

3)我们停止Data_Vol这个容器,再试试写入数据
[[email protected] bin]$ docker stop Data_Vol

Data_Vol
[[email protected] bin]$ 
[[email protected] bin]$ docker start app1
app1
[[email protected] bin]$ docker ps -a        
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
c4d743681ec9        centos:7            "/bin/bash"         7 minutes ago       Exited (0) About a minute ago                       app2                
1474f622b7f0        centos:7            "/bin/bash"         8 minutes ago       Up 7 seconds                                        app1                
7691eccc73f6        centos:7            "/bin/bash"         8 minutes ago       Exited (137) 16 seconds ago                         Data_Vol            
[[email protected] bin]$ docker attach app1

[[email protected] /]# ls /datacenter/
app1  app2  test01  test02
[[email protected] /]# echo "`date` app1 is back here" >>/datacenter/app1        
[[email protected] /]# cat /datacenter/app1
Mon May  4 03:43:11 UTC 2015 hello app1
Mon May  4 03:48:53 UTC 2015 app1 is back here
[[email protected] /]# exit
exit

看起来,,这个用来持久化的Data_Vol不用启动,,其他的container用--volumes-from Data_Vol来挂载数据卷,也是可以正常使用的。

4)回到宿主机了,我们看下数据
[[email protected] bin]$ ls /home/datacenter/
app1  app2  test01  test02

看起来,文件都在这里呢,再看下数据:
[[email protected] bin]$ cat /home/datacenter/app1
Mon May  4 03:43:11 UTC 2015 hello app1
Mon May  4 03:48:53 UTC 2015 app1 is back here
[[email protected] bin]$ cat /home/datacenter/app2
Mon May  4 03:46:37 UTC 2015 this is app2

看,符合预期。
时间: 2024-11-08 06:14:47

docker深入1-docker的数据卷的相关文章

Docker 快速上手系列(4): 数据卷,数据卷容器的概念及相关操作

引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(mount)) 创建数据卷 在用Docker ru

Docker学习笔记(8-2)Docker - 数据卷容器

学习目的: 数据卷容器:用于在不能访问容器目录时,实现荣期间的数据共享 数据卷容器: 命名的容器挂在数据卷,其他容器通过挂在这个容器实现数据共享,挂载数据卷的容器就叫做数据卷容器 数据卷容器挂载宿主机目录. 挂载数据卷容器的方法 docker run --volumes-from [CONTAINER-NAME] # 使用上节课方法,构建过程中用指令创建数据卷 $ docker run -it --name dvt4 lexiaofei/dvt # ls #touch /datavolume1/

自己学Docker:5.Docker的数据持久化之数据卷

首先,别忘记之前的两个问题: 1. 如何保存我们在容器里的修改? 2. 如果apt-get如果不能安装时,如何在Docker中安装软件? 删除镜像命令 在此之前,先记一个命令, sudo docker rm ID/NAME 即删除创建的镜像.如 现在删除id为"cc8a23b1d624"的镜像. sudo docker rm cc8a23b1d624 可以看到,id为cc8a23b1d624的镜像被删除了. 而且可以发现,本地的/var/lib/docker/containers目录下

4.docker数据卷管理

生产过程中使用docker往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,因此就需要数据卷来做数据持久化 *数据卷:容器内数据直接映射到本地主机环境 数据卷的特性: 1)可以在容器之间共享和重用,容器间传递数据变得高效方便 2)对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作 3)对数据卷的更新不会影响镜像,解耦了应用和数据 4)卷会一直存在,直到没有容器使用,可以安全地卸载它 创建数据卷 docker run -it --name web -v ~/webapp:/w

Docker数据卷之进阶篇

[容器之间数据共享,修改同步] 配置如下: type 指定挂载方式,我们这里用到的是 volume,其实还可以有 bind 和 tmpfs. Volunme:这个目录只有Docker可以管理,其他进程不能修改.如果想持久保存容器的 应用数据,Volumes是Docker推荐的挂载方式. Bind:容器内的数据被存放到宿主机文件系统的任意位置,甚至存放到一些重要的系统 目录或文件中.除了Docker之外的进程也可以任意对他们进行修改: tmpfs:容器的数据只会存放到宿主机的内存中,不会被写到宿主

Docker 数据卷-Docker容器数据持久化方式

以tomcat为例,若是我们需要启动一个docker tomcat 容器,并将我们的工程放进tomcat启动 在没有数据卷的情况下,我们所采用的方式: 利用dockerfile将工程拷贝到tomcat 的 webapps目录下创建一个新的镜像,然后通过这个新的镜像来创建容器并启动,以此部署. 这种方式固然好用,但是却需要创建新的镜像,假如需要部署新的工程,又要创建新的镜像.很麻烦 而且,这种方式会造成重复写的问题,就是我们的工程文件实质上在docker容器和宿主机上写入了两次.造成性能损耗. 还

docker数据卷挂载使用

docker 提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts,tmpfs.volumes :docker管理宿主机文件系统的一部分,默认数据卷位置在(/var/lib/docker/volumes)bind mounts :可以存储宿主机的任意位置.tmpfs:挂载存储在宿主机系统的内存中,而不会写入的文件系统. docker volume 子命令使用:Commands:create Create a volumeinspect Display detail

Docker安装GitLab并挂载数据

下载镜像 # docker从仓库中拉取最新版的gitlab-ce镜像,如果没加标签的话,默认获取最新的版本latest sudo docker pull gitlab/gitlab-ce 挂载数据卷以及配置文件 # docker从仓库中拉取最新版的gitlab-ce镜像,如果没加标签的话,默认获取最新的版本latest sudo docker run --detach \ --hostname 134.175.36.150 --publish 9443:443 --publish 9080:80

【赵强老师】Docker Swarm集群的数据持久化

如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够数据持久化呢?我们可以通过volme.nfs等方法来实现swarm集群应用数据持久化,其实也和docker数据持久化的形式是一样的. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. volume NFS 共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步

数据卷及容器连接

应用在容器中运行,总会用到或者产生一些数据,那么这些数据是如何保存的呢?外部又是如何使用这些数据的呢? 容器网络基础:容器通过对外暴露端口向外提供服务数据卷的概念和使用:通过数据卷来存储和共享数据容器连接:通过互联让一个容器安全的使用另一个容器已有的服务 当Docker启动后,会在宿主主机上创建一个名为docker0的虚拟网络接口:[[email protected] ~]# ip address show1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdis