- 啟動容器
-
- 建立并啟動
- 啟動已終止容器
-
- 背景運作
- 終止容器
- 進入容器
-
- attach 指令
- exec 指令
- -i -t 參數
-
- 導出和導入容器
-
- 導出容器
- 導入容器快照
-
- 删除容器
- 清理所有處于終止狀态的容器
啟動容器
容器是 Docker 又一核心概念。簡單的說,容器是獨立運作的一個或一組應用,以及它們的運作态環境。對應的,虛拟機可以了解為模拟運作的一整套作業系統(提供了運作态環境和其他系統環境)和跑在上面的應用。
啟動容器有兩種方式,一種是基于鏡像建立一個容器并啟動,另外一個是将在終止狀态( stopped )的容器重新啟動。
因為 Docker 的容器實在太輕量級了,很多時候使用者都是随時删除和新建立容器。
建立并啟動
所需要的指令主要為
docker run
。
例如,下面的指令輸出一個
Hello World
,之後終止容器。
$ docker run ubuntu: /bin/echo 'Hello world'
Hello world
這跟在本地直接執行 /bin/echo ‘hello world’ 幾乎感覺不出任何差別。
下面的指令則啟動一個 bash 終端,允許使用者進行互動。
$ docker run -t -i ubuntu: /bin/bash
root@af8bae53bdd3:/#
其中,
-t
選項讓Docker配置設定一個
僞終端
(pseudo-tty)并綁定到容器的标準輸入上,
-i
則讓容器的标準輸入保持打開。
在互動模式下,使用者可以通過所建立的終端來輸入指令,例如:
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 來建立容器時,Docker 在背景運作的标準操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載下傳
- 利用鏡像建立并啟動一個容器
- 配置設定一個檔案系統,并在隻讀的鏡像層外面挂載一層可讀寫層
- 從宿主主機配置的網橋接口中橋接一個虛拟接口到容器中去
- 從位址池配置一個 ip 位址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
啟動已終止容器
可以利用
docker container start
指令,直接将一個已經終止的容器啟動運作。
容器的核心為所執行的應用程式,所需要的資源都是應用程式運作所必需的。除此之外,并沒有其它的資源。可以在僞終端中利用
ps
或
top
來檢視程序資訊。
root@ba267838cc1b:/# ps
PID TTY TIME CMD
? :: bash
? :: ps
可見,容器中僅運作了指定的 bash 應用。這種特點使得 Docker 對資源的使用率極高,是貨真價實的輕量級虛拟化。
背景運作
更多的時候,需要讓 Docker 在背景運作而不是直接把執行指令的結果輸出在目前主控端下。此時,可以通過添加
-d 參數
來實作。
下面舉兩個栗子來說明一下。
如果不使用
-d 參數
運作容器。
$ docker run ubuntu: /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
容器會把輸出的結果 (STDOUT) 列印到主控端上面
如果使用了
-d 參數
運作容器。
$ docker run -d ubuntu: /bin/sh -c "while true; do echo hello world; sleep 1; done"
b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
此時容器會在背景運作并不會把輸出的結果 (STDOUT) 列印到主控端上面(輸出結果可以用docker logs 檢視)。
注:容器是否會長久運作,是和
指定的指令有關,和
docker run
無關。使用 -d 參數啟動後會傳回一個唯一的 id,也可以通過 docker container ls 指令來檢視容器資訊。
-d 參數
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2dc01fe0f ubuntu: /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
要擷取容器的輸出資訊,可以通過
docker container logs
指令。
$ docker container logs [container ID or NAMES]
hello world
hello world
hello world
. . .
終止容器
可以使用
docker container stop
來終止一個運作中的容器。
此外,當 Docker 容器中指定的應用終結時,容器也自動終止。
例如對于上一節中隻啟動了一個終端的容器,使用者通過
exit 指令
或
Ctrl+d
來退出終端時,所建立的容器立刻終止。
終止狀态的容器可以用
docker container ls -a
指令看到。例如:
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba267838cc1b ubuntu: "/bin/bash" minutes ago Exited () About a minute ago trusting_newton
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited () minutes ago backstabbing_pike
...
處于終止狀态的容器,可以通過
docker container start
指令來重新啟動。
此外, docker container restart 指令會将一個運作态的容器終止,然後再重新啟動它。
進入容器
進入容器
在使用
-d 參數
時,容器啟動後會進入背景。
某些時候需要進入容器進行操作,包括使用
docker attach 指令
或
docker exec 指令
,推薦大家使用 docker exec 指令,原因會在下面說明。
attach 指令
docker attach 是 Docker 自帶的指令。下面示例如何使用該指令。
$ docker run -dit ubuntu
c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f55
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c32535da7 ubuntu:latest "/bin/bash" seconds ago Up seconds nostalgic_hypatia
$ docker attach c
root@243c32535da7:/#
注意: 如果從這個 stdin 中 exit,會導緻容器的停止。
exec 指令
-i -t 參數
docker exec 後邊可以跟多個參數,這裡主要說明
-i -t 參數
。
隻用
-i 參數
時,由于沒有配置設定僞終端,界面沒有我們熟悉的 Linux 指令提示符,但指令執行結果仍然可以傳回。
當
-i -t 參數
一起使用時,則可以看到我們熟悉的 Linux 指令提示符。
$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69d137adef7a ubuntu:latest "/bin/bash" seconds ago Up seconds zealous_swirles
$ docker exec -i 69d1 bash
ls
bin
boot
dev
...
$ docker exec -it 69d1 bash
[email protected]:/#
如果從這個
stdin
中 exit,不會導緻容器的停止。這就是為什麼推薦大家使用 docker exec 的原因。
更多參數說明請使用
docker exec --help
檢視。
導出和導入容器
導出容器
如果要導出本地某個容器,可以使用
docker export
指令。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a814370e ubuntu: "/bin/bash" hours ago Exited() hours ago test
$ docker export a814370e > ubuntu.tar
這樣将導出容器快照到本地檔案。
導入容器快照
可以使用
docker import
從容器快照檔案中再導入為鏡像,例如:
$ cat ubuntu.tar | docker import - test/ubuntu:v1.
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTU AL SIZE
test/ubuntu v1. d37a6082e97 About a minute ago MB
此外,也可以通過指定 URL 或者某個目錄來導入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
注:使用者既可以使用來導入鏡像存儲檔案到本地鏡像庫,也可以使用
docker load
來導入一個容器快照到本地鏡像庫。這兩者的差別在于容器快照檔案将丢棄所有的曆史記錄和中繼資料資訊(即僅儲存容器當時的快照狀态),而鏡像存儲檔案将儲存完整記錄,體積也要大。此外,從容器快照檔案導入時可以重新指定标簽等中繼資料資訊。
docker import
删除容器
可以使用 docker container rm 來删除一個處于終止狀态的容器。例如:
$ docker container rm trusting_newton
trusting_newton
如果要删除一個運作中的容器,可以添加
-f 參數
。Docker 會發送
SIGKILL 信号
給容器。
清理所有處于終止狀态的容器
用
docker container ls -a
指令可以檢視所有已經建立的包括終止狀态的容器,如果數量太多要一個個删除可能會很麻煩,用下面的指令可以清理掉所有處于終止狀态的容器。
$ docker container prune
參考:https://github.com/yeasy/docker_practice