1. 程式人生 > 實用技巧 >每天5分鐘玩轉容器技術-讀書筆記-第六章

每天5分鐘玩轉容器技術-讀書筆記-第六章

前言

因為開發過程中各種環境的部署是一件讓人非常頭疼的事情,所以容器技術一直是筆者比較感興趣的技術領域,工作之餘找到了一本國人寫的容器好書 每天5分鐘玩轉Docker容器技術,書名看起來比較不靠譜,實際在豆瓣評分中高居前列,評論也紛紛表揚該書是本入門的好書。這系列文章是該書的讀書筆記。筆者主要以 問題和解答 作為讀書筆記的寫作形式,這樣可以方便大家準備面試。

系列文章:

每天5分鐘玩轉容器技術-讀書筆記-第一章到第三章
每天5分鐘玩轉容器技術-讀書筆記-第四章到第五章

容器

  1. 簡單說說docker提供的幾種儲存資料的方式?

    docker提供兩種儲存資料的方式。

    • storage driver:docker啟動時預設會選擇宿主機的storage driver,driver中適合儲存無狀態容器的臨時資料,隨著容器的銷燬而銷燬
    • data volume: data volume適合儲存有狀態容器的資料,比如資料庫系統的資料庫檔案。
  2. 對於data volume,docker提供了兩種型別的volume,簡單說說

    • bind mount:將host上已經存在的目錄或者檔案mount到容器的檔案系統中。

      ging@ubuntu:~$ sudo docker run -d -p 81:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd //ro表示容器中不能修改檔案,只能讀。
      
      • 應用場景:
        • 把host中的原始碼直接mount到容器中,host修改原始碼後,容器可以實時顯示最新效果。
        • 把mysql中的資料放在bind mount中,可以方便host備份遷移資料。
      • 缺點:因為需要指定host的具體目錄,可移植性較差。
    • docker managed volume:使用時不需要指定mount的源(由docker指定一個本地的路徑),只需要指定mount point即可。

      ging@ubuntu:~$ sudo docker run -d -p 82:80 -v /usr/local/apache2/htdocs httpd 
      
      • 優點:因為由docker選擇的源目錄,不需要自己指定,所以可移植性強
      • 缺點:
        • 不支援單個檔案的mount,只能支援資料夾
        • 預設讀寫許可權都有,不可以控制單獨的讀寫許可權

  3. 容器和host如何共享資料?

    可以通過兩種方式實現共享。

    • bind mount:指定一個本地目錄,然後容器啟動的時候mount過去即可

    • docker managed volume:這個需要注意下,因為host的目錄是在容器啟動後才生成的,所以需要再手動複製需要共享的內容到mount源目錄即可。

      ging@ubuntu:~/htdocs$ sudo docker cp index.html 24b3:/usr/local/apache2/htdocs
      
  4. 容器和容器之間如何共享資料?

    • bind mount:可以通過多個容器指定同一個mount源路徑,實現容器之間共享資料

    • volume container:一個專門用於mount的容器(不需要執行),其他容器mount到這個volume容器即可實現共享

      建立volume container
      ging@ubuntu:~/htdocs$ sudo docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox
      檢視volume container mount配置
      ging@ubuntu:~/htdocs$ sudo docker inspect vc_data
      
      把其他容器mount到這個容器中
      ging@ubuntu:~/htdocs$ sudo docker run -d -p 80 --volumes-from vc_data httpd 
      
    • data-packed volume container:需要利用Dockerfile構建一個新的映象,構建映象的時候就把host的檔案存入映象檔案中(初始化一個統一的內容),並且指定了一個docker managed volme的目標路徑,這樣volume容器就和本地的一個路徑自動關聯起來了,其他容器需要--volumes-from 關聯這個容器,即可實現資料共享。

      • Dockerfile:
      FROM busybox:latest
      ADD htdocs /usr/local/apache2/htdocs
      VOLUME /usr/local/apache2/htdocs
      
      • 構建指令:
      ging@ubuntu:~/datapack$ sudo docker build -t datapack .
      
      • 優點:建立volume容器的時候不需要像第二種方式需要再手動指定 -v /other/useful/tools了,可移植性最強(因為映象中已經包含了需要共享的檔案)。
  5. 如何進行data volume的備份 恢復 遷移和刪除?

    • 備份:因為data volume對應的就是我們host中的檔案,所以定期備份檔案系統中的檔案即可
    • 恢復:如果資料損壞了,可以利用之前備份的問題複製到對應的容器mount資料夾即可
    • 遷移:如果想使用更新版本的映象,可以利用-v直接把本地的資料夾mount到新容器中即可
    • 刪除:
      • bind mount的本地路徑,docker不會進行維護,需要手動刪除
      • docker managed volume,可以通過指定 sudo docker rm -v 刪除容器的時候一起刪除volume