1. 程式人生 > >從零開始學習docker(九)持久化儲存和資料共享之 bind Mounting

從零開始學習docker(九)持久化儲存和資料共享之 bind Mounting

資料持久化的第一種方式Data Volume

使用Data Volume:

  • 首先在Dockerfile中定義 Volume ["/var/lib/mysql"],這個路徑是容器中的路徑,資料檔案就存在這個路徑下
  • 將這個路徑對映到宿主機的硬碟上,通過-v選項
    • docker run -v mysql:/var/lib/mysql

使用Data Volume持久化的方式,是因為我們容器是一個數據源的產生地方,本身會產生檔案和資料,而我們不想讓我們的檔案和資料隨著容器的消失而消失,因此用這種方式持久化。

資料持久化的第二種方式Bind Mounting

這種方式和第一種方式的區別是:

  • Data Volume 需要在Dockerfile中定義需要建立的Volume,而Bink Mounting不需要,我們只需要在啟動容器的時候指定本地的目錄和容器中的目錄的對應關係就可以了:
    • docker run -v /home/aaa:/root/aaa
    • 這樣本地的目錄檔案和容器中的檔案是同步的,如果本地的檔案做了修改,那麼容器中的檔案也會修改。

​​​​​​​​​​​​​​建立一個Dockerfile,內容如下:

FROM nginx:latest

WORKDIR /usr/share/nginx/html
COPY index.html index.html

這個可以將本地的index.html 拷貝到容器中的/usr/share/nginx/html下面,

index.html的內容如下:

<body>
<h1>hello docker !</h1>
</body>

執行build:

ocker build -t vincent/my-nginx .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> 719cd2e3ed04
Step 2/3 : WORKDIR /usr/share/nginx/html
 ---> Using cache
 ---> ebda8a0ae3aa
Step 3/3 : COPY index.html index.html
 ---> e3e9c5946773
Successfully built e3e9c5946773
Successfully tagged vincent/my-nginx:latest

建立一個容器:

docker run -d -p 80:80 --name web vincent/my-nginx
2cc59b89c8f4c2d60c65ad5b7490fec11c727f38a30c72a0d777209e2ea2b987

驗證一下:

curl 127.0.0.1
<body>
<h1>hello docker !</h1>
</body>

說明可以訪問!

刪除這個容器:

docker rm -f web

重新建立容器,並且新增引數-v,將本地的一個檔案對映到裡面去:

docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web vincent/my-nginx
ec423f40c66477471f38d8bc8a1002a1767e99d810b69b4c991446b9ced5fdea

$(pwd)表示當前路徑。

進入到容器中,建立一個檔案test.txt:

docker exec -it web /bin/bash
root@ec423f40c664:/usr/share/nginx/html# ls
Dockerfile  index.html
root@ec423f40c664:/usr/share/nginx/html# touch test.txt

退出後,在宿主機可以看到這個檔案test.txt。修改檔案內容,可以同步修改宿主機的內容,說明檔案已經同步了。

因為我們的宿主機的目錄$(pwd)和容器中的目錄/usr/share/ngin