docker_基础_2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、利用数据卷容器迁移数据

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

以上是关于docker_基础_2的主要内容,如果未能解决你的问题,请参考以下文章

S-Docker_01_基础理论知识

docker_基础_4_监控

VSCode 配置 用户自定义代码片段 自定义自动代码补充

docker_基础_3

Docker镜像的构成__docker commit

20145311王亦徐《网络对抗技术》MAL_逆向与Bof基础