docker_基础_2

接上篇

 [上篇文件](http://blog.51cto.com/xiong51/2093556) 

8、数据管理

docker数据持久化,数据共享,容器数据管理操作

数据卷(Volumes):容器内数据直接映射到本地主机环境
数据卷容器 (Bind mounts):使用特定容器维护数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除

8.1、容器内创建一个数据卷

docker run -v 或者 --mount 可以使用一个或多个-v创建多个数据卷,推荐使用 --mount

?? 注意: 数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷

创建一个web容器,并创建一个数据卷挂载到容器的/app目录下
    docker run -d -p 80:80 --name nginx -v /app nginx

# 挂载一个目录到nginx的index目录中,映射端口为80,并将主机的/tmp/html做为容器/usr/share/nginx/html/的数据卷
docker run -d -p 80:80 --name nginx -v /tmp/html:/usr/share/nginx/html nginx
    5649d6fd05465f9a4839e3c95fb239fb58f8c82f7b8c28133d1e02da26228cee

本地目录必须是绝对路径,如果目录不存在,docker会自动创建

# 附加到容器中测试数据卷
$ cker exec -it nginx /bin/bash
        [email protected]:/usr/share/nginx/html# touch b
        [email protected]:/usr/share/nginx/html# exit

# 这样容器被删除之后,数据也能持久保存了
$ ls  /tmp/html/
aa   index.html

docker 挂载数据卷默认权限是rw,可以通过ro指定为只读
$ docker run -d -p 81:80 --name nginx2 -v /tmp/html/:/usr/share/nginx/html/:ro nginx
   0817c41c79db18bac66f646e464af2186cbdc2e2261233985b4c2009a8b07ced

# 附加至容器中 该容器数据卷为ro就没法修改了
$ docker exec -it nginx2 /bin/bash
[email protected]:/# cd /usr/share/nginx/html/
[email protected]:/usr/share/nginx/html# touch b
    touch: cannot touch ‘b‘: Read-only file system

?? 注意:如果挂载的是一个文件,使用文本编辑过之后会造成inode更改,这将会导致报错误信息,所以推荐的方式是直接使用挂载文件所在的目录。

创建一个数据卷
 docker volume create my-volume
    my-volume

查看数据卷
 docker volume ls
        DRIVER              VOLUME NAME
        local               my-volume

查看数据卷的详细信息
  docker volume inspect my-volume
    [
    {
        "CreatedAt": "2018-04-04T00:56:58+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
        "Name": "my-volume",
        "Options": {},
        "Scope": "local"
    }
]

挂载容器
  docker run -d -p 80:80 --name web         # --v my-volume:/webapp
         --mount source=my-volume,target=/webapp  nginx
    8d0782dffc01b00c05861c3691d4d7bdde848c79965589e6a8ab0c01a07a37c5

测试挂载
[[email protected] html]#docker exec -it web /bin/bash
[email protected]:/webapp# touch a
[email protected]:/webapp# exit
[[email protected] html]#  ls /var/lib/docker/volumes/my-volume/_data/
        a

使用 docker inspect web 可查看容器的详细信息

查看挂载信息
docker inspect -f "{{".Mounts"}}" web
    [{volume my-volume /var/lib/docker/volumes/my-volume/_data /webapp local z true }]

先检查数据卷目录下的文件
ls /var/lib/docker/volumes/
795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e  metadata.db  my-volume

删除数据卷
  docker volume rm my-volume

再次查看数据卷的确是被删除了
ls /var/lib/docker/volumes/
   795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e  metadata.db

?? 数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。无主的数据卷可能会占据很多空间,要清理请使用以下命令

$ docker volume prune

8.2、数据卷容器

  使用--volumes-from 挂载另一个容器的数据卷
  如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器

创建一个数据卷  这里同时使用-v --mount配置
docker volume create my-vol 

挂载数据卷容器
docker run -dit --mount source=my-vol,target=/tmp/test --name web1 centos
或 # docker run -dit -a my-vol:/tmp/test --name web1 centos

查看挂载容器的目录
docker exec -it web1 ls -d /tmp/test
    /tmp/test

新建两个容器,用于测试文档的创建
docker run -dit --volumes-from web1 --name db1 centos
docker run -dit --volumes-from web1 --name db2 centos   

查看db2号容器的挂载信息,它的确已经挂载了本地的这个目录
docker inspect -f "{{".Mounts"}}" db2
    [{volume my-vol /var/lib/docker/volumes/my-vol/_data /tmp/test local  true }]

新建两个目录用于测试
docker exec -it web1 touch /tmp/test/web1.txt
docker exec -it db1 touch /tmp/test/db1.txt

查看容器是否已经成功创建了二个文件
docker exec -it db2 ls /tmp/test/
db1.txt  web1.txt

查看本地容器是否也同时创建了文件
ls /var/lib/docker/volumes/my-vol/_data/
db1.txt  web1.txt

使用db2做为db_3l_1的容器数据卷
    docker run -dit --volumes-from db2 --name db_3l_1 centos

查看/tmp/test/文件跟先前一样

停止 web1 容器
    docker stop web1

查看 db2 以及db2下关连的容器挂载也是正常的。

8.3、利用数据卷容器迁移数据

   利用数据卷容器对其中的数据卷进行备份、恢复以实现数据的迁移

原文地址:http://blog.51cto.com/xiong51/2094359

时间: 2024-08-30 17:32:40

docker_基础_2的相关文章

Day1_Python基础_2.Python历史

二.Python发展史 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus.他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言. 1991年,第一个Python编译器诞生.它是用C语言实现的,并能够调用C语言的库文件.从一出生,Python已经具有了:类,函数,异常处理,包含表和词典在内的核心数据类型,以

docker_基础_DockerFile

1.利用 dockerfile 定制镜像 ??镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积的问题就都会解决.这个脚本就是Dockerfile?? Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 配置第一个dockerfile文件 $ m

docker_基础_4_监控

接上篇12-20 21.监控 21.1.使用InfluxDB+cAdvisor+Grafana配置Docker监控   cAdvisor: Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机.更多详细操作和配置选项可以查看Github上的cAdvisor项目文档.  influxDB: 它是一个分布式时间序列数据库.cAdvisor仅仅显示实时信息,但是不存储监视数据.因

Docker_基础运用

1 docker的好处 开箱即用:快速部署:可移植性强:环境隔离 2 docker的常用命令 查看系统存在的镜像 docker images 网络搜索镜像(镜像名称组成 repository:tag) docker search 镜像名称 拉取镜像下载到本地(镜像名称组成 repository:tag) docker pull 镜像名称 删除镜像(-f 强制删除) docker rmi -f 镜像id 运行 (-d 表示守护进程,后台运行; -p表示端口映射,后面表示容器端口,前面表示物理机端口

第二篇:python基础_2

本篇内容 数字 字符串 元祖 字典 列表 集合 for循环 二进制 字符编码 文件处理 一.数字 1.int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1,即-9223372036854775808-9223372036854775807 #!/usr/bin/env pyhon #encoding: utf-8 #auth: yang

Android基础_2 Activity线性布局和表格布局

在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是练习android的界面设计.参考的资料为mars老师的教程. 线性布局: 线性布局就是将各种控件按照行或者列依次进行排列. 其中本实验用到的各控件的属性解释如下: android:layout_weight属性是指不同的控件在activity中占有体积大小的比例. android:paddingL

docker_基础_3

接上篇 第8-11章 12.基本架构 ?? 早期的docker是基于已经成熟的LXC(linux container)技术实现的.自0.9版本起,docker已经逐渐从LXC转移到新的libcontainer上,并且积极推动开放容器规范runc:?? 从OS功能上看,目前Docker底层依赖的核心技术主要包括linux操作系统的命名空间(name space), 控制组( cgroup ),联合文件系统( union file system 或 aufs )和linux网络虚拟化支持. ?? d

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

JCBC_基础数据库连接_2

提前准备好的数据库--表 student 准备好数据库的架包驱动,我用的是Tomcat服务器,放到Tomcat目录下的Lib文件包里面 import java.sql.*; /** * 演示_2 * 实现基础的JAVA语言链接数据库 * Created by Administrator on 2018/7/9 0009. * * 用PreparedStatement代替ResultSet 解决了sql拼接不安全的问题 */ public class Demo_2 { public static