Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker 學校內部教學之二

Avatar for Kyle Bai Kyle Bai
December 11, 2015

Docker 學校內部教學之二

Avatar for Kyle Bai

Kyle Bai

December 11, 2015
Tweet

More Decks by Kyle Bai

Other Decks in Technology

Transcript

  1. 什什麼是 Docker? !3 Docker 是⼀一個開源專案,誕⽣生於 2013 年年初,最初是 dotCloud 公司內部的⼀一個業餘專案。它基於 Google

    公司推出的 Go 語⾔言實作。 專案後來來加入了了 Linux 基⾦金金會,遵從了了 Apache 2.0 協議,原始碼在 GitHub 上進⾏行行維護。
  2. Docker 是新技術? !4 Docker 專案的⽬目標是實作輕量量級的作業系統虛擬化解決⽅方案。 Docker 的基礎是 Linux 容器(LXC)等技術。好比 namespaces、cgroups、Another

    UnionFS(AUFS)等。並在 LXC 的基礎上 Docker 進⾏行行了了進⼀一步的封裝,讓使⽤用 者不需要去關⼼心容器的管理理,使得操作更更為簡便便。
  3. Docker Images !6 Docker 映像檔就是⼀一個唯讀的 模板。 Docker 映像檔會儲存⼀一個系統 當下的狀狀態; 與

    VM 比較不同 是,VM可以有許多執⾏行行中的服 務,Docker 則只是檔案系統儲 存狀狀態。
  4. Docker Repository !8 倉庫是集中存放映像檔檔 案的場所。 倉庫分為: • 公開倉庫(Public) • 私有倉庫(Private)

    *註:Docker 倉庫的概念念跟 Git 類似,註冊伺服器可以理理解為 GitHub 這樣的託管服務。
  5. Dockerfile !9 Dockerfile 是特定領域語⾔言(Domain Specific Language,DSL)寫成,定 義如何設定 Docker 映像檔的流 程,類似

    Makefile 或 Mavent。 *Domain Specific Language,http://huan-lin.blogspot.com/2008/05/domain-specific-languages.html
  6. 典型的 Linux 檔案系統 !11 •bootfs(boot file system):主要包含 boot loader 和

    kernel,boot loader主要是引導載入 kernel,當 kernel 被加 載到記憶體中後 bootfs 就被 umount 了了。 •rootfs (root file system) :包含的就是典型 Linux 系統中 的/dev、/proc、/bin、/etc等標準⽬目錄和檔案。
  7. Docker 使⽤用的檔案系統 !12 Docker 容器是建立在 Aufs 基礎上的,Aufs 是⼀一種Union FS, 簡單來來說就是⽀支援將不

    同的⽬目錄掛載到同⼀一個虛擬 檔案系統下技術,並實現⼀一 種多層(Layer)的概念念。 *Union FS Wiki:https://en.wikipedia.org/wiki/UnionFS
  8. Aufs 基本流程 !14 1.Aufs 將掛載到同⼀一虛擬檔案系統下的多個⽬目錄分別設置成 read-only、read-write以及 whiteout-able 權限,對 read-only ⽬目錄只能讀取,⽽而寫入操作只能屬於在

    read-write ⽬目錄中。 2.當掛載⽬目錄時會按照各⽬目錄之間這種增量量關係來來進⾏行行掛載, 待所有⽬目錄掛載結束了了,繼續掛載⼀一個 read-write ⽬目錄,如此 便便形成了了⼀一種層次結構。
  9. Linux boot 流程 !15 傳統的 Linux 加載 bootfs 時會 先將

    rootfs 設為 read-only,然 後在系統⾃自檢之後將 rootfs 從 read-only 改為 read-write,然後我們就可以 在 rootfs 上進⾏行行寫入和讀取的 操作了了
  10. Docker映像檔的典型結構 !16 但 Docker 會在 bootfs ⾃自檢完畢 之後並不會把 rootfs 的

    read-only 改為 read-write。 再利利⽤用 union mount 將⼀一個或多 個 read-only 的 rootfs 加載到之前 的 read-only 的 rootfs 層之上。
  11. Docker映像檔的典型結構 !17 加載多層的 rootfs 之後,仍然讓它看起來來只像是⼀一個檔案系統, 然⽽而這些 union mount 為 read-only

    的 rootfs 就叫做映像檔。 此時每⼀一層 rootfs 都是 read-only,無法進⾏行行任何操作。 當我們將映像檔實體化時,系統會在⼀一層或是多層 read-only的 rootfs 之上分配⼀一層空的 read-write rootfs。
  12. 使⽤用 images 查看層次 !18 [root@kairen]# docker images -tree Warning: '-tree'

    is deprecated, it will be removed soon. See usage. └─511136ea3c5a Virtual Size: 0 B └─3b363fd9d7da Virtual Size: 192.5 MB └─607c5d1cca71 Virtual Size: 192.7 MB └─f62feddc05dc Virtual Size: 192.7 MB └─8eaa4ff06b53 Virtual Size: 192.7 MB Tags: ubuntu:14.04,
  13. 登入 Docker Hub 使⽤用以下指令登入⾃自⼰己的 docker hub 帳號: $ docker login

    Username : test 使⽤用以下指令登出⾃自⼰己的 docker hub 帳號: $ docker logout !23
  14. Dockerfile 結構 ⾸首先我們來來理理解⼀一下 Dockerfile 簡單結構: FROM ubuntu:14.04 # im proxy

    man MAINTAINER "Kyle.Bai <[email protected]>" RUN apt-get update && apt-get install -y openssh-server git 第⼀一⾏行行:表⽰示要從哪個映像檔進⾏行行增量量。 第⼆二⾏行行:就是註解 第三⾏行行:表⽰示維護⼈人員是誰 第四⾏行行:表⽰示預執⾏行行的指令。 !24
  15. 使⽤用 build 建置 當完成⼀一個 Dockerfile 檔案時,我們會使⽤用 docker build 指令來來建置 映像檔。如以下:

    $ docker build [options] PATH | URL | - $ docker build -t="kairen/ubuntu:14.04" . P.S “."為 Dockerfile 的⽬目錄。 !25
  16. RUN RUN 語法是在⽬目前映像檔產⽣生⼀一層新的檔案層,並執⾏行行指定⼯工作,記 住這⼀一定要是可以⾃自動完成的動作。RUN 有兩兩種格式: •RUN <command>。以 shell 執⾏行行,/bin/sh -c

    <command> RUN apt-get update •RUN ["executable", "arg1", "arg2", …],若若沒有sh⽤用這種 RUN ["apt-get", "install", "-y", "openssh-server"] !27 *註:當前 Docker 最多只可以到 127 層唷! 能寫到這麼多層也是很猛的。
  17. RUN 若若失敗的話 Docker 建立映像檔時,是使⽤用快取⽅方式,所以失敗了了下次建立會從 上⼀一次成功地⽅方開始(若若哪邊修改也會回到該層)。Docker 快取有 以下情形失效: •執⾏行行 docker build

    時使⽤用 --no-cache •當執⾏行行到無法快取指令,如 apt-get update。 •使⽤用 ADD 加入時,如果他加入的內容有被改變。 !28 *註:當前 Docker 最多只可以到 127 層唷! 能寫到這麼多層也是很猛的。
  18. CMD CMD 語法是提供啟動時,預設執⾏行行指令,有三種格式: • CMD ["executable", "arg1", "arg2", …],類似exec,比較建議⽅方式,第 ⼀一個為絕對路路徑,後續為參參數。

    CMD ["/usr/bin/echo", “Hello-world"] • CMD ["arg1", "arg2", …],單純參參數的格式,配合 ENTRYPOINT。 •CMD <command> arg1 arg2,以 /bin/sh -c 執⾏行行 CMD echo "Hello-world" !29 *註:當前 Docker 最多只可以到 127 層唷! 能寫到這麼多層也是很猛的。
  19. CMD CMD 語法簡單範例例: FROM ubuntu:14.04 MAINTAINER "Kyle.Bai <[email protected]>" RUN apt-get

    update && apt-get install -y telnet CMD ["/usr/bin/telnet", “towel.blinkenlights.nl"] $ docker build -t test . $ docker run -ti test !30 *註:當前 Docker 最多只可以到 127 層唷! 能寫到這麼多層也是很猛的。
  20. ENTRYPOINT ENTRYPOINT 語法可以讓映像檔變成可執⾏行行,簡單說,利利⽤用該指定可 執⾏行行檔後,容器就會像⼀一般的執⾏行行檔般執⾏行行,該指令有兩兩種格式: •ENTRYPOINT ["executable", "arg1", "arg2", …]。以 shell

    執⾏行行,/bin/ sh -c <command> ENTRYPOINT ["/etc/boot_run.sh"] •ENTRYPOINT <command> arg1 arg2 ENTRYPOINT /etc/boot_run.sh !31 *註:當前 Docker 最多只可以到 127 層唷! 能寫到這麼多層也是很猛的。
  21. EXPOSE & ENV & USER EXPOSE 語法是讓 Docker 知道哪些 port

    可以被揭露,讓外⾯面存取: EXPOSE tcp/8080 udp/1234 ENV 語法是設定環境變數,可以讓 Docker 使⽤用: ENV USER_NAME "kairen" USER 語法是設定映像檔的 User: USER ubuntu !32
  22. ADD & COPY ADD 是將檔案複製到映像檔中: ADD <src> <dest> ADD html/

    /var/www/ P.S <src> 是建置所在地的檔案或⽬目錄,或使URL。<dest>為容器內絕對路路 徑。 COPY 語法類似 ADD,不同是COPY無法複製不再環境內⽂文的檔案,因此使⽤用標 準輸入讀取Dockerfile或使⽤用URL就無法使⽤用: COPY <src> <dest> !33
  23. 上傳⾄至 Docker hub 當完成 docker image 建置後,就可以上傳⾄至 docker hub: $

    docker push kairen/apache2:1.0.0 The push refers to a repository [docker.io/kairen/apache2] (len: 1) 3d2d0c1af482: Pushing [=============================================> ] 74.99 MB/83.1 MB 完成後,可以使⽤用以下指令查找⾃自⼰己的 image: $ docker search kairen // 查所有作者為 kairen $ docker search kairen/apache2 // 查作者為 kairen, 名稱為 apache2 !35