Anzeige
Anzeige

Más contenido relacionado

Anzeige
Anzeige

Último(20)

Docker基礎

  1. Docker基礎 Docker For Windows
  2. 大綱 • Docker • 容器概念 • 基本Docker容器操作 • Docker容器維運 • 製做Docker容器 • 總結
  3. Docker歷史進程 2013
  4. Docker工具 Docker Engine Docker Compose Docker Swarm Docker Machine Docker Registry Kitematic 管理所有Docker相關操作 多容器定義與協作 跨主機多容器協作 Docker Engine的執行環境 存放容器映象檔的地方 提供Docker UI操作介面
  5. Docker執行 Docker Daemon Containers Images RegistryDocker_Host docker build docker pull docker run Client
  6. Docker工作
  7. Docker架構 LXC Docker NamespacesCGroups Linux Kernel Layer FS • Docker藉由包裝LXC提供友善的容器存取API • Docker的印象檔技術大幅仰賴Layer FS來達成 • 實際上,Linux本身核心就具有容器的相關功能
  8. LXC(Linux Container) • LXC利用作業系統的內核(Kernel)所提供的功能,來達成容器化。 • 容器 Containers Containers Containers Management Interface Namespaces cgroups SELinux Drivers Hardware
  9. 虛擬化 os Hardware os os App App App Hardware 虛擬化 Before After os App Hardware Hardware os App Hardware App Hardware os App Hardware Hardware • 使用虛擬化之前,需要在實體機器上進行 環境建置;很容易造成環境混亂與難以維護 • 實體機器昂貴,但應用程式不一定會使用到 100%所有的資源 • 虛擬化讓實體機器的資源利用率被大幅度 的提高
  10. 虛擬機與容器的差別 App Bins/Libs Bins/Libs Guest OS App VM App Bins/Libs Bins/Libs Guest OS App VM Hypervisor Host OS Server Container Engine App Bins/Libs Host OS Server App Bins/Libs App Bins/Libs LXC LXC LXC 虛擬機 容器 使用:chroot/cgroup/namespaces/ SELinux/AppArmor/netfilter 來達成 隔離效果
  11. 容器的特性 輕量&需要較小的資源 程序&資源完全獨立 快速&易於部署 Container Engine App Bins/Libs Host OS Server App Bins/Libs App Bins/Libs LXC LXC LXC
  12. 容器即沙箱 App App App App App App 未限制 存取 沙箱 App App 未限制 存取 無沙箱 有沙箱 在沙箱中,App是處於絕對隔離的狀態
  13. Layer FS • 印象檔內部結構是採用Layer式, 當它被運行成容器後,上面會多一層 可編輯層 • 編輯層的任何修改都不會影響到原本 印象檔內的檔案層 • 若要套用編輯層的異動,需要額外以Docker 命令套用,並且生成一個新的印象檔
  14. Docker for windows 架構 Docker Engine Hyper-V: VM 實體機器 • 實際上是跑在Hyper-V的VM上 • 目前Stable的版本僅支援Linux-based的 作業系統 • Beta可以支援Windows容器,但是尚不穩 定
  15. Docker容器 那有多少家!? 容器技術是種低維 度技術,Docker是較 早商業化的公司! 容器技術不止只有 Docker一家歐!
  16. 基本容器指令 Running Stop Pause kill, stop start wait logs attach ^p, ^q inspect ps rm exec Container images rmi tag history commit create run info inspect events Engine Images Host cp copy port
  17. 容器指令 學習Docker該怎麼開始 呢? • 學習上可以考慮從印象檔管理著手 • 瞭解印象檔之後,接著再進行容器管理 • 最終再學習自己建立所需要的印象檔
  18. 從Docker Hub取得印象檔 指令: docker pull [印象檔名稱]:[標籤] 功用: 從Docker Hub取得指定版本的印象檔 目的: 很多時候,許多基礎的印象檔已經有社群協助提供,並且放置在Docker Hub上。 除非太過客製化,否則絕大部份都可以在Docker Hub上取得所需要的基礎 印象檔。 備註: 若不指定版本,則Docker會自動預設以latest版本為抓取的對象。 (docker pull hello-world:latest)
  19. 列舉本機印象檔 指令: docker images 功用: 列舉出當前本機擁有的印象檔 目的: 開發過程中,經常需要自行建構or從印象檔倉儲取得印象檔到本機, 為了要能夠確認印象檔是否已存在本機,會使用這個指令
  20. 標記印象檔 指令: docker tag [印象檔名稱]:[標籤] [印象檔]:[新標籤] 功用: 為指定印象檔添加一個標籤 目的: 不常使用到這個指令。 備註: 要注意使用了這個指令之後,僅是一個類似淺複製的行為,因此,原本的印象檔 與新標籤的印象檔,兩者的內容是一致的。 關鍵點在於Image ID
  21. 觀察印象檔歷史紀錄 指令: docker history [印象檔名稱]:[標籤] 功用: 觀察印象檔異動紀錄 目的: 觀察印象檔異動紀錄,初步瞭解印象檔的內容。 備註: 某些印象檔太久沒有被使用,已經忘了異動的內容,這時候可以使用這個 指令來觀察。
  22. 從印象檔到容器 印象檔似乎是一種雛型? • 印象檔是基於Linux核心所提供的Layer FS 所打造的 • 每個印象檔都可以被Docker運行成多個容器
  23. 運行Docker容器 指令: docker run [參數…] [印象檔名稱]:[標籤] [命令] 功用: 啟動指定印象檔為容器 目的: 開發過程中,經常需要自行建構or從印象檔倉儲取得印象檔到本機, 為了要能夠確認印象檔是否已存在本機,會使用這個指令
  24. 列舉容器開發的埠 指令: docker port [容器名稱] 功用: 觀察容器開放的埠 目的: 有的時候需要確認容器是否有正確地開放適當的埠號(協定)給外部
  25. 容器的埠 Docker for Windows是將 Docker運行在Hyper-V的 虛擬機,這樣主機要怎麼 連線到容器呢? • 在啟動Docker時,可以指定開放的埠號 • 容器所開放的埠號,主機可以以localhost:[埠號] 連線 • 容器與容器互連時,亦是需要開放埠
  26. 列舉本機容器 指令: docker ps 功用: 列舉出當前本機的容器 目的: 開發過程中,需要確認容器執行的情況;在本例子中,本機目前有一個容器正在執行中。 每一筆列舉的資料有幾個欄位需要特別關注: Status, Ports;這兩個欄位指示了容器的 執行狀態,以及開放給主機(Host)的埠號。 若啟動容器時,沒有指定容器名稱,則Docker會自行給予一個不重覆的隨機名稱,這個 時候就會需要使用docker ps指令來查看容器被賦予的名稱。 備註: 很多時候建議加上參數a(註: 完整指令為docker ps –a);這是因為docker ps預設僅會顯 示還處於運行狀態的容器,但很多時候因為組態不正確導致容器起動失敗,這種情境 就會需要加上參數a才能看到。
  27. 查看容器組態資訊 指令: docker inspect [容器名稱] 功用: 查看指定容器的組態資訊 目的: 開發過程中,需要確認容器的組態資訊,特別是關於網路的部份。 備註: docker inspect指令本身會列印出容器所有的組態資訊,但很多時候只需要某部份 的資料,因此,可以再加上format參數來過濾資訊。 要注意Format路徑是有大小寫之分,且開頭有個點(dot)
  28. 查看容器執行過程的紀錄 指令: docker logs [容器名稱] 功用: 查看指定容器的執行紀錄 目的: 當需要偵錯容器時,會需要使用這個指令來查看紀錄。
  29. 容器的偵錯 什麼情境下會需要偵錯 容器? • 由於Docker有設定保護機制;當容器的資源 超過預定的數量,Docker會自動停用該容器 • 在遇到非預期的容器行為時,使用inspect/logs 等指令來協助偵錯
  30. 連線到容器 指令: docker exec [參數…] [容器名稱] [命令] 功用: 執行某個正在運行中的容器的命令 目的: 當需要進到容器中進行細部的控制時,會使用這個指令連線到容器中。 參數ti,其實是兩個參數(-t, -i)的結合,其目的在於將容器的輸出資訊顯 示到視窗中。
  31. 複製檔案到容器中 指令: docker cp [本機檔案路徑] [容器名稱]:[容器檔案目標路徑] docker cp [容器名稱]:[容器檔案路徑] [本機檔案目標路徑] 功用:複製本機/容器的檔案到容器/本機的指定位址 目的: 當需要複製檔案到容器內部,很需要此指令。此指令被大量 應用在應用程式部署。
  32. 提交印象檔新版本 指令: docker commit [參數….] [容器ID] [印象檔名稱]:[標籤] 功用: 將容器異動後的內容,提交成為一個新的印象檔 目的: 開發過程中,會需要對基礎印象檔進行一些微調(註:為了效能),為了避免重複的執行 相同的動作。
  33. 印象檔版本管理 為什麼需要對印象檔進行 版本管理? • 印象檔經常會需要隨著需求和團隊異動 • 若異動沒有任何紀錄,或是要每個成員重複性 地操作印象檔內容變更,這是極無效率的 • 在Docker的版本管理概念上,可以借用在Git 上所學習的觀念
  34. 暫停、停止運行中的容器 kill, stop start Stop Pause Running 指令: docker [start/stop/pause/unpause] [容器名稱or ID] 功用: 控制容器的運行狀態 目的: 調整容器的運行狀態可以模擬各種容器運行的情境。 備註: 要留意狀態機遞移的規則。
  35. 移除容器 指令: docker rm [參數…] [容器名稱] 功用: 刪除非運行中的容器 目的: 當不需要容器的時候,可以直接刪除它。 備註: 只有非運行中的容器可以刪除,如果硬是要刪除運行中的容器。需加上參數f (docker rm –f [容器名稱])
  36. 下一步? 基本的印象檔、容器的 操作指令都會了,再來呢 ? • 瞭解基本的印象檔和容器的操作之後, 之後就是維運的部份 • 可以學習如何將容器或是印象檔移轉/備份 到其它主機 • 建立一個私有的印象檔倉儲是CI/CD的起手式
  37. Docker容器維運 Running Stop Pause kill, stop start wait logs attach ^p, ^q inspect ps rm exec Container images rmi tag history commit create run info inspect events EngineImages Host cp copy Tar files filesystem Images(s) Registry search login logout import load save pull push export port
  38. 匯出印象檔 指令: docker save [印象檔…] > [檔案路徑] 功用: 將一到多個印象檔匯出成一個壓縮檔 目的: 備份移轉印象檔到其它機器上。
  39. 匯入印象檔 指令: docker load < [檔案路徑] 功用: 將匯出的容器檔案,匯入到某個主機上成為一或多個新的印象檔 目的: 備份移轉容器內容到其它機器上。 Before After
  40. 印象檔匯入/匯出 實際的使用案例是什麼? • 開發時期,會依需求使用到第三方中介軟體, 這時候會異動到印象檔 • 為了在團隊中同步印象檔的異動,會將印象檔匯出 後放到安全的網路位置,再由其它團隊成員取得 後匯入到自己的本機中使用
  41. 匯出容器內容 指令: docker export [容器名稱] > [檔案路徑] 功用: 將容器中的當前內容匯出成為一個壓縮檔案 目的: 備份移轉容器內容到其它機器上。
  42. 匯入容器內容 指令: docker import [檔案路徑]/[Url] [印象檔名稱]:[標籤] 功用: 將匯出的容器檔案,匯入到某個主機上成為一個新的印象檔 目的: 備份移轉容器內容到其它機器上。
  43. 同步團隊的印象檔/容器 有比較有效率的方法嗎? • 採用匯入/匯出的方式固然方便,但是這不利於 開發的自動化 • 某些高度客製化,或是高敏感度的印象檔,會希望 有一個集中的地方可以管理 • 私有印象檔倉儲就是一個很好的方法
  44. 架設私有倉儲 指令: docker run –d –p 5000:5000 –v [本機路徑]:[容器路徑] registry 功用: 架設一個私人的印象檔倉儲 目的: 團隊共享印象檔,為CI/CD奠定基礎。
  45. 推送印象檔到私有倉儲 指令: (步驟1) docker tag [私有倉儲Url]/[印象檔名稱]:[標籤] (步驟2) docker push [私有倉儲Url]/[印象檔名稱]:[標籤] 功用: 將本機的印象檔推送到私有倉儲間共享 目的: 讓印象檔在團隊。
  46. 從私有倉儲拉取印象檔 指令: docker pull[私有倉儲Url]/[印象檔名稱]:[標籤] 功用: 將本機的印象檔推送到私有倉儲間共享 目的: 讓印象檔在團隊。
  47. 製做Docker容器 Running Stop Pause kill, stop start wait logs attach ^p, ^q inspect ps rm exec Container images rmi tag history commit create run info inspect events EngineImages Host cp copy Tar files filesystem Images(s) Registry search login logout import load save pull push export port Dockerfile build
  48. 客制化印象檔 若要製做一個很複雜的印 象檔,該怎麼做呢? • 使用指令連線進入到某個Linux的基礎容器 進行環境的處理是一種較沒有效率的方式, 且無法被管理 • Dockerfile就是一個很好的解決方案
  49. 使用Dockerfile來創建印象檔 • Dockerfile是一個文本格式的組態文件 • 使用者可以使用Dockerfile快速創建自定義的印象檔
  50. 指令(1)-FROM, MAINTAINER, RUN 指令: FROM 格式: FROM <image> 或 FROM <image>:<tag> 備註: Dockerfile的第一個指令必須為FROM;並且,如果在同一個Dockerfile中創建多的印象檔時, 可以使用多個FROM指令(註:每個印象檔一次)。 指令: MAINTAINER 格式: MAINTAINER <name> 備註: 說明此Dockerfile的維護者相關資訊。 指令: RUN 格式: RUN <command> 或 RUN [‘executeable’,’param1’,’param2’] 備註: 第一種格式的命令較為單純,而第二種格式與第一種執行效果相同。
  51. 指令(2)-CMD, EXPOSE, ENV 指令: CMD 格式: CMD [‘executable’,’param1’,’param2’] CMD command param1 param2 CMD [‘param1’,’param2’] 備註: 第一種是較推薦的方式; 第二種則是在/bin/sh中執行,提供需要互動的應用。 第三種是提供給ENTRYPOINT的預設參數 指令: EXPOSE 格式: EXPOSE <port> [<port> …] 備註: 開放一到多個埠號。 指令: ENV 格式: ENV <key> <value> 備註: 指定容器的環境變數值。
  52. 指令(3)-ADD, COPY, ENTRYPOINT 指令: ADD 格式: ADD <src> <dest> 備註: 複製指定的<src>到容器中的<dest>,其中<src>可以是Dockerfile所在目錄的一個相對 路徑(文件或是目錄);也可以是一個Url;還可以是一個tar檔案(自動解壓縮為目錄) 指令: COPY 格式: COPY <src> <dest> 備註: 複製本地主機的<src>(為Dockerfile所在目錄的相對路徑,檔案或目錄)為容器中的<dest>。 目標路徑不存在時,會自動創建。(相較於ADD,推薦使用COPY) 指令: ENTRYPOINT 格式: ENTRYPOINT [‘executable’,’param1’,’param2’] ENTRYPOINT command param1 param2 備註: 組態容器啟動後所執行的命令,並且無法被docker run所指定的命令所覆蓋。 每個Dockerfile只能有一個ENTRYPOINT,當指定多個時,只有最後一個生效。
  53. 指令(4)-VOLUME, USER 指令: VOLUME 格式: VOLUME [‘/data’] 備註: 創建一個可以從本地主機或其它容器掛載的掛載點,一般用來存放資料庫和需要維持 的資料等。 指令: USER 格式: USER daemon 備註: 指定運行容器的用戶名或UID,後續的RUN也會使用指定帳號。 當服務不需要管理員權限時,可以透過此命令指定執行的帳號。並且可以在之前創建 所需要的用戶,例如: RUN groupdd –r postgres && useradd –r –g postgres。要臨時獲取 管理員權限可以使用gosu,而不推薦sudo。
  54. 指令(5)-WORKDIR, ONBUILD 指令: WORKDIR 格式: WORKDIR /path/to/workdir 備註: 為後續的RUN、CMD、ENTRYPOINT指令組態工作目錄。 可以使用多個WORKDIR指令,後續命令如果參數是相對路徑,則會基於之前命令指定 的路徑。 (例) WORKDIR /a WORKDIR b WORKDIR c 則最終路徑為 /a/b/c。 指令: ONBUILD 格式: ONBUILD [INSTRUCTION] 備註: 組態當所創建的印象檔作為其它新創建印象檔的基礎印象檔時,所執行的操作指令。 例如,Dockerfile使用如下的內容創建的印象檔image-A ONBUILD ADD ./app/src ONBUILD RUN /usr/local/bin/python-build –dir /app/src 當新的Dockerfile使用了FROM image-A指定基礎印象檔時,會自動執行ONBUILD指令的 內容。
  55. 依Dockerfile創建印象檔 …略… 指令: docker build –t [印象檔名稱]:[標籤] [Dockerfile路徑] 功用: 創建印象檔 目的: 將瑣碎的步驟以Dockerfile描述,以便更方便的創建 容器印象檔。 備註: 創建容器時可以使用.dockerignore檔案指明,那些 檔案不要被載入到處理緩充區中 完成
  56. Dockerfile設定變數 • 使用ENV指令宣告一個變數,並且給予預設值 • 宣告完後的其它檔案部份都可以使用$變數名, 或是${變數名} 來使用這個變數 • $本身是特殊符號,在某些情境下需要使用跳脫符號() • 某些時候需要有替代值時,可以參考特殊的取值格式如下表格所示 格式 描述 ${變數名:-替代值} 若變數沒有被設定值,則取用替代值;否則為變數值 ${變數名:+替代值} 若變數有被設定值,則取用替代值;否則為空字串 變數取值的格式
  57. 總結 • Docker的內部結構是Layer FS • Docker就是由: Image + Container + Registry所組成 • Docker的印象檔版本概念與Git相同 • Docker的容器之間是絕對隔離 • Docker Engine負責管理所有容器的運行,並在容器異常時,直接停止 該容器 • Dockerfile是建造印象檔的好幫手
  58. 下回預告:Docker與CI/CD 友善鏈結
Anzeige