+ All Categories
Home > Technology > docker intro

docker intro

Date post: 10-May-2015
Category:
Upload: koji-lin
View: 727 times
Download: 2 times
Share this document with a friend
Popular Tags:
71
Docker Introduction @kojilin 2014/06/14@TWJUG
Transcript
Page 1: docker intro

Docker Introduction

@kojilin 2014/06/14@TWJUG

Page 2: docker intro

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

•@kojilin

•TWJUG organizer

•JWorld@TW Admin

•Senior Engineer at Cubie Inc.

•平常都在用 Java

Page 3: docker intro
Page 4: docker intro

Why docker?

Page 5: docker intro

Page 6: docker intro

Page 7: docker intro

Page 8: docker intro

潮•Redhat OpenShift

•Amazon AWS

•Google Cloud Platform

•Microsoft Azure

•...

Page 9: docker intro

潮•Redhat OpenShift

•Amazon AWS

•Google Cloud Platform

•Microsoft Azure

•...

from ANNOUNCING DOCKER HUB AND OFFICIAL REPOSITORIES

Page 10: docker intro

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

Page 11: docker intro

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

•使用 golang 撰寫

Page 12: docker intro

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

•使用 golang 撰寫

•Container based virtualization framework

Page 13: docker intro

Container ?

Page 14: docker intro

虛擬化的種類•Host (Type2)

•Hypervisor (Type1)

•Container

Page 15: docker intro

Host

硬體

虛擬 機器

Guest OS

虛擬 機器

Guest OS

虛擬 機器

Guest OS

Host OS

App App App • Virtualbox

• VMWare Fusion

Hypervisor

Page 16: docker intro

Hypervisor

虛擬 機器

Guest OS

虛擬 機器

Guest OS

虛擬 機器

Guest OS

App App App• Hyper-V

• Xen

• VMware ESX、ESXi

硬體

Hypervisor

Page 17: docker intro

Container

硬體

bin/lib

App

bin/lib

App

bin/lib

App

Host OS

• Docker

Page 18: docker intro

VM vs Containers

Page 19: docker intro

VM vs Containers

Page 20: docker intro

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

•使用 golang 撰寫

•Container based virtualization framework

•輕量 -> 快 !!

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

Page 21: docker intro

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

•使用 golang 撰寫

•Container

•Union File System

Page 22: docker intro
Page 23: docker intro
Page 24: docker intro
Page 25: docker intro

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

•使用 golang 撰寫

•Container

•Union File System

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

Page 26: docker intro

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

Page 27: docker intro

Docker Functions

Page 28: docker intro

Changes and Update

Page 29: docker intro

邊玩邊了解

Page 30: docker intro

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

Page 31: docker intro

Vagrant•1.6 supports Docker provider

•為何需要 Vagrant ?

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

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

Page 32: docker intro

安裝 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

Page 33: docker intro

安裝 docker 環境 Mac

•安裝 VirtualBox

•透過 brew 安裝 boot2docker

•透過 brew 安裝 docker

or •安裝 VirtualBox

•安裝 Vagrant 1.6

Page 34: docker intro

取得 base image

> docker pull dockerfile/ubuntu

OSUser Space

Kernel Space

Proc

ess

Image Ubuntu 14.04

Page 35: docker intro

啟動 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

Page 36: docker intro

安裝 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 !

Page 37: docker intro

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

Page 38: docker intro

Push image to docker hub

OS

Image Ubuntu 14.04

User Space

Kernel Space

Proc

ess

Image koji/java8

> docker push koji/java8

Page 39: docker intro

Docker Functions

Page 40: docker intro

啟動新 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:/#

Page 41: docker intro

安裝 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

Page 42: docker intro

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

Page 43: docker intro

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

Page 44: docker intro

Changes and Update

Page 45: docker intro

其他 command•docker stop 停止 container

•docker start 啟動停止的 container

•docker rm 刪除 container

•docker images 列出 images

•docker rmi 刪除 image

Page 46: docker intro

•除了上述手動方式建立 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

Page 47: docker intro

Dockerfile (cont.)

> docker build .

FROM ubuntu↵ MAINTAINER Koji lin <[email protected]>↵ !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↵

Page 48: docker intro

常用功能•Port Forwarding

•Mount Volume

•Linking Container

Page 49: docker intro

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

•-p hostport:containerport

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

Page 50: docker intro

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

•-v /host:/container

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

Page 51: docker intro

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

可以透過 container linking 的方式溝通

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

Page 52: docker intro

•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 …

Page 53: docker intro

Why Docker?

Page 54: docker intro

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

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

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

•便於達到 Immutable Infrastructure

Page 55: docker intro

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

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

•對 Java 開發者來說呢?

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

•通常相依的 Library 都是純 Java

Page 56: docker intro

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

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

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

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

Page 57: docker intro

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

•port mapping

•native library version incompatible

•存取相同路徑下的檔案

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

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

Page 58: docker intro

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

•port mapping

•native library version incompatible

•存取相同路徑下的檔案

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

Page 59: docker intro

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

Page 60: docker intro

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

•剛好機器上有 nginx

•剛好已經有 PHP4 的東西

Page 61: docker intro

例如想要用 Wordpress•PHP 5.2.4 or greater

•MySQL 5.0 or greater

•The mod_rewrite apache module

•剛好機器上有 nginx

•剛好已經有 PHP4 的東西

Page 62: docker intro

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

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

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

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

•Selenium with real browser

•Infrastructure CI

Page 63: docker intro

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

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

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

Page 64: docker intro

Deploy to Cloud

Page 65: docker intro

AWS•Elastic Beanstalk

EC2

Tomcat

Application

EC2

DockerGuest OS

Java(Tomcat) Docker

TomcatApplication

Page 66: docker intro

Demo

Page 67: docker intro

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

Dockerrun.aws.json

Page 68: docker intro

AWS•Elastic Beanstalk

•不能多 container 在一台機器上

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

•連上後自己操作 docker

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

Page 69: docker intro

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

Page 70: docker intro

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

一個 process 一個 container

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

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

Page 71: docker intro

Thanks


Recommended