簡介
通過前面的學習,相信您已經對鏡像有所瞭解,是時候學習容器了。
容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例
。正如從虛擬機模板上啓動VM一樣,用戶也同樣可以從單個鏡像上啓動一個或多個容器。
本章帶大家學習容器相關的重要操作,包括
創建容器
、啓動容器
、終止容器
、進入容器後執行操作
、刪除容器
及通過導入導出容器實現容器遷移
、容器與宿主機之間數據拷貝
等。
1、創建容器
1、新建容器
語法格式:
例如:
[root@qll251 ~]# docker create -it ubuntu:18.04
eeb931f21f0895d055bedcbe5829634309cbc24863eee6f80b14a131559ffd21
參數說明:
-
-i
保持標準輸入打開,用於控制檯交互
-
t
分配一個tty僞終端,支持終端登錄
2、啓動容器
使用
docker create
命令新建的容器處理停止狀態,可使用docker start
啓動它。
例如,啓動剛剛創建的ubuntu容器:
[root@qll251 ~]# docker start eeb
eeb
eeb
爲剛剛創建容器的ID簡寫,此時通過docker ps
查詢容器已運行:
3、新建並啓動容器
例如,使用 ubuntu 鏡像啓動一個容器,參數爲以命令行模式進入該容器:
[root@qll251 ~]# docker run -it ubuntu /bin/bash
root@8b18b6758bb6:/#
docker run
相當於執行了兩個步驟:將鏡像放入容器
中(docker create),然後啓動容器
(docker start)。
4、後臺運行容器
對於剛剛所創建的容器,當用戶使用exit命令退出後,容器也會自動退出,如下圖所示的Exited
狀態。
因爲對它來說,當容器的應用退出後,容器使命完成,也就沒有繼續運行的必要了。
因此更多時候,我們希望 Docker 容器是在後臺一直運行。此時可以通過添加-d
參數來實現。驗證如下:
小知識點:如果不指定後臺運行容器,還有其他辦法退出而容器不關閉嗎?按
Ctrl+P+Q
即可實現正常退出不關閉容器。驗證如下:
2、停止容器
1、暫停容器
例如,暫停容器中所有的進程
處於paused
狀態的容器,可以使用docker unpause
命令恢復到運行狀態,如圖:
2、終止容器
舉例:
該命令首先向容器發送
SIGTERM
信號,等待一段超時時間後(默認爲10秒),再發送SIGKILL
信號來終止容器:
[root@qll251 ~]# docker stop 021
021
3、強制終止容器
此外,還可以通過docker kill 直接發送
SIGKILL
信號強制終止容器。例如:
[root@qll251 ~]# docker kill 021
021
4、刪除所有停止狀態的容器
[root@qll251 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 1.1 GB
[root@qll251 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@qll251 ~]#
3、進入容器
當容器在後臺運行時,用戶是無法操作容器的。這個時候如果需要進入容器進行操作,推薦使用
exec
命令,語法格式如下:
例如,進入一個容器,並啓動一個bash:
[root@qll251 ~]# docker exec -it 021 /bin/bash
root@0215d56eaf7d:/#
通過指定
-it
參數保持標準輸入打開,並且分配一個僞終端。
進入容器後,我們可以進行操作,比如創建文件和列出當前運行進程:
4、刪除容器
例如,刪除處於終止狀態的容器:
默認情況下,docker rm
命令只能刪除處於終止或退出狀態的容器,並不能刪除處於運行狀態的容器。如果要直接刪除運行狀態的容器,可以添加-f
實現:
實際上,指定-f 參數時,Docker先發送SIGKILL信號給容器,終止其中的應用,之後強行刪除。
更多關於容器刪除的方法,參考文末本章命令小結
5、導入導出容器
docker的一大優勢就是可移植性
,容器可以隨意的進行導入導出操作。下面一起看下具體怎麼操作。
1、導出容器
將容器導出到一個文件中,可以使用docker export
,命令格式如下:
例如,將容器79b
導出到/data/myubuntu.tar
文件
[root@qll251 ~]# docker export 79b > /data/myubuntu.tar
[root@qll251 ~]# ls /data/
myubuntu.tar
[root@qll251 ~]#
注意:不管容器是否處於運行狀態,都可以將容器導出到一個文件。
2、導入容器
可以使用docker import
從容器快照文件中再導入爲鏡像,命令格式如下:
例如,使用docker import
將導出的myubuntu.tar
文件導入爲鏡像,並且重新指定標籤爲qinlulu/ubuntu:v1
,代碼如下:
還記得上一章節,我們講過docker load
載入鏡像嗎?花1分鐘回顧下:
兩者區別
1、docker load
的對象是鏡像文件
2、docker import
的對象是容器快照
3、用戶既可以使用docker load
導入鏡像文件到本地鏡像庫,也可以使用docker import
導入容器快照到本地鏡像庫。
4、兩者的區別在於,使用容器快照文件導入的鏡像將丟失所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像文件導入的鏡像將保存完整記錄,體積也要大。
5、此外,從容器快照文件導入鏡像時,可重新指定
標籤等元數據信息。
6、查看容器
1、查看容器詳細信息
上圖返回的是一個JSON格式,包含容器ID、創建時間、路徑、狀態、鏡像、配置等各項信息
2、查看容器內進程
這個命令類似於Linux系統中的top命令,查看容器中運行的進程信息
3、實時監控容器資源數據
docker stats
命令用來返回運行中的容器的實時數據流,包括CPU、內存、存儲、網絡等使用信息的實時統計信息。例如:
默認情況下,stats命令會每隔1秒鐘刷新一次內容,直到按下 Ctrl + c。如果不想持續監控,可以通過添加
--no-stream
參數 只輸出當前的狀態。
7、容器與宿主機之間的數據拷貝
老規矩,我們先下看官方給出的docker cp
用法。
可以看懂英文吧?我要囉嗦一句了,混跡技術圈,如果學不好英語,不說被淘汰,很可能將一直是“碼農”。當然,實在看不懂- -help 內容也不打緊,常用命令我都列舉出來啦,例如:)
1、將宿主機上的/data目錄拷貝至容器dba277的/test123目錄:
如上圖所示,宿主機上/data目錄下所有文件已拷貝到容器中,並且目錄重命名爲/test123
2、將容器dba277的/test123目錄拷貝到宿主機/tmp目錄下
本章命令小結
1、新建容器
docker create -it ubuntu:18.04
2、啓動容器
docker start “容器ID”
3、新建並啓動容器
1、以交互式模式新建容器
docker run -it ubuntu /bin/bash
2、以後臺方式運行容器
docker run -itd ubuntu /bin/bash
3、創建容器時指定主機名
docker run -itd --name test ubuntu:18.04 /bin/bash
4、容器運行5秒鐘後自動刪除容器
docker run -it --rm ubuntu:18.04 sleep 5
4、停止容器
1、暫停容器
docker pause '容器ID'
2、將容器恢復到運行狀態
docker unpause '容器ID'
3、終止容器
docker stop '容器ID'
4、強制終止容器
docker kill '容器ID'
5、進入容器
docker exec -it "容器ID" /bin/bash
6、刪除容器
1、刪除處於終止狀態的容器
docker rm '容器ID'
2、刪除運行中的容器(不建議操作)
docker rm -f '容器ID'
3、刪除所有停止狀態的容器
docker container prune
----其實也可以使用 docker rm `docker ps -aq`刪除所有未運行的容器
----舉一反三,那刪除本地鏡像庫的所有鏡像命令就是 docker rmi `docker images`呢(操作需謹慎!)
7、導入導出容器
1、導出容器
docker export 79b > myubuntu.tar
2、導入容器
docker import myubuntu.tar qinlulu/ubuntu:v1
8、查看容器
1、查看容器詳細信息
docker inspect '容器ID'
2、查看容器內進程
docker top '容器ID'
3、實時監控容器資源數據
docker stats '容器ID'
9、容器與宿主機之間的數據拷貝
1、將宿主機上的/data目錄拷貝至容器dba277的/test123目錄
docker cp /data dba277:/test123
2、將容器dba277的/test123目錄拷貝到宿主機/tmp目錄下
docker cp dba277:/test123 /tmp