容器的持久化和同步化,容器间也是可以数据共享的

bind mount

-v 宿主机目录:容器内目录。1.必须是绝对路径。2.如果不存在,Docker 会自动在主机上创建该目录
—volume
eg

  1. docker run -v /home/ceshi:/home *****
  1. # 查看容器信息,可以看到数据卷映射信息
  2. docker inspect 容器名

image.png
Docker 提供了三种适用于不同场景的文件系统挂载方式:Bind MountVolumeTmpfs Mount

  • Bind Mount 能够直接将宿主操作系统中的目录和文件挂载到容器内的文件系统中,通过指定容器外的路径和容器内的路径,就可以形成挂载映射关系,在容器内外对文件的读写,都是相互可见的。
  • Volume 也是从宿主操作系统中挂载目录到容器内,只不过这个挂载的目录由 Docker 进行管理,我们只需要指定容器内的目录,不需要关心具体挂载到了宿主操作系统中的哪里。
  • Tmpfs Mount 支持挂载系统内存中的一部分到容器的文件系统里,不过由于内存和容器的特征,它的存储并不是持久的,其中的内容会随着容器的停止而消失。

    案例-mysql

    1. $ docker run -p 3306:3306 --name mysql \
    2. -v /usr/local/docker/mysql/conf:/etc/mysql \
    3. -v /usr/local/docker/mysql/logs:/var/log/mysql \
    4. -v /usr/local/docker/mysql/data:/var/lib/mysql \
    5. -e MYSQL_ROOT_PASSWORD=123456 \
    6. -d mysql:5.7
    7. 03209b03258f9e9d0cb88b7847f4b2b0b0db79517ff66df1d629106fcfc7c64d

    案例-nginx

    eg1:
    1. docker run -e TZ="Asia/Shanghai" -it -d -h nginx -p51001-51010:51001-51010 -v /root/***/nginx/config/nginx:/etc/nginx --restart=always --name nginx pub/nginx:v1
    config/nginx下文件内容:
    1. conf.d
    2. logs
    3. nginx.conf
    4. fastcgi_params
    5. koi-utf
    6. koi-win
    7. scgi_params
    8. uwsgi_params
    9. win-utf
    10. mime.types
    -p可以是映射一个端口范围,51001-51010端口范围由此被占用。
    eg2:
    来自:https://www.yuque.com/baxiang/wkgv7h/docker-data#Ugb95
    1. $ docker run --name nginx -p 80:80 -v ~/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v ~/docker-nginx/log:/var/log/nginx -v ~/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx
    -v 挂载文件用的,第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,第二个表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面
    第三个-v 表示的和第一个-v意思一样的。
    -p 统一80端口为出口端口

    具名挂载和匿名挂载

    匿名路径
    -v /etc/app
    具名挂载
    -v nginxconfig:/etc/app #其中nginxconfig不是一个绝对路径,只是一个路径名称。 ```bash (base) dh@DHMacBook ~ % docker volume —help WARNING: Error loading config file: /Users/dh/.docker/config.json: EOF

Usage: docker volume COMMAND

Manage volumes

Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes

  1. 如何确定具名挂载还是匿名
  2. ```bash
  3. -v 容器内路径 匿名挂载
  4. -v 卷名:容器内路径 具名挂载
  5. -v /宿主机路径:容器内路径: 指定路径挂载

-v nginxconfig:/etc/app:ro
-v nginxconfig:/etc/app:rw

:ro/rw 用以改变读写权限,ro只读,rw 可读可写,默认是rw

操作指令

  1. $ docker volume --help
  2. Commands:
  3. create Create a volume
  4. inspect Display detailed information on one or more volumes
  5. ls List volumes
  6. prune Remove all unused local volumes
  7. rm Remove one or more volumes

创建

  1. $ docker volume create volume-test
  2. volume-test

查看

查看所有数据卷

  1. docker volume ls 如下展示全部是匿名数据卷

image.png查查看单个详细信息

  1. docker volume inspect nginxconfig 可以查看具名目录具体的位置

volum在宿主机的目录地址在/var/lib/docker/volumes//_data/
image.png

删除

数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用下面的命令。

  1. docker rm -v 容器

删除无容器的数据卷:慎重

  1. docker volume prune

数据的覆盖问题

  • 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
  • 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。

    数据卷容器

    —volumn-from

    多个docker 容器共享数据
    image.png
  1. docker run -it --name docker02 --volumes-from docker01 name1/centos:1.0

进入到docker之后,在docker02中可以看到docker01的数据卷,
1.可逆,在docker02的同步数据卷下,创建文件,在docker01中也可以看到
2.把docker01 删掉,文件还在吗?查看docker 02 还可以访问数据,备份机制
本质:docker之间数据共享其实是硬连接,通过inspect可以查看他们指向同一个宿主机文件(var/docker/volumes/*
3.问题三:互相共享数据的3个容器全删了,这个数据(特指匿名数据卷)还会存在吗?不存在了。
4.docker02挂载dockerr01 ,docker03挂载docker02 ,docker02 删了,数据卷依旧同步
5.数据卷容器的生命周期一直持续到没有容器使用为止。如果是通过-v 映射到本地,那么三个容器全删除,本地的数据卷也还是存在的。

场景:
共享配置文件,