Transcript

Docker Introduction

@kojilin 2014/06/14@TWJUG

Who?•林康司 a.k.a kojilin

•@kojilin

•TWJUG organizer

•JWorld@TW Admin

•Senior Engineer at Cubie Inc.

•平常都在用 Java

Why docker?

潮•Redhat OpenShift

•Amazon AWS

•Google Cloud Platform

•Microsoft Azure

•...

潮•Redhat OpenShift

•Amazon AWS

•Google Cloud Platform

•Microsoft Azure

•...

from ANNOUNCING DOCKER HUB AND OFFICIAL REPOSITORIES

What is Docker?•Docker 公司開發的產品

What is Docker?•Docker 公司開發的產品

•使用 golang 撰寫

What is Docker?•Docker 公司開發的產品

•使用 golang 撰寫

•Container based virtualization framework

Container ?

虛擬化的種類•Host (Type2)

•Hypervisor (Type1)

•Container

Host

硬體

虛擬 機器

Guest OS

虛擬 機器

Guest OS

虛擬 機器

Guest OS

Host OS

App App App • Virtualbox

• VMWare Fusion

Hypervisor

Hypervisor

虛擬 機器

Guest OS

虛擬 機器

Guest OS

虛擬 機器

Guest OS

App App App• Hyper-V

• Xen

• VMware ESX、ESXi

硬體

Hypervisor

Container

硬體

bin/lib

App

bin/lib

App

bin/lib

App

Host OS

• Docker

VM vs Containers

VM vs Containers

What is Docker?•Docker 公司開發的產品

•使用 golang 撰寫

•Container based virtualization framework

•輕量 -> 快 !!

•與其說是虛擬化,比較像是隔離

What is Docker?•Docker 公司開發的產品

•使用 golang 撰寫

•Container

•Union File System

What is Docker?•Docker 公司開發的產品

•使用 golang 撰寫

•Container

•Union File System

•方便的 Container(image) 發佈取得方式

Image 的發佈和取得•編輯原本的 Image 產生新的 Image

•將 Image 登錄到 Docker Hub

•http://hub.docker.com

•可以從 Docker Hub 下載合適的 Image,馬上執行

> docker search tomcat > docker pull tutum/tomcat:latest > docker run -d -p 8080:8080 tutum/tomcat

Docker Functions

Changes and Update

邊玩邊了解

Docker on OSX•OSX 可以跑 Docker command,但是不能直接執行

Docker Container

•因為不是 Linux

•使用 VM 來準備 Linux Host 環境

•會變成 OSX -> Proxy VM -> Docker container

•所以許多 host 跟 container 溝通的功能會是Proxy VM <-> container,而不是想像中的 OSX <-> container

•官方是建議安裝 boot2docker

Vagrant•1.6 supports Docker provider

•為何需要 Vagrant ?

•在非 Linux 環境下,透過編輯 Vagrantfile 方便管理 boot2docker

•尤其 Synced Folders, Networking 很方便,可以較輕鬆的讓 host 跟 container 溝通

安裝 docker 環境 Ubuntu

•sudo apt-get install docker.io

•sudo docker.io pull ubuntu

•sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

•sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

安裝 docker 環境 Mac

•安裝 VirtualBox

•透過 brew 安裝 boot2docker

•透過 brew 安裝 docker

or •安裝 VirtualBox

•安裝 Vagrant 1.6

取得 base image

> docker pull dockerfile/ubuntu

OSUser Space

Kernel Space

Proc

ess

Image Ubuntu 14.04

啟動 container

> docker run -i -t dockerfile/ubuntu bash root@ce9fd02cffaf:/#

OSUser Space

Kernel Space

Proc

ess User Space

Proc

ess

Container ce8fd02cffaf

Image Ubuntu 14.04

安裝 Javaroot@ce9fd02cffaf:/# add-apt-repository ppa:webupd8team/java root@ce9fd02cffaf:/# apt-get update root@ce9fd02cffaf:/# apt-get -y upgrade root@ce9fd02cffaf:/# echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections root@ce9fd02cffaf:/# apt-get -y install oracle-java8-installer && apt-get clean root@ce9fd02cffaf:/# exit !

List and Commit container

OS

Image Ubuntu 14.04

User Space

Kernel Space

Proc

ess

Image koji/java8

> docker ps -a CONTAINER ID IMAGE COMMAND ce9fd02cffaf dockerfile/ubuntu:latest bash

> docker commit ce9fd02cffaf koji/java8

Push image to docker hub

OS

Image Ubuntu 14.04

User Space

Kernel Space

Proc

ess

Image koji/java8

> docker push koji/java8

Docker Functions

啟動新 image 上的 container

OSImage Ubuntu 14.04

User Space

Kernel Space

Proc

ess User Space

Proc

ess

Image koji/java8

Container 63d304af38e

> docker run -i -t koji/java8 bash root@63d304af38ee:/#

安裝 Tomcat 7

OSImage Ubuntu 14.04

User Space

Kernel Space

Proc

ess User Space

Proc

ess

Image koji/java8

root@63d304af38ee:/# apt-get install tomcat7

