共计 2126 个字符,预计需要花费 6 分钟才能阅读完成。
应用场景:保障容器内外之间的数据同步,相当于同步盘的性能
与 Data Volume 的区别在于,Data Volume 是由内而外的、是单向的,而 Bind Mouting 是双向的
创立一个 nginx 容器
编写 Dockerfile 文件
FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY index.html index.html
index.html 的文件内容如下
<!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>
而后编译镜像、创立容器
docker build -t siguoya/nginx-bind-mounting .
docker run -d --name nginx-bind-mounting -p 80:80 siguoya/nginx-bind-mounting
应用如下命令即可查看到 index.html 的内容
curl http://127.0.0.1/
但目前的 nginx-bind-mounting 并不能做到咱们在批改代码之后,看到更新后的成果
Bind Mouting
先删除 nginx-bind-mounting
docker container stop nginx-bind-mounting && docker container rm nginx-bind-mounting
而后从新初始化一下
docker run -d --name nginx-bind-mounting -p 80:80 -v $(pwd):/usr/share/nginx/html siguoya/nginx-bind-mounting
此时进入容器执行如下操作
[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
而后再退出容器
[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 也会主动同步到容器外。
这就是 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
正文完