introduction to docker

35
INTRODUCTION TO Chris Chen

Upload: chris-chen

Post on 11-Apr-2017

79 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Introduction to Docker

INTRODUCTION TO Chris Chen

Page 2: Introduction to Docker

OUTLINE

About Docker Docker command Customized Docker Image

Page 3: Introduction to Docker

VIRTUALIZATION : HYPERVISOR VS. CONTAINER

Page 4: Introduction to Docker
Page 5: Introduction to Docker

ABOUT DOCKER 2013 年初,最初是 dotCloud 公司內部的一個業餘專案,是一個集打包、運送和使用容器技術來執行應用程式。它基於 Google 公司推出的 Go 語言實作。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議, Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案。 Docker 的基礎是

Linux 容器( LXC )等技術。使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單 簡化移交作業流程、免除重建基礎建設工程、讓開發、測試和正式環境可以無縫接軌

Page 6: Introduction to Docker

IMAGE ( 映像檔 / 鏡像 ) 將應用程式 & 執行環境進行包裝產生可佈署的『 Image 』 Docker Image 就是一個唯讀的模板,每個模版都是一個完整執行環境 Docker 提供了一個很簡單的機制來建立 Image或者更新現有的 Image ,使用者甚至可以直接從其他人那裡下載一個已經做好的 Image 來直接使用。

Page 7: Introduction to Docker

