19-数据持久化-Bind Mounting
Bind Mounting 与 Data Volume区别
Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。
Bind Mounting 则不需要在 Dockerfile 声明 volume,只需要在创建容器的时候,也就是 run 的时候声明即可。
如:
docker run -v /home/aaa:/root/aaa demo
上一节中 -v 参数是 mysql:/var/lib/mysql,冒号 “:” 左边是对 /var/lib/mysql 这个目录产生的volume起一个别名。
而在 Bind Mounting 中,-v 参数冒号 “:” 左边是本地的目录路径,右边是创建容器内的路径,做一个映射。
Bind Mounting
通过 Bind Mounting 创建的 volume,在我们修改本地的目录时,容器内对应的目录也会跟着修改,因为是同一个volume。
接下来我们通过一个实验来查看。
-  创建一个docker-nginx文件夹,并进入 mkdir docker-nginx cd docker-nginx
-  创建Dockerfiile和index.html两个文件 touch Dockerfile index.html修改Dockerfile文件如下: FROM nginx:latestWORKDIR /usr/share/nginx/htmlCOPY index.html index.html修改index.html文件如下: <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>
-  创建镜像 docker build -t vincent/my-nginx .
-  创建容器 docker run -d -p 80:80 --name web vincent/my-nginx查看运行状态 [vagrant@10 docker-nginx]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 190b2e296c54 vincent/my-nginx "nginx -g 'daemon of…" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp web可以看到web容器是up的。 
-  访问本机80端口获取web容器的内容 [vagrant@10 docker-nginx]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>curl使用http协议的时候默认是80端口,https默认是443,我们是可以不需要加端口号的。 我们也可以在笔记本中去访问这台虚拟机的80端口服务 vincent@dell-Inspiron-7559$: curl http://192.168.2.32 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>也可以通过浏览器访问查看,ip首先要在虚拟机内通过 ip a获取。
-  重新创建web容器并指定volume 删除web容器 docker rm -f web这条命令会强制删除一个正在运行的容器,不推荐使用。 重新创建容器,并指定挂载 /home/vagrant/docker-nginx/目录。docker run -d -p 80:80 -v /home/vagrant/docker-nginx/:/usr/share/nginx/html --name web vincent/my-nginx
-  查看被挂载的目录在容器内情况 进入web容器 docker exec -it web /bin/bash查看 /usr/share/nginx/html目录下有哪些内容root@cb7e310d02fd:/usr/share/nginx/html# ls /usr/share/nginx/html Dockerfile index.html我们发现在 /home/vagrant/docker-nginx/文件夹内的Dockerfile文件被映射进来了。那我们在 /usr/share/nginx/html文件夹内创建一个 test.txt 文件,看看是否在 外部也能看到touch test.txt创建好之后退出web容器,进入 /home/vagrant/docker-nginx/目录下查看exit [vagrant@10 docker-nginx]$ ls Dockerfile index.html test.txt我们发现同样被映射到了外面 docker-nginx目录下。同样我们可以测试在容器内修改 test.txt 文件看看里外是否同步。进入web容器 docker exec -it web /bin/bash修改test.txt文件 root@cb7e310d02fd:/usr/share/nginx/html# echo "1234" >> test.txt root@cb7e310d02fd:/usr/share/nginx/html# cat test.txt 1234完成后我们退出容器并查看这个文件是否同步了 exit [vagrant@10 docker-nginx]$ cat test.txt 1234结果是同样发生了同步。因为我们修改的其实是同一个文件。 
热更新
-  我们再次执行一次curl获取web内容 [vagrant@10 flask-app]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a demo.</p></body> </html>
-  此时我们手动修改本机目录下的index.html文件 nano docker-nginx/index.html修改如下: <html> <body><h1>Bind Mounting</h1><p>This is a app.</p></body> </html>
-  验证在不重启nginx服务器的情况下是否web内容发生变化 [vagrant@10 docker-nginx]$ curl 127.0.0.1 <html> <body><h1>Bind Mounting</h1><p>This is a app.</p></body> </html>我们可以看到web内容已经发生了变化。 
这对于开发或后续更新来说是很好的。