docker教程系列五

導航

給docker加上數據持久

數據券介紹

咱們能夠在概念上把docker看作虛擬機,當容器被刪除的時候,容器裏全部數據都會被刪除,兩個不一樣容器之間沒法互通
能夠把數據卷理解爲虛擬機的虛擬磁盤,他是獨立於容器的文件.在容器中他被掛載爲一個目錄的形式.
對於容器中的應用來講,數據卷是透明的,沒法感知它的存在,他就是一個普通的文件夾
因爲數據卷獨立於容器而存在,所以刪除容器的時候數據卷也不會受影響。數據卷有如下優勢:html

  1. 多容器能夠經過掛載同一個數據捲來共享數據
  2. 數據卷能夠方便地備份,存儲數據

數據卷的相關命令操做

# 建立一個volume
    docker volume create testvolume

    # 列出全部數據卷
    docker volume ls

    # 刪除一個數據卷
    docker volume rm testvolume

在容器中使用數據卷

# 先建立數據卷
    docker volume create web

    # 在運行容器的時候,使用參數--mount 以下
    # 下面的參數含義是把數據卷(web)掛載到容器的/volume目錄上面
    # 這裏的webimage 鏡像能夠用我前面文章寫得Dockerfile生成
    # 這樣就運行了一個帶有數據卷的容器,這個容器的/volume目錄中的內容在容器被刪除以後仍然存在.
    # 由於它其實是存在Docker數據卷中。
    docker run -d --name demovolume --mount source=web,target=/volume webimage

如下例子用於演示數據卷保存數據的特性

# 執行命令在容器的 /b.txt 寫入時間內容並查看
    docker exec demovolume sh -c 'date > /b.txt'
    docker exec demovolume sh -c 'cat /b.txt'

    # 刪除容器後從新啓動一個同名容器在查看,以前容器的內容已經沒有了
    docker rm -f demovolume
    docker run -d --name demovolume --mount source=web,target=/volume webimage
    docker exec demovolume sh -c 'cat /b.txt'

    # 保存在數據捲上的文件,即便容器被刪除仍然存在
    docker exec demovolume sh -c 'date > /volume/b.txt'
    docker rm -f demovolume
    docker run -d --name demovolume --mount source=web,target=/volume webimage
    docker exec demovolume sh -c 'cat /volume/b.txt'

共享目錄

除了掛載數據卷之外,docker還能夠掛載共享目錄(這一點和虛擬機同樣),共享目錄的優點是使用方便,易於理解,能夠在某些場景下方便使用
(好比開發是在宿主機中修改源代碼docker中實時生效省卻build鏡像的過程)
下面用一個具體的例子來演示掛載共享目錄的用法:nginx

  1. 在當前目錄下建立index.htmlgit

    <!DOCTYPE html>
    <html>
     <head>
         <meta charset="utf-8">
         <title>volume</title>
     </head>
     <body>
         <h1>這是一個在宿主機的 index.html 文件。</h1>
     </body>
    </html>
  2. 打開終端輸入github

    # 下面的命令會從nginx鏡像運行一個名爲nginx1的容器
     # 而且設置了8080:80的端口映射
     # --mount 參數的 type=bind 代表要掛載的共享目錄
     # 把宿主機的當前目錄映射爲容器的 /usr/share/nginx/html (這是nginx容器的靜態頁面文件存放路徑)
     # 這樣在宿主機中訪問localhost:8080會自動訪問宿主機當前目錄下的index.html文件 (這是nginx的默認靜態文件首頁)
    
     docker run -p 8080:80 --name nginx1 --mount type=bind,source="${PWD}",target=/usr/share/nginx/html/ nginx
    
     # 須要注意的是source參數必須使用絕對路徑
     # 因此這裏使用"${PWD}"的方式來在 Mac/Linux/Windows 中獲取當前目錄路徑
     # 這是一個能夠在多平臺通用的獲取當前目錄路徑的方法 (windows下必須使用PowerShell)
     # 加引號是由於路徑中可能含有空格等特殊符號,若是路徑有空格而未加引號,會產生錯誤
  3. 打開瀏覽器輸入: localhost:8080

其餘掛載模式

除了掛載整個目錄,還能夠單獨掛載一個文件。 若是要掛載單個文件,必定要要保證宿主機文件存在,不然整個路徑會被認爲是一個目錄掛載web

  1. 建立index.html, 隨便寫點東西
  2. 打開終端輸入如下命令docker

    docker run -p 8081:80 \
     --name nginx2 \
     --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/html/test.html \
     nginx
    
     #  這時候咱們訪問http://localhost:8081 返回的是nginx的默認首頁
     #  而訪問http:/localhost:8081/test.html 返回的是掛載的單個文件

    注意:能夠建立多文件掛載windows

    docker run -p 8082:80 \
         --name nginx3 \
         --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/test.html/ \
         --mount type=bind,source="${PWD}"/test.html,target=/usr/share/nginx/test2.html/ \
         nginx
相關文章
相關標籤/搜索