使用场景:保证容器内外之间的数据同步,至关于同步盘的功能
与Data Volume的区别在于,Data Volume是由内而外的、是单向的,而Bind Mouting是双向的
编写Dockerfile文件html
FROM nginx:latest WORKDIR /usr/share/nginx/html COPY index.html index.html
index.html的文件内容以下node
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> Hello Siguoya! </body> </html>
而后编译镜像、建立容器nginx
docker build -t siguoya/nginx-bind-mounting . docker run -d --name nginx-bind-mounting -p 80:80 siguoya/nginx-bind-mounting
使用以下命令便可查看到index.html的内容docker
curl http://127.0.0.1/
但目前的nginx-bind-mounting并不能作到咱们在修改代码以后,看到更新后的效果shell
先删除nginx-bind-mountingcurl
docker container stop nginx-bind-mounting && docker container rm nginx-bind-mounting
而后从新初始化一下ui
docker run -d --name nginx-bind-mounting -p 80:80 -v $(pwd):/usr/share/nginx/html siguoya/nginx-bind-mounting
此时进入容器执行以下操做url
[vagrant@docker-node1 bind-mounting]$ docker exec -it nginx-bind-mounting /bin/sh # ls -al /usr/share/nginx/html total 8 drwxrwxr-x. 2 1000 1000 42 Jul 3 12:47 . drwxr-xr-x. 1 root root 18 Jun 26 23:09 .. -rw-rw-r--. 1 1000 1000 75 Jul 3 12:46 Dockerfile -rw-rw-r--. 1 1000 1000 331 Jul 3 12:47 index.html # touch test.txt # exit
而后再退出容器scala
[vagrant@docker-node1 bind-mounting]$ ls -al total 8 drwxrwxr-x. 2 vagrant vagrant 58 Jul 3 13:03 . drwxrwxr-x. 4 vagrant vagrant 46 Jul 3 12:45 .. -rw-rw-r--. 1 vagrant vagrant 75 Jul 3 12:46 Dockerfile -rw-rw-r--. 1 vagrant vagrant 331 Jul 3 12:47 index.html -rw-r--r--. 1 root root 0 Jul 3 13:03 test.txt
能够发现,咱们在容器外的内容会同步到容器内,同时容器内建立的文件 test.txt 也会自动同步到容器外。vagrant
这就是Bind Mouting双向同步的魅力所在了。
虽然-v
可以使得主机与容器之间的文件同步,假设咱们想 -v /usr/project/code/zy108830/docker-voyager/nginx/:/etc/nginx
,若是 /usr/project/code/zy108830/docker-voyager/nginx
目录是一个空目录,没有预先准备好配置文件,那么容器是会启动失败的。这是由于docker的双向同步,在初始化的时候会用主机的数据覆盖掉容器的数据。
若是咱们想解决这个问题,能够先建立一个临时的容器,将配置文件复制出来,而后再建立一个正式的容器
docker run --name tmp-nginx-container -d nginx:1.14.2 docker cp tmp-nginx-container:/etc/nginx /usr/project/code/zy108830/docker-voyager docker rm -f tmp-nginx-container docker run --name nginx -p 4399:80 -v /usr/project/code/zy108830/docker-voyager:/usr/share/nginx/html -v /usr/project/code/zy108830/docker-voyager/nginx:/etc/nginx -d nginx:1.14.2