0%

Introduction to Docker

Docker跟Virtual Box這種Virtual Machine上的虛擬化不同,他是基於64 bit linux上,由cgroups/AUFS/LXC為基礎發展出來的Linux virtualization,目前也僅能在Linux上跑,相對於VM等級,更輕量化且更省資源。

安裝

由於Docker需要Linux kernel 3.8以上的,如果版本比較舊的要先更新

1
2
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo shutdown -r now

Update: Ubuntu 14.04

由於Ubuntu 14.04直接收入Docker
所以直接安裝docker.io就好,然後以下的指令全部用docker.io取代docker

1
$ sudo apt-get install docker.io

將Docker的PGP Key跟Repository加入環境中

1
2
$ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
$ sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"

跟新Source且安裝LXC-Docker

1
2
$ sudo apt-get update
$ sudo apt-get install lxc-docker

測試安裝是否成功

1
2
$ sudo docker pull busybox
$ sudo docker run busybox /bin/echo hello world

Image

Image就類似Vagrant的Box,是被包裝過的容器。可以在Docker index尋找想要的Image。
REPOSITORY的命名格式是username/repository如果沒有username表示是官方的Image。
或是透過以下指令,找尋想要的Image

1
$ sudo docker search {keywork}

透過docker pull,下載想要的
透過以下指令,列出目前本地有的Image

1
$ sudo ducker images 

結果如下

1
2
3
4
5
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
custom/ubuntu latest 0ec6a8082708 9 hours ago 303.7 MB
ubuntu 13.10 5e019ab7bf6d 9 days ago 180 MB
ubuntu saucy 5e019ab7bf6d 9 days ago 180 MB
ubuntu 12.04 74fe38d11401 9 days ago 209.6 MB

刪除Image的方法

1
2
$ sudo docker rmi {REPOSITORY-NAME}
$ sudo docker rmi $(sudo docker ps -a -q) # 刪除所有Image

Dockerfile

類似VagrantFile,用這個當按來控制Image的生成。這裡是官方教學Dockerfile tutorial,有時間在仔細看。
Docker Project收錄了常用的Dockerfile。

以下是個範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# VERSION 0.0.1
FROM ubuntu

MAINTAINER widuu "admin@widuu.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 openssh-server
RUN mkdir -p /var/run/sshd

RUN echo "root:dgj99349" | chpasswd

EXPOSE 22

ENTRYPOINT /usr/sbin/sshd -D

接著下

1
$ sudo docker build -t="custom/sshd" .

就會建立一個custom/sshd的Image。

Run a Container

執行中的Image叫做Container,跟Program/Process的定義很像。
我們有兩種方法執行Image,一個是直接對Image下指令,或者是在背景執行。

立即執行

1
$ sudo docker run -i -t ubuntu /bin/bash

-i表示interacive mode,-t表示建立一個tty。選擇ubuntu的image之後,執行Bash指令。
記住在這邊執行任何操作,不會紀錄在Image之中,這點跟Vagrant不同,需要Commit成為新的Image。

暫停目前Container

利用Ctrl + D或是exit達成

得到這個Container的Metadata

1
$ sudo docker inspect {CONTAINER-ID} 

背景執行

1
$ sudo docker run -d -p 12345:80 -v /home/hm//share:/var/www:rw dockerfile/nginx

其中 -d表示Daemon mode, -p表示Container中的port 80映射到Host PC的port 12345。而-v表示映射目錄。
透過 以下指令看到目前運行中的Image

1
$ sudo docker ps -l

如果要停止一個Daemon,就要透過
$ sudo docker stop {CONTAINER-ID}

刪除Container

1
2
$ sudo docker rm {CONTAINER-ID} 
$ sudo docker rm $(sudo docker ps -a -q) # 刪除所有Image

Diff / Commit Container / Push / Pull

可以知道目前的Container做了什麼改變,且Commit改變成為新的Image

1
2
$ sudo docker diff {CONTAINER-ID}
$ sudo docker commit {CONTAINER-ID} {NAME}:{TAG}

首先先在[Docker index]申請一個帳號

1
2
3
$ sudo docker login
$ sudo docker push {username/repo}
$ sudo docker pull {username/repo}

Remove sudo

每次都打sudo有點麻煩,這邊有個簡化方法

1
2
3
4
$ sudo groupadd docker
$ sudo gpasswd -a hm docker
$ sudo docker service restart
$ sudo reboot

Resources