Slide 1

Slide 1 text

張旭 @ zx1986

Slide 2

Slide 2 text

Docker 是什麽? 從結果來看, 您可以使用 Docker 將 Application 封裝到一個相當類似於虛擬主機 (VM) 的隔離環 境 (術語叫 Container) 中執行。

Slide 3

Slide 3 text

Docker 是什麽? 想像一下,只要執行一行指令,您開發的網站就可 以掛載到一個已經配置好的「主機」中,立即提供服 務,啟動過程可以迅速到就像執行一次 ls 指令那 樣。

Slide 4

Slide 4 text

Docker 是什麽? 想像一下,您配置好的環境可以憑藉一個設定檔 (Dockerfile),在任何支援 Docker Container 的平 台運行起來,就像是將一台一模一樣的「主機」搬過 去插電 (或是虛擬主機複製) 運作起來一樣。

Slide 5

Slide 5 text

Docker 是什麽? 想像一下,寫一個設定檔 (docker-compose.yml), 使用一行指令,您就可以喚起多台「主機」,每臺負 責不同的服務,例如 HAProxy、Apache、MySQL、 Memcached,瞬間就可以全部啟動,且彼此間網路 是互通的,服務是可以對外開放的。

Slide 6

Slide 6 text

Docker 的特色 - 1 ● 作業系統層級的虛擬化產品 ● 實作涉及 Linux Kernel 功能 ● 100% 原生硬體的效能 ● 虛擬主機等級的隔離及資源分配 ● 應用程式等級的輕量及方便

Slide 7

Slide 7 text

Docker 的特色 - 2 ● 在呼叫 Linux 的核心提供的虛擬化模組時,0.9 版前還需依賴 LXC、libvirt 及 systemd-nspawn 的功能,0.9 版之後,就預設 使用自己開發的 libcontainter 來呼叫。 ● 由唯讀的多層次映像檔 (Image) 做為模板 (產生 Container) ● 產生 Container 後,保持最上層可寫入 (用來提供服務)

Slide 8

Slide 8 text

底層原理

Slide 9

Slide 9 text

Container 技術發展史 ● 1979 - chroot ● 2008 - LXC ● 2013 - LMCTFY (Let Me Contain That For You - Google) ● 2013 - Docker ● 2014 - Rocket ● 2016 - Windows Containers

Slide 10

Slide 10 text

LXC (LinuX Containers) ● Kernel Namespaces - PID, User, Mount, Network 隔離 ● Cgroups - CPU, Memory, Disk I/O 隔離 ● Chroot - File System 隔離 Docker 0.9 以後已經改用自行開發的 libcontainter 來實作。

Slide 11

Slide 11 text

Docker is more than LXC ● AUFS - Another Union File System,相當於把 Host (Server) 的目錄當成 Guest (Container) 的 Disk。 ● Base Image - 透過 base image,可以在 Docker上執行各種 的 Distribution Linux 而不受限於 Host 的 OS 種類,Image 裡面其實就是一堆必要檔案的集合。

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

技術名詞

Slide 15

Slide 15 text

Docker 術語 ● Image ● Container ● Registry

Slide 16

Slide 16 text

Docker 術語 - Image A Docker image is a read-only template. ● 唯讀的映像檔 ● 相當於 VM 的樣板機 ● 不可變更的 (immutable)

Slide 17

Slide 17 text

Docker 術語 - Container A Docker container holds everything that is needed for an application to run. Each container is created from a Docker image. ● 以 Image 為基板,放到記憶體中執行的 ● Docker 執行起來的最小單位 ● Container 裡面必須有一個前景 (foreground) 執行的程式

Slide 18

Slide 18 text

Docker 術語 - Registry Docker registries hold images. ● 存放 Image 的倉庫 ● 類似 Github 之於 Git Repository 的角色

Slide 19

Slide 19 text

運作架構

Slide 20

Slide 20 text

簡單的 Docker Client / Server 架構

Slide 21

Slide 21 text

詳細一點的 Docker Client / Server 架構

Slide 22

Slide 22 text

原生與寄生的 Docker Server 差異

Slide 23

Slide 23 text

Docker Client 只要設定好正確的環境變數, 即可對遠端 Docker Server 進行操作: DOCKER_TLS_VERIFY="1" DOCKER_HOST="tcp://192.168.99.100:2376" DOCKER_CERT_PATH="/machines/certs/" DOCKER_MACHINE_NAME="dev" Docker Client From Anywhere 妥善授權給 Docker Client

Slide 24

Slide 24 text

使用方法

Slide 25

Slide 25 text

