Date post: | 10-May-2015 |
Category: |
Technology |
Upload: | koji-lin |
View: | 727 times |
Download: | 2 times |
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 <[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↵
常用功能•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