![]()
![]()
将数据从宿主机到容器的三种方式:
1,volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式
2,bind mounts 将宿主机上的任意位置的文件或者目录挂在到容器 (--mount type=bind,src=源目录,dst=目标目录)
3,tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用
tmpfs,同时避免写入容器可写层提高性能。
=====================Volume================================
方式一:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9ba6a9cecc6 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp nginx01
root@bogon: ~ 14:23:51
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hctest/nginx latest 881bd08c0b08 8 days ago 109MB
nginx latest 881bd08c0b08 8 days ago 109MB
centos 7 1e1148e4cc2c 3 months ago 202MB
java 8 d23bdf5b1b1b 2 years ago 643MB
root@bogon: ~ 14:23:56
$ docker volume ls
DRIVER VOLUME NAME
root@bogon: ~ 14:24:00
$ docker volume create nginx-vol
inx-vol
▽oot@bogon: ~ 14:24:14
$ docker volume ls
DRIVER VOLUME NAME
local nginx-vol
root@bogon: ~ 14:24:22
$ docker run -itd --name nginx02 -p 8081:80 -h nginx01 -v nginx-vol:/usr/share/nginx/html nginx
6e5a0cf4451cb71a78e41d7dcfd2a60181208d7b6ca6f4c05d16434dcc674ba7
root@bogon: ~ 14:25:05
$ docker volume inspect nginx-vol
[
{
"CreatedAt": "2019-03-13T14:25:04+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
root@bogon: ~ 14:33:43
$ cd /var/lib/docker/volumes/nginx-vol/_data
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:33:48
$ ls
50x.html index.html
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:33:49
$ vim index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:34:11
$ echo "aa" >index.html
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:35:42
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e5a0cf4451c nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:8081->80/tcp nginx02
c9ba6a9cecc6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp nginx01
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:36:00
$ curl 127.0.0.1:8081
aa
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:36:02
$
方式二:
$ docker run -itd -p 8082:80 --mount src=nginx-vol2,dst=/usr/share/nginx/html --name nginx03 nginx
6254f743f799b52e82516767989e995d08601383188d0e4fbda07cbea3ca858f
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:38:47
$ docker volume inspect nginx-vol2
[
{
"CreatedAt": "2019-03-13T14:38:32+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-vol2/_data",
"Name": "nginx-vol2",
"Options": null,
"Scope": "local"
}
]
root@bogon: /var/lib/docker/volumes/nginx-vol/_data 14:38:53
$
注意:
1,如果没指定卷,自动创建
2,建议使用--mount,比较通用
=====================Bind Mounts================================
root@bogon: /data/www 12:55:34
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@bogon: /data/www 12:55:36
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hctest/nginx latest 881bd08c0b08 8 days ago 109MB
nginx latest 881bd08c0b08 8 days ago 109MB
centos 7 1e1148e4cc2c 3 months ago 202MB
java 8 d23bdf5b1b1b 2 years ago 643MB
root@bogon: /data/www 12:55:39
$ mkdir /data/www -p
root@bogon: /data/www 12:55:49
$ cat /data/www/index.html
sadasdad
root@bogon: /data/www 12:57:17
$ docker run -itd --name nginx01 -p 8080:80 --mount type=bind,src=/data/www,dst=/usr/share/nginx/html nginx
c9ba6a9cecc6bb8b241a15841fe1889f56a9c92e315017eb6c68fb0ef0c5bff4
root@bogon: /data/www 12:57:32
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9ba6a9cecc6 nginx "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp nginx01
root@bogon: /data/www 12:57:41
$ docker exec -it c9ba6a9cecc6 bash
root@c9ba6a9cecc6:/# cat /usr/share/nginx/html/index.html
sadasdad
root@c9ba6a9cecc6:/#
注意:
1,如果源文件目录没有存在(也就是src),不会自动创建,会抛出一个错误
2,如果挂载目标容器中为非空目录,则该目录源文件会被隐藏。
volume
总结:
1,多个运行的容器之间共享数据,因为挂载点如果一样存储是一样的
2,当容器停止或者删除,该卷依然存在,数据不会丢失
3,多个容器可以同时挂载相同的卷
4,当明确删除卷时,卷才会被删除
5,将容器数据存储在远程主机上或者其他存储
6,将数据从一台docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts
总结:
1,从主机共享配置文件到容器,默认情况下,挂载主机/etc/resolv.conf到每个容器,提供dns解析
2,在docker主机上开发环境和容器之间共享源代码,例如,可以将maven tag目录挂在到容器中,每次在docker主机上构建maven项目时,容器都可以访问构建的项目包
3,当docker主机的文件或者目录结构保证与容器所需的绑定挂在一致时
区别:
volume 是docker的宿主机文件系统一部分,只有docker可以进行更改,其他进程不能修改
bind mounts 是挂载在宿主机文件系统的任意位置,除了docker所有进程都可以进行修改、