5.3 數據持久化之Bind Mouting

使用場景:保證容器內外之間的數據同步,至關於同步盤的功能
與Data Volume的區別在於,Data Volume是由內而外的、是單向的,而Bind Mouting是雙向的

建立一個nginx容器

編寫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

Bind Mouting

先刪除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
相關文章
相關標籤/搜索