再談 Docker Container

在上篇 再談 Docker Image 的介紹中對於 Docker Image 有了更深入的了解,接下來換 Docker Container 吧!下篇還有 Docker Repository,再來就是實際 Deploy 惹~再等等啊w

再談 Docker Container

啟動 Container

啟動容器有兩種方式,一種是將 Docker Image 新建一個 Container 並啟動,另外一個是將終止狀態(stopped)的 Container 重新啟動。

新建並啟動

透過 docker run 給他新建啟動起來~

1
docker run -t -i ubuntu:14.04 /bin/bash

其中,-t 指令讓 Docker 分配一個虛擬終端(pseudo-tty)並綁定到 Container 的 stdin 上,-i 則讓 Container 的 stdin 保持打開。意思是,使用者可以透過所建立的終端來輸入指令,例如:

1
2
3
4
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

當利用 docker run 來建立 Container 時,Docker 在後臺執行的標準操作包括:

  • 檢查本地是否存在指定的 Image,不存在就從 Repository Hub 下載
  • 利用 Image 建立並啟動一個 Container
  • 分配一個檔案系統,並在 Read-only 的 Image 層外面掛載一層可讀寫層
  • 從宿主主機設定的網路橋界面中橋接一個虛擬埠到容器中去
  • 從位址池中設定一個 IP 位址給 Container
  • 執行使用者指定的應用程式
  • 執行完畢後 Container 被終止

啟動已終止 Container

首先,先來看看目前的 Container 狀態

1
2
3
4
5
6
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
dd1c54fef918 ubuntu:14.04 "/bin/bash" 10 minutes ago Exited (0) 3 seconds ago agitated_boyd
2f902d9238f5 chestertang/sinatra:v2 "/bin/bash" 5 days ago Exited (0) About a minute ago confident_ritchie
d7b639b8385a ubuntu:12.04 "/bin/bash" 7 days ago Exited (127) 7 days ago dreamy_hypatia

從狀態(STATUS)中可以知道目前有啟動的 Container,現在透過 docker start,直接將已經終止的 Container(dd1c54fef918)啟動起來w

1
2
3
4
5
6
docker start dd1c54fef918

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
dd1c54fef918 ubuntu:14.04 "/bin/bash" 10 minutes ago Up 3 seconds agitated_boyd
2f902d9238f5 chestertang/sinatra:v2 "/bin/bash" 5 days ago Exited (0) About a minute ago confident_ritchie
d7b639b8385a ubuntu:12.04 "/bin/bash" 7 days ago Exited (127) 7 days ago dreamy_hypatia

停止 Container

跟上面就很類似了,相對的有 start 就會有 stop

1
2
3
4
5
6
7
8
9
10
11
12
13
docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
dd1c54fef918 ubuntu:14.04 "/bin/bash" 10 minutes ago Up 3 seconds agitated_boyd
2f902d9238f5 chestertang/sinatra:v2 "/bin/bash" 5 days ago Exited (0) About a minute ago confident_ritchie
d7b639b8385a ubuntu:12.04 "/bin/bash" 7 days ago Exited (127) 7 days ago dreamy_hypatia

docker stop dd1c54fef918

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
dd1c54fef918 ubuntu:14.04 "/bin/bash" 10 minutes ago Exited (0) 2 seconds ago agitated_boyd
2f902d9238f5 chestertang/sinatra:v2 "/bin/bash" 5 days ago Exited (0) About a minute ago confident_ritchie
d7b639b8385a ubuntu:12.04 "/bin/bash" 7 days ago Exited (127) 7 days ago dreamy_hypatia

此外,當 Docker Container 中指定的應用停止時,Container 也自動停止。例如退出啟動的一個終端機 Container,使用者透過 exit 命令或 Ctrl+d 來退出終端機時,所建立的 Container 也隨之結束。

docker restart 命令會將一個執行中的 Container 終止,然後再重新啟動。

Daemonized 執行

更多的時候,需要讓 Docker Container 在後臺以 Daemonized 形式執行。此時,可以透過新增 -d 參數來實作

1
2
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
31cec6c9afae51cd0adad62ac18b837e4d5caa80c141d7a8b0f7688670cb6e37

Container 啟動後會返回一個唯一的 id,也可以透過 docker ps 指令來查看 Container 訊息

1
2
3
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
31cec6c9afae ubuntu:14.04 "/bin/sh -c 'while t…" 11 seconds ago Up 10 seconds confident_mirzakhani

要取得 Container 的輸出訊息,可以透過 docker logs 指令來查看~

1
2
3
4
5
6
docker logs 31cec6c9afae

hello world
hello world
hello world
...

何謂 Daemonized ?

進入 Container

有些時候不能只是在背景執行而已,需要透過進入 Container 來進行操作,其中有以下幾種方法

exec 指令

首先先列出想要進入的 Container(相信已經很熟悉像是:列出 Container、Image 這類型的操作,更或者是連新增刪除都很熟悉惹w)

1
2
3
4
5
6
7
docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
31cec6c9afae ubuntu:14.04 "/bin/sh -c 'while t…" 18 minutes ago Up 18 minutes confident_mirzakhani

docker exec -ti pensive_agnesi bash
root@f4bf4c32b4c9:/#

attach 指令

exec 要輸入的指令是完完全全相同的,只差在 execattach 這兩個字

1
2
3
4
5
6
7
docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
31cec6c9afae ubuntu:14.04 "/bin/sh -c 'while t…" 18 minutes ago Up 18 minutes confident_mirzakhani

docker attach -ti pensive_agnesi bash
root@f4bf4c32b4c9:/#

所以 attach / exec 到底哪裡不同呢?

Import and Export Container

Import Container

如果要匯入別人的 Container 的話,可以透過 docker import 從 Container 檔案中再匯入為 Image

1
2
3
4
5
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB

Export Container

反之,如果要匯出 local 端的某一個 Container,可以使用 docker export 指令來進行

1
2
3
4
5
6
docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
31cec6c9afae ubuntu:14.04 "/bin/sh -c 'while t…" 18 minutes ago Up 18 minutes confident_mirzakhani

docker export 31cec6c9afae > ubuntu1404.tar

就會匯出檔案囉~~

1
2
ls
ubuntu1404.tar

刪除 Container

在上一篇當中,就有提到過如果要刪除 Image 時,如果還有 Container 還在使用這個 Image 會導致無法刪除的問題,這時候就可以用 docker rm 指令來刪除

1
2
docker rm confident_mirzakhani
confident_mirzakhani

單純上方的指令只能刪除一個處於終止狀態的 Container,如果想要刪除正在執行中的 Container,可以新增 -f 參數指令,已完成需求。