CONTAINER( 容器 ) Container 是從 Image 建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。 Container 可視為一個簡易版的 Linux 環境(包括 root 使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程式。 Image 是唯讀的, 但啟動 Container 的時候會建立一層可寫層作為最上層 每一個 Container 都有一個唯一的 CONTAINER ID ,不指定就會亂數產生 當容器被刪除後,再次啟動時又是一個乾淨的環境

Page 8: Introduction to Docker

DOCKER REGISTRIES

• 用來存放 images 的倉庫,執行 docker pull 時, Docker 會從指定的 registry 將 image 下載下來

• 預設的 registries 是 Docker hub ,也可建立私有的 RegistryImage Image

Container Container

Docker Registry

Pull

Run Commit

Push

Page 9: Introduction to Docker

DOCKER CLIENT/SERVER ARCHITECTURE

Page 10: Introduction to Docker
Page 11: Introduction to Docker

DOCKER 優點 不可變的( immutable )

因為作業系統、函式庫( library )版本、設定、資料夾、應用程式都被包裝在 Container 裡頭,所以能確保相同的 Image ,在 QA 的測試下與正式環境中,都會擁有同樣的行為 輕量的

Container 只使用少量的記憶體。不再需要耗費成千上百 MB 的記憶體, Container 只會使用主程序所需的用量,再多加上數十 MB 的記憶體而已 快速的

在幾秒內就啟動一個全新的 Container  。

Page 12: Introduction to Docker

DOCKER 安全性問題 Docker 安全性疑慮 ?

共用作業系統核心 不明來源的容器安全性?

Docker 利用 Linux Kernel 機制,加強安全性 namespace 就可以保護各別 Container 的隱私,防止被人探查。 cgroup 則是控制系統所使用的資源分配,像是儲存、 CPU 、硬碟 I/O ,以及設備權限 若 Container 使用 root 權限來執行時,將可能發生許多危險,可以利用 Capabilities 機制,將 root 權限進行拆分。 一旦 Container 可以任意呼叫 Linux Kernel也會存在許多危險,可利用 Linux Kernel 內建的安全運算模式( Secure Computing Mode ),禁止不需要的系統呼叫權限。

Page 13: Introduction to Docker

DOCKER COMMAND

Command Line 才能完整發揮 Docker的操作

Page 14: Introduction to Docker

取得 IMAGE(PULL)

Page 15: Introduction to Docker

列出本機所有 (IMAGES)

Page 16: Introduction to Docker

新建並啟動容器 (RUN)

Page 17: Introduction to Docker

Docker run 參數 說明

-d 背景執行 Container

-i 以交互模式運行 Container ,通常與 -t 同時使用;-t 為 Container 重新分配一个輸入端,通常與 -i 同时使用;

-name 為 Container 指定一个名稱,不指定名稱會自動亂數命名-p Port Mapping ,主機的目錄映射到容器裡-v 掛載本地目錄至 Container 使用

Page 18: Introduction to Docker

VOLUME FOR STATE DATA 多個容器可以共享單一 volume 。 容器 volume 可以對應到實體機器 FS 路徑位置。 若有持续更新的数据需要在容器之间共享 (--volumes-from)

image 產生時可以定義內部路徑位置的 volume ,並由另一個容器啟動時 mount 上去使用。

Page 19: Introduction to Docker

查看容器行程 (PS)

Page 20: Introduction to Docker

容器啟動 (START) 與終止 (STOP) 終止容器 (Stop)

docker stop [OPTIONS] CONTAINER [CONTAINER...] 支持「優雅退出」。先發送 SIGTERM 信號,在一段時間之後( 10s )再發送 SIGKILL 信號。

Docker 內部的應用程式可以接收 SIGTERM 信號,然後做一些退出前工作,比如保存狀態、處理當前請求等。

啟用容器 (Start) docker start [OPTIONS] CONTAINER [CONTAINER...] docker run 就是 docker create 和 docker start两个命令的组合

Page 21: Introduction to Docker

進入容器 (EXEC)

Page 22: Introduction to Docker

提交 IMAGE (COMMIT)

Page 23: Introduction to Docker

移除 IMAGE 和 TAG (RMI)

Page 24: Introduction to Docker

移除容器 (RM)

Page 25: Introduction to Docker

建立 DOCKER IMAGE 的方法 在現有的 Docker Image Commit 現有的變更,成為一個新的 image

使用 Dockerfile 讓使用者可以建立自定義的映像檔。

Page 26: Introduction to Docker

COMMIT CHANGE FORM DOCKER IMAGE

指令: docker commit {container ID} {repository_name:tag}

docker commit {docker id} chris/debian:1.0docker run -it chris/debain:1.0

docker run -it debain:jessieapt-get update && apt-get install -y git

Terminal A Terminal B

說明:下載 debian 的 image ,並安裝 git說明:將 Terminal A 目前執行的 container commit 成新的 image chris/debian:1.0

Page 27: Introduction to Docker

BUILD A DOCKERFILE

Dockerfile 是一個純文字檔,且預設的檔案名稱就是 Dockerfile ( 無副檔名 ) 由許多的指令 (Instructions)組成,每一個指令都在描述在 Image 中該做什麼 每執行一個指令就會在 Image 中建立一個新的 Layer ,如果下一次,指令沒有改變,

Docker 就會從再次使用現有的 Layer Dockerfile 分為四部分:基底映像檔資訊、維護者資訊、映像檔操作指令和容器啟動時執行指令

Page 28: Introduction to Docker
Page 29: Introduction to Docker

INSTRUCTIONS (1/3) FROM

格式為 FROM <image> 或 FROM <image>:<tag> 。 第一條指令必須為 FROM 指令

MAINTAINER 格式為 MAINTAINER <name> ,指定維護者訊息

RUN 格式為 RUN <command> 或 RUN ["executable", "param1", "param2"] 。 每條 RUN 指令將在當前映像檔基底上執行指定命令,並產生新的映像檔。當命令較長時可以使用 \ 來換行。

Page 30: Introduction to Docker

INSTRUCTIONS (2/3) CMD

指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。 如果使用者啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

ADD 格式為 ADD <src> <dest> 。 該命令將複製指定的 <src> 到容器中的 <dest> 。 其中 <src> 可以是 Dockerfile 所在目錄的相對路徑;也可以是一個 URL;還可以是一個 tar 檔案,複製後會自動解壓縮。

COPY 格式為 COPY <src> <dest> 。 複製本地端的 <src> (為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest> 。 當使用本地目錄為根目錄時,推薦使用 COPY 。

Page 31: Introduction to Docker

INSTRUCTIONS (3/3) VOLUME

格式為 VOLUME ["/data"] 。 建立一個可以從本地端或其他容器掛載的掛載點,一般用來存放資料庫和需要保存的資料等

WORKDIR 格式為 WORKDIR /path/to/workdir 。 為後續的 RUN 、 CMD 、 ENTRYPOINT 指令指定工作目錄。

USER 執行 RUN命令執行時的用戶

ENV 設置環境變數

Page 32: Introduction to Docker

BUILD A DOCKERFILE 編輯完成 Dockerfile 之後,可以透過 docker build 命令建立映像檔。 基本的格式為 docekr build [選項 ] 路徑,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile ,要指定映像檔的標籤資訊,可以透過 -t 選項 Ex. docker build -t bq/XXX:0.2 .

從映像檔產生 Dockerfile dockerfile-from-image 工具,以逆向工程建立出 Dockerfile 。 類似 docker history 指令,透過映像檔每一層的 metadata 來重建出那 Dockerfile

Page 33: Introduction to Docker

DOCKER CONTAINER 應避免的 10件事 不要在 Container 裡儲存資料( data )

Container 是可以被停止、摧毀、或是取代的,真的需要儲存資料,請存在 volume 不要將應用程式分兩部份搬移 不要建立大型的 Image

一個大型的 Image 只會讓它難以被散佈。確認只放置必須的應用所需的檔案和函式庫 不要使用單層式的 Image

應用程式應各獨立建置一層。在 Image 的重建和管理更加簡易,並易於散佈。 不要用執行中的 Container 建立 Image

用 docker commit 建立 的 Image 是難以重現異動

Page 34: Introduction to Docker

DOCKER CONTAINER 應避免的 10件事 不要只使用 latest 標籤

譬如 base image 被一個無法向下相容的新版本給取代 避免使用在正式環境下部署 Container ,因為不能追蹤 Container 是跑哪一個 Image 版本

不要在一個 Container 跑超過一個程序 執行超過一個程序,可能會在管理、讀取紀錄或獨立更新上都感到棘手

不要在 Image 儲存憑証,請使用環境變數 不要將使用者名稱或是密碼 hard-code 在 Image 中。請使用環境變數從 Container 外面取得這些資訊

使用非 root 的使用者去執行程序  Image 應該使用 USER 指令去指定非 root 的使用者讓 container 執行

不要相依 IP 位址 每個 Container 都擁有他們自己內部的 IP 位址,可能會在啟動或停止 Container 時被改變

Page 35: Introduction to Docker

Q&A