天天看點

Docker系列教程05-容器常用指令

原文: http://www.itmuch.com/docker/05-docker-command-containers/

本節我們來讨論Docker容器的常用指令。

建立并啟動容器[重要]

使用以下

docker run

指令即可建立并啟動一個容器。該指令是我們最常用的指令了,它有很多選項,下面筆者列舉一些常用的選項。

① -d選項:表示背景運作

② -P選項:随機端口映射

③ -p選項:指定端口映射,有以下四種格式。

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

④ --network選項:指定網絡模式,該選項有以下可選參數:

--network=bridge: 預設選項,表示連接配接到預設的網橋。

--network=host:容器使用主控端的網絡。

--network=container:NAME_or_ID:告訴Docker讓建立的容器使用已有容器的網絡配置。

--network=none:不配置該容器的網絡,使用者可自定義網絡配置。

示例1:

docker run java /bin/echo 'Hello World'
           

這樣終端會列印Hello World的字樣,跟在本地直接執行

/bin/echo 'Hello World'

一樣。

示例2:

docker run -d -p 91:80 nginx
           

這樣就能啟動一個Nginx容器。在本例中,我們為docker run添加了兩個參數,含義如下:

-d                           # 背景運作
-p 主控端端口:容器端口         # 開放容器端口到主控端端口
           

通路

http://Docker主控端IP:91/

,将會看到如圖12-3的界面:

12-3.png

圖12-3 Nginx首頁

TIPS

需要注意的是,使用docker run指令建立容器時,會先檢查本地是否存在指定鏡像。如果本地不存在該名稱的鏡像,Docker就會自動從Docker Hub下載下傳鏡像并啟動一個Docker容器。

列出容器[重要]

使用

docker ps

指令即可列出運作中的容器。執行該指令後,可看到類似于如下的表格。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
784fd3b294d7        nginx               "nginx -g 'daemon off"   20 minutes ago      Up 2 seconds        443/tcp, 0.0.0.0:91->80/tcp   backstabbing_archimedes
           

如需列出所有容器(包括已停止的容器),可使用-a參數。

該表格包含了七列,含義如下:

① CONTAINER_ID:表示容器ID。

② IMAGE:表示鏡像名稱。

③ COMMAND:表示啟動容器時運作的指令。

④ CREATED:表示容器的建立時間。

⑤ STATUS:表示容器運作的狀态。Up表示運作中,Exited表示已停止。

⑥ PORTS:表示容器對外的端口号。

⑦ NAMES:表示容器名稱。該名稱預設由Docker自動生成,也可使用docker run指令的--name選項自行指定。

指令格式:

docker ps [OPTIONS]
           

參數:

Name, shorthand Default Description

--all, -a

false

列出所有容器,包括未運作的容器,預設隻展示運作的容器

--filter, -f

根據條件過濾顯示内容

--format

通過Go語言模闆檔案展示鏡像

--last, -n

-1

顯示最近建立n個容器(包含所有狀态)

--latest, -l

false

顯示最近建立的容器(包含所有狀态)

--no-trunc

false

不截斷輸出

--quiet, -q

false

靜默模式,隻展示容器的編号

--size, -s

false

顯示總檔案大小

示例:

docker ps -n 5
docker ps -a -q
           

停止容器[重要]

docker stop

指令,即可停止容器。

docker stop [OPTIONS] CONTAINER [CONTAINER...]
           

--time, -t

10

強制殺死容器前等待的時間,機關是秒
docker stop 784fd3b294d7
           

其中

784fd3b294d7

是容器ID,當然也可使用

docker stop 容器名稱

來停止指定容器。

強制停止容器[重要]

可使用

docker kill

指令停止一個或更多運作着的容器。

docker kill [OPTIONS] CONTAINER [CONTAINER...]
           

--signal, -s

KILL

向容器發送一個信号

例如:

docker kill 784fd3b294d7
           

啟動已停止的容器[重要]

docker run

指令,即可建立并啟動一個容器。對于已停止的容器,可使用

docker start

指令來啟動。

docker start [OPTIONS] CONTAINER [CONTAINER...]
           

--attach, -a

false

連接配接STDOUT/STDERR并轉發信号

--checkpoint

從該檢查點還原

--checkpoint-dir

使用自定義的檢查點存儲目錄

--detach-keys

覆寫斷開容器的關鍵順序

--interactive, -i

false

連接配接容器的STDIN
docker start 784fd3b294d7
           

重新開機容器[重要]

docker restart

指令來重新開機容器。該指令實際上是先執行了

docker stop

指令,然後執行了

docker start

指令。

docker restart [OPTIONS] CONTAINER [CONTAINER...]
           

--time, -t

10

關閉容器前等待的時間,機關是秒

進入容器[重要]

某場景下,我們可能需要進入運作中的容器。

① 使用

docker attach

指令進入容器。

docker attach 784fd3b294d7
           

很多場景下,使用

docker attach

指令并不友善。當多個視窗同時attach到同一個容器時,所有視窗都會同步顯示。同理,如果某個視窗發生阻塞,其他視窗也無法執行操作。

② 使用

nsenter

進入容器

nsenter工具包含在util-linux 2.23或更高版本中。為了連接配接到容器,我們需要找到容器第一個程序的PID,可通過以下指令擷取:

docker inspect --format "{{.State.Pid}}" $CONTAINER_ID
           

獲得PID後,就可使用nsenter指令進入容器了:

nsenter --target "$PID" --mount --uts --ipc --net --pid
           

下面給出一個完整的例子:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
784fd3b294d7        nginx               "nginx -g 'daemon off"   55 minutes ago      Up 3 minutes        443/tcp, 0.0.0.0:91->80/tcp   backstabbing_archimedes
[root@localhost ~]# docker inspect --format "{{.State.Pid}}" 784fd3b294d7
95492
[root@localhost ~]# nsenter --target 95492 --mount --uts --ipc --net --pid
root@784fd3b294d7:/# 
           

讀者也可将以上兩條指令封裝成一個Shell,進而簡化進入容器的過程。

③ docker exec

docker exec -it 容器id /bin/bash
           

删除容器[重要]

docker rm

指令即可删除指定容器。

指令格式

docker rm [OPTIONS] CONTAINER [CONTAINER...]
           

--force, -f

false

通過SIGKILL信号強制删除正在運作中的容器

--link, -l

false

删除容器間的網絡連接配接

--volumes, -v

false

删除與容器關聯的卷

例1:删除指定容器。

docker rm 784fd3b294d7
           

該指令隻能删除已停止的容器,如需删除正在運作的容器,可使用-f參數。

例2:删除所有的容器。

docker rm -f $(docker ps -a -q)
           

導出容器

将容器導出成一個壓縮封包件。

docker export [OPTIONS] CONTAINER
           

--output, -o

将内容寫到檔案而非STDOUT
docker export red_panda > latest.tar
docker export --output="latest.tar" red_panda
           

導入容器

docker import

指令即可從歸檔檔案導入内容并建立鏡像。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
           

--change, -c

将Dockerfile指令應用到建立的鏡像

--message, -m

為導入的鏡像設定送出資訊
docker import nginx2.tar nginx
           

拓展閱讀