原文: 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 |
---|---|---|
| | 列出所有容器,包括未運作的容器,預設隻展示運作的容器 |
| 根據條件過濾顯示内容 | |
| 通過Go語言模闆檔案展示鏡像 | |
| | 顯示最近建立n個容器(包含所有狀态) |
| | 顯示最近建立的容器(包含所有狀态) |
| | 不截斷輸出 |
| | 靜默模式,隻展示容器的編号 |
| | 顯示總檔案大小 |
示例:
docker ps -n 5
docker ps -a -q
停止容器[重要]
docker stop
指令,即可停止容器。
docker stop [OPTIONS] CONTAINER [CONTAINER...]
| | 強制殺死容器前等待的時間,機關是秒 |
docker stop 784fd3b294d7
其中
784fd3b294d7
是容器ID,當然也可使用
docker stop 容器名稱
來停止指定容器。
強制停止容器[重要]
可使用
docker kill
指令停止一個或更多運作着的容器。
docker kill [OPTIONS] CONTAINER [CONTAINER...]
| | 向容器發送一個信号 |
例如:
docker kill 784fd3b294d7
啟動已停止的容器[重要]
docker run
指令,即可建立并啟動一個容器。對于已停止的容器,可使用
docker start
指令來啟動。
docker start [OPTIONS] CONTAINER [CONTAINER...]
| | 連接配接STDOUT/STDERR并轉發信号 |
| 從該檢查點還原 | |
| 使用自定義的檢查點存儲目錄 | |
| 覆寫斷開容器的關鍵順序 | |
| | 連接配接容器的STDIN |
docker start 784fd3b294d7
重新開機容器[重要]
docker restart
指令來重新開機容器。該指令實際上是先執行了
docker stop
指令,然後執行了
docker start
指令。
docker restart [OPTIONS] CONTAINER [CONTAINER...]
| | 關閉容器前等待的時間,機關是秒 |
進入容器[重要]
某場景下,我們可能需要進入運作中的容器。
① 使用
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...]
| | 通過SIGKILL信号強制删除正在運作中的容器 |
| | 删除容器間的網絡連接配接 |
| | 删除與容器關聯的卷 |
例1:删除指定容器。
docker rm 784fd3b294d7
該指令隻能删除已停止的容器,如需删除正在運作的容器,可使用-f參數。
例2:删除所有的容器。
docker rm -f $(docker ps -a -q)
導出容器
将容器導出成一個壓縮封包件。
docker export [OPTIONS] CONTAINER
| 将内容寫到檔案而非STDOUT |
docker export red_panda > latest.tar
docker export --output="latest.tar" red_panda
導入容器
docker import
指令即可從歸檔檔案導入内容并建立鏡像。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
| 将Dockerfile指令應用到建立的鏡像 | |
| 為導入的鏡像設定送出資訊 |
docker import nginx2.tar nginx
拓展閱讀