目錄

Docker Notes 1 - Beginner

Docker 基本概念

一言以蔽之,
簡化版的 VM。
因為 docker 不會把整個 operating system 都裝起來,
所以大小比 VM 小很多速度也比 VM 快很多。

Image

跑在 container 上面的東西,
裡面包了一個輕量級的 runtime environment,
包含一些 library 跟 executable。

可以想像成 VM 上的 .iso
只能被讀。
要改的話就是產生一個新的 image。

Container

真的把 image 拿來跑起來的東西,
就是把 image 拿來真的啟動放到 memory 去執行,
跟 VM 一樣和 host environment 是完全隔離的,
除非經過特別設定否則對 container 做什麼跟 host environment 都沒有什麼關係,
例如說可以在 container 上把 port 開起來也不會影響到 host,
但有需要的話也可以設定。

Repository

放 Image 的地方。

可以拿 Git 的 Repository 做比喻,
Git 會有很多 repository,
每個 Repository 是拿來放一個專案的 code 的集合,
Docker 所謂的 repository 也是一樣,
Repository 是拿來放 image 的地方,
通常在同一個 repository 的 image 會有一樣的名字但不一樣的 tag。
所以也會有很多不同的 repository。

Registry

也是放 image 的地方。

和 repository 不同的是,
registry 是一種服務,
可以讓大家把 image 放上去或拉回自己的機器,
用 Git 來比喻就是像 Github。
最有名的就是 Docker Hub

Docker 基本使用

Install

在 Ubuntu 很簡單,

sudo apt-get install docker.io

Pull Image

官方 Docker Hub
有很多 Image 可以抓,
例如我想要一個乾淨無汙染的 Ubuntu 環境,
就可以用 command 來抓一個 Ubuntu 的 image 回自己的機器 (host machine):

docker pull ubuntu

或者要指定某一個 tag:

docker pull ubuntu:14.04

Run the Image

可以用剛剛 pull 下來的 Ubuntu echo 一個 Hello World:

docker run ubuntu /bin/echo 'Hello world'

應該會跳出一行 Hello world。

這裡只是測試一下 Image,
docker run 建立了一個暫時的 Container,
跑完 hello world 以後 container 就結束了。

列出 Local 有哪些 Images

docker images

應該會出現剛剛裝過的那個 Ubuntu。

Create 一個 Container

Container 被開出來就是可以被改變的東西了!!
用 image 建一個 container 就好像用 .iso 裝到 VM 裡。

用剛剛有的 ubuntu 那個 image 來建一個 container:

docker create -it ubuntu

也可以建立一個有名字的 Container:

docker create -it --name CONTAINER_NAME ubuntu

i 是指 input (讓 container 的 stdin 打開),
t 是指 tty (有個 terminal 可以用)。

或者如果要讓 Container 被 create 而且直接被啟動開始跑:

docker run -itd ubuntu

docker run -itd --name CONTAINER_NAME ubuntu

d 是指 detach (讓 container 跑在 background)。

列出有哪些 Container

docker ps -a

可以列出所有現在 host 上有的 container,
應該會出現前面用 Ubuntu image 建立起來的 Container。

可以看到 docker createdocker run 建立的 Container 的 status 會不一樣,
docker create 只有建立了這個 container 還沒有啟動他,
所以 status 會是 created
docker run 已經直接讓 container 被建立也被啟動了,
所以 status 會是 Up

最前面有個 container id
要去 run 這個 container 的時候可能會用到。

啟動並進入 Container

如果是用 docker create 建立的 container 要先被啟動才能進入:

可以用 container id 來啟動 container:

docker start "CONTAINER_ID"

或者如果建立 Container 有指定名字,
也可以用 container 的名字 來啟動 container:

docker start "CONTAINER_NAME"

當 container 的 status 是 exit 時就需要先被 start 啟動才能對 container 做後續的改動。
可以先用

docker ps -a

看一下 status。

已經被 docker run 啟動過先 run 在 background 的 container,
或是以敬備 docker start 啟動的 container 都可以用 docker exec 進入:

docker exec -it "CONTAINER_ID" bash

bash 是要執行的 command,
也可以用 docker exec 執行其他的 command 如 echo 等。

如果 container 有名字也能直接用 container 的名字進入 container

docker exec -it "CONTAINER_NAME" bash

應該會發現已經進入到 Container 了,
使用者會變成 Container 的 root,
可以開始在這個 Container 上面做設定或裝東西。

要離開 Container 環境的時候打個

exit

就好。

離開以後 Container 依然會在 background 跑。

停止 Container

就跟把 VM 關機差不多意思,
讓 container 變成未啟動的狀態,
讓 container 的 status 變成 exit

也是要用到 container id 或名字,

docker stop "CONTAINER_ID"

docker stop "CONTAINER_NAME"

如果這個時候再用

docker ps -a

看一下,
可以發現 status 會變成 Exited

Export Container

就可以把 Container export 出來變成 .tar檔搬到別的主機上,
也是要用到 container idcontainer name

假設要把 container export 出來變成 exported.tar:

docker export "CONTAINER_ID" > exported.tar

docker export "CONTAINER_NAME" > exported.tar

就能夠壓出一個 .tar 檔把 container 搬去別的主機。

Reference

Docker docs