1. docker-将数据从宿主机挂载到容器中的三种方式
  1) docker提供三种方式将数据从宿主机挂载到容器中:

  • volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式
  • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统,如果不希望将数据持久存储在任何位置,可以用tmpfs,同时避免写入容器可写层提高性能。

  

dockerfile临时切换为root docker --tmpfs_nginx

2. docker的volumes管理宿主机管理本地文件
  1) docker volumes创建管理卷

[root@test-1 ~]# docker volume create nginx_vol
nginx_vol
[root@test-1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx_vol
[root@test-1 ~]# docker volume inspect nginx_vol       #查看nginx-vol详细信息
[
    {
        "CreatedAt": "2018-11-22T01:10:06-05:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx_vol/_data",               #目录挂载点
        "Name": "nginx_vol",
        "Options": {},
        "Scope": "local"
    }
]

  2) docker用卷创建一个容器
    (1) 使用mount的方式启动

[root@test-1 html]# docker run -d --name web02 --mount src=nginx_vol,dst=/usr/share/nginx/html nginx
79afc418f70031478f098f8390ba1475563b1d9c52fa084e383f0113ce683d4d
[root@test-1 html]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
1e380bf77ea4        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp              web02
[root@test-1 html]# ll /var/lib/docker/volumes/nginx_vol/_data/
total 8
-rw-r--r-- 1 root root 494 Nov  6 08:32 50x.html
-rw-r--r-- 1 root root 612 Nov  6 08:32 index.html

 (2) 使用-v的方式启动

[root@test-1 html]# docker run -d --name=web03 -v nginx_vol:/usr/share/nginx/html nginx
3a086829032e967657867298640d83a1212a4642f07245f0fab882315afd4e64
[root@test-1 html]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
3a086829032e        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes               80/tcp              web03
2f6d6db0c6a4        nginx               "nginx -g 'daemon of…"   11 minutes ago      Exited (0) 9 minutes ago                       web02

 (3) 清理

[root@test-1 html]# docker stop web02
web02
[root@test-1 html]# docker rm web02
web02
[root@test-1 html]# docker stop web03
web03
[root@test-1 html]# docker rm web03
web03
[root@test-1 html]# docker volume rm nginx_vol 
nginx_vol

 (4) 注意

  1) 如果没有指定卷,就自动创建

  2) 建议使用--mount,更通用。

3. docker的bind Mounts管理宿主机管理本地文件
  1)docker Bind Mounts管理宿主机管理文件

[root@test-1 html]# docker run -d  -p80:80 --name=web01 --mount type=bind,src=/var/www/html,dst=/usr/share/nginx/html nginx
[root@test-1 html]# docker run -d  -p81:80 --name=web02 -v /var/www/html:/usr/share/nginx/html nginx

提示:
--mount 和 -v 效果一样的

  2)验证

[root@test-1 html]# docker inspect web01

  3)清理

[root@test-1 html]# docker stop web01
web01
[root@test-1 html]# docker stop web02
web02
[root@test-1 html]# docker rm web01
web01
[root@test-1 html]# docker rm web02
web02

  4) 注意
    (1) 如果源文件/目录没有存在,不会自动创建,会抛出一个错误
    (2)如果挂载目标在容器中非空目录。则该目录现有内容将被隐藏。

  5) 运行结果

  

dockerfile临时切换为root docker --tmpfs_html_02

4. 总结
  1) volume特点
  • 多个运行容器之间共享数据
  • 当容器停止或被移除时,该卷依然存在
  • 多个容器可以同时挂载相同的卷
  • 当明确删除卷时,卷才会被删除
  • 将容器的数据存储在远程主机或其他存储上
  • 将数据从一台docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
  2) bind Mounts特点
  • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析
  • 在docker主机上的开发环境和容器之间共享源代码。列如,可以将Maven target目录挂载到容器中,每次在docker主机上构建Maven项目时,容器都可以访问构建的项目包。
当docker主机的文件或目录结构保证与容器所需的绑定挂载一直时。