Docker容器

zyhmz發表於2018-06-15

這一part主要來記錄一下我們對docker容器的操作。容器是 Docker 又一核心概念。
簡單的說,容器是獨立執行的一個或一組應用,以及它們的執行態環境。

新建並啟動容器
啟動容器有兩種方式,一種是基於映象新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。

我們的命令主要為 docker run。例如,下面的命令輸出一個 “Hello World”,之後終止容器。這跟在本地直接執行 /bin/echo ‘hello world’ 幾乎感覺不出任何區別。

$ docker run ubuntu:16.04 /bin/echo 'Hello world'
Hello world

下面的命令則啟動一個 bash 終端,允許使用者進行互動:

$ docker run -it ubuntu:16.04 /bin/bash
root@af8bae53bdd3:/#

其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上, -i 則讓容器的標準輸入保持開啟。當利用 docker run 來建立容器時,Docker 在後臺執行的標準操作包括:

1.檢查本地是否存在指定的映象,不存在就從公有倉庫下載
2.利用映象建立並啟動一個容器
3.分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
4.從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
5.從地址池配置一個 ip 地址給容器
6.執行使用者指定的應用程式
7.執行完畢後容器被終止

啟動已終止容器

可以利用 docker container start [container ID or NAMES] 命令,直接將一個已經終止的容器啟動執行。容器的核心為所執行的應用程式,所需要的資源都是應用程式執行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 ps 或 top 來檢視程式資訊。

在守護態下執行
更多的時候,需要讓 Docker 在後臺執行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過新增 -d 引數來實現。

如果不使用 -d 引數執行容器:

$ docker run ubuntu:16.04 /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:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此時容器會在後臺執行並不會把輸出的結果 (STDOUT) 列印到宿主機上面(輸出結果可以用 docker logs 檢視)。使用 -d 引數啟動後會返回一個唯一的 id,也可以通過 docker container ls 命令來檢視容器資訊。

$ docker container ls
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
77b2dc01fe0f  ubuntu:16.04  /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 [container ID or NAMES] 來終止一個執行中的容器。

終止狀態的容器可以用 docker container ls -a 命令看到。例如:

docker container ls -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTS               NAMES
ba267838cc1b        ubuntu:14.04             "/bin/bash"            30 minutes ago      Exited (0) About a minute ago                       trusting_newton
98e5efa7d997        training/webapp:latest   "python app.py"        About an hour ago   Exited (0) 34 minutes ago                           backstabbing_pike

docker container restart [container ID or NAMES] ,這個命令會將一個執行態的容器終止,然後再重新啟動它。

進入容器
在使用 -d 引數時,容器啟動後會進入後臺。某些時候需要進入容器進行操作,包括使用 docker attach 命令或 docker exec 命令。但是我們一般推薦使用docker exec命令,因為docker attach 從 stdin 中 exit之後,會導致容器停止。
所以我們一般使用docker exec命令,如果從這個 stdin 中 exit,不會導致容器的停止。

docker exec -it 69d1fd bash

刪除容器

$ docker container rm trusting_newton
trusting_newton

如果要刪除一個執行中的容器,可以新增 -f 引數。Docker 會傳送 SIGKILL 訊號給容器。

相關文章