安裝 Docker Client / Server

Slide 26

Slide 26 text

Docker 安裝 - Mac $ brew install docker-machine $ brew install docker https://docs.docker.com/docker-for-mac 原生的,會把 docker-compose 也裝起來,COOL

Slide 27

Slide 27 text

Docker 安裝 - Ubuntu 14.04 $ sudo apt-get install apt-transport-https ca-certificates $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D $ sudo vim /etc/apt/sources.list.d/docker.list deb https://apt.dockerproject.org/repo ubuntu-trusty main $ sudo apt-get update $ sudo apt-get purge lxc-docker $ sudo apt-get install docker-engine

Slide 28

Slide 28 text

Docker 安裝 - CentOS $ sudo vim /etc/yum.repos.d/docker.repo $ sudo yum install docker-engine [docker-repo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg

Slide 29

Slide 29 text

Dockerfile

Slide 30

Slide 30 text

Dockerfile - 1 ● 想象 Dockerfile 是一道食譜,大家根據食譜就可以烹調 (docker build) 出同樣一道菜 (Docker Image) 來。 ● 可以勉強將 Dockerfile 先想像成 Ruby 的 Gemfile、 NodeJS 的 package.json 來理解, 但 Dockerfile 絕不僅僅 是宣告相依套件而已。 ● Dockerfile 手冊 :https://docs.docker.com/engine/reference/builder/

Slide 31

Slide 31 text

Dockerfile - 2 FROM centos:6 MAINTAINER zx1986 EXPOSE 80 3306 USER root ENV LANG en_US.UTF-8 ENV TZ=Asia/Taipei RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN rpm -iUvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm RUN yum -y update && yum -y groupinstall "Development Tools" RUN yum -y update && yum -y install python-pip && pip install meld3==1.0.0 supervisor CMD ["/usr/bin/supervisord"] ● 一個簡單的 Dockerfile 範例

Slide 32

Slide 32 text

docker [client]

Slide 33

Slide 33 text

Docker 常用指令 ● docker images ● docker pull ubuntu ● docker run -it ubuntu bash ● docker ps -a ● docker stop ● docker rm

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

docker-compose

Slide 36

Slide 36 text

docker-compose 安裝 $ curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-co mpose-`uname -s`-`uname -m` > docker-compose $ chmod a+x docker-compose $ mv docker-compose /usr/local/bin/ $ docker-compose --version

Slide 37

Slide 37 text

docker-compose.yml ● yaml 格式 (YAML Ain't Markup Language) ● 給 docker-compose 指令看的設定檔。 ● 根據 docker-compose.yml 的設定,docker-compose 可以一次啓 動多個 docker container,並設定之間的互通關聯、資料共享等。 ● docker-compose 背後其實很多個 docker 指令的組合、搭配,類似 git-flow 工具的背後其實是很多 git 指令的組合。 ● docker-compose.yml 手冊: https://docs.docker.com/compose/compose-file/

Slide 38

Slide 38 text

docker-compose 常用指令 ● docker-compose up -d ● docker-compose ps ● docker-compose restart ● docker-compose logs -f ● docker-compose stop ● docker-compose rm

Slide 39

Slide 39 text

應用思考

Slide 40

Slide 40 text

Microservice - Martin Fowler ● 微服務架構 (各自專注做好一件事) ● 怎樣算是 Microservice? ○ 兩個 Pizza 可以餵飽的團隊 (人數) ○ 兩週可以開發完成的項目 (時間)

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

Container 到底該專一還是多工? ● 專注於單一應用 (服務) 才符合 Docker 的精神? ● 把 Docker 當成 VM 那樣使用? ● Container 裡面要跑其他多個背景服務 (daemon) 怎麼辦? 推薦閱讀 http://phusion.github.io/baseimage-docker

Slide 43

Slide 43 text

Docker 的風險 ● 一定要做分散式叢集服務 ● 做好翻船的準備(請備妥救生艇 - 替代方案)

Slide 44

Slide 44 text

參考資料

Slide 45

Slide 45 text

● https://philipzheng.gitbooks.io/docker_practice/content/ ● https://speakerdeck.com/fntsrlike/docker-chu-tan-shi-yan-shi-zhong-de-yun-huo-jing ● https://speakerdeck.com/sskorc/docker-and-php ● https://speakerdeck.com/akalyaev/inside-docker ● https://speakerdeck.com/ndemoor/what-is-docker ● https://speakerdeck.com/slok/ship-it-with-docker ● https://linux.cn/article-6975-1.html ● http://lab.howie.tw/2014/08/docker-docker-lxc-hypervisor.html