Container 63d304af38e

Commit container

OS

Image Ubuntu 14.04

User Space

Kernel Space

Proc

ess

Image koji/java8

root@63d304af38ee:/# exit > docker commit 63d304af38ee koji/java8-tomcat7

Image koji/java8-tomcat7

push image

OS

Image Ubuntu 14.04

User Space

Kernel Space

Proc

ess

Image koji/java8

> docker push koji/java8-tomcat7

Image koji/java8-tomcat7

Changes and Update

其他 command•docker stop 停止 container

•docker start 啟動停止的 container

•docker rm 刪除 container

•docker images 列出 images

•docker rmi 刪除 image

•除了上述手動方式建立 image 之外,我們也可以透過敘述指令的檔案來建立

•Docker can act as a builder and read instructions from a text Dockerfile to automate the steps you would otherwise take manually to create an image

Dockerfile

Dockerfile (cont.)

> docker build .

FROM ubuntu↵ MAINTAINER Koji lin <koji.lin@gmail.com>↵ !RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list↵ RUN apt-get update↵ !RUN apt-get install -y inotify-tools nginx apache2 openssh-server↵

常用功能•Port Forwarding

•Mount Volume

•Linking Container

Port Forwarding•讓 host 的 port 轉到 container 指定 port

•-p hostport:containerport

> docker run -p 18080:8080 koji/tomcat startup.sh

Mount Volume•可以將 host 的目錄讓 container 存取

•-v /host:/container

> docker run -v /host-hoge:/hoge -d -p 8080:8080 tutum/tomcat

Linking Container•除了 port forwarding 外,container 之間

可以透過 container linking 的方式溝通

> docker run --link db:db -d -p 8080:8080 tutum/tomcat

•Docker 透過兩種方式分享被 link 的 container 的資訊

> env DB_NAME=/xxxx/db DB_PORT_8080_TCP_ADDRE=172.17.0.2 DB_POER_8080_TCP_PORT=8080 …

> less /etc/hosts … 172.17.0.2 db …

Why Docker?

DevOps•如果打包成 Docker Image, 只要有 Docker

環境就都能跑,而且和 local 驗證環境的結果相同

•可以在不同 PaaS 間輕易遊走

•便於達到 Immutable Infrastructure

Developer•如果容易受到執行環境的影響,那使用

Docker 會比較方便(例如版本衝突)

•對 Java 開發者來說呢?

•IDE 就可以設定執行時的 VM 和對象

•通常相依的 Library 都是純 Java

Developer (cont.)•開發者之間可以直接共享同樣驗證環境

•可以和測試,正式部署使用相同環境

•使用某個執行中的 Image 做驗證

•可以將開發環境丟到執行環境就能跑

在測試環境下•機器上同時有好幾個專案或不同版本

•port mapping

•native library version incompatible

•存取相同路徑下的檔案

•通常每個 middleware 都必須改寫 port, file path...等等設定,但是這樣就跟正式執行時的設定有了差異

•修改 container 內設定,還是修改 container 外設定?

在測試環境下•機器上同時有好幾個專案或不同版本

•port mapping

•native library version incompatible

•存取相同路徑下的檔案

•通常每個 middleware 都必須改寫 port, file path...等等設定,但是這樣就跟正式執行時的設定有了差異

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

•剛好機器上有 nginx

•剛好已經有 PHP4 的東西

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

•剛好機器上有 nginx

•剛好已經有 PHP4 的東西

Testing•每次 Build 時建立一個新的 container

•透過 -v mount volume 來取得程式

•每個 Build 都是隔離且乾淨的環境

•相對於像 Vagrant 的方式, 因為輕量,所以多開幾個執行也沒問題

•Selenium with real browser

•Infrastructure CI

用來嘗試新版本•想裝一下應用程式試看看...

•想裝一下新版的 Application Server 測試運作中的專案...

•想裝一下跟電腦上不同的新版 DBMS,但是我機器上已經...

Deploy to Cloud

AWS•Elastic Beanstalk

EC2

Tomcat

Application

EC2

DockerGuest OS

Java(Tomcat) Docker

TomcatApplication

Demo

{ "AWSEBDockerrunVersion": "1", "Image" : { "Name" : "tutum/tomcat:8.0" }, "Ports" : [{ "ContainerPort": "8080" }] }

Dockerrun.aws.json

AWS•Elastic Beanstalk

•不能多 container 在一台機器上

•可以用 EC2 自己建制好環境

•連上後自己操作 docker

•搭配 Docker registry 背後用 Amazon S3 來當做 private repository

Google Compute Engine•有提供 Container-optimized Google

Compute Engine images

•透過 gcloud 建立 instance 後就可以連上使用 docker

> gcloud compute instances create instance-name --image projects/google-containers/global/images/container-vm-v20140522 --zone us-central1-a --machine-type f1-micro

一些看到的建議•每個 container 應該當作一種 VM,不需要

一個 process 一個 container

•用角色為基礎去建立 container,就像設定 server 會有 web, db, batch, log

•不要將資料存在 container 內,例如 db 要存的資料,或是 log 應該放到 host

Thanks

top related