Docker基礎修煉3--Docker容器及常用命令

黑馬騰雲發表於2020-05-14

前文講解了Docker映象的原理和常用命令,本文繼續通過官方的Apache映象演示Docker容器相關的常用操作及命令。

我之前的Linux入門系列文章中“linux入門系列18--web服務之apache服務1”,演示了在CentOS7下安裝和使用Apache服務,本次我們仍然採用官方的Apache映象來進行演示,通過這個案例,大家自行對比這兩種方式的不同,從而更加深刻理解Docke能幹什麼,以及Docker帶來的好處。

接下來我們就來演示下容器如何建立、如何停止、如何刪除等操作。

一、Docker容器簡介

容器是Docker中的另外一個核心概念,容器是映象的一個執行例項。

Docker映象是靜態的,只有從Docker映象建立容器並執行起來,容器內的程式會執行,從而完成特定的功能。

我們要完成業務功能的程式就是在容器中執行。映象本身是靜態的只讀檔案,而容器帶有執行時所需的可寫檔案層,同時容器內的應用程式處於執行狀態。

通過下邊的演示,將會理解的更加深刻。

二、Docker容器常用命令

2.1 apache映象準備

我們後續的演示是基於Docker Hub上官方提供的apache映象進行。

映象名稱為httpd,該映象並不包含php的環境只能執行靜態的HTML頁面,因此如果你是想執行php的動態網站則需要選擇PHP映象,而本文只是為了演示容器的相關操作,因此採用靜態頁面即可。

[root@docker ~]# docker pull httpd:2.4
2.4: Pulling from library/httpd
68ced04f60ab: Pull complete 
35d35f1e0dc9: Pull complete 
8a918bf0ae55: Pull complete 
d7b9f2dbc195: Pull complete 
d56c468bde81: Pull complete 
Digest: sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fb
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               2.4                 c5a012f9cf45        2 days ago          165MB

下載完成後我們可以看到httpd映象大小為165M,裡邊究竟包含了什麼內容呢?文章最後我們再來仔細分析一下。

2.2 建立容器並後臺執行

映象下載完成後,就需要通過docker run命令建立容器。

語法:

docker run [選項] 映象名稱 [命令] [引數]

選項很多,可以執行通過幫助命令進行檢視,以下列出最常用的幾個選項

選項 作用
--name 指定容器的名稱
-d 容器後臺執行,不在控制檯列印訊息
-i 即--interactive,互動式執行
-t 分配偽終端
-p 指定宿主機與容器埠的對映,宿主機埠:容器內埠
-P 指定宿主機與容器埠對映,宿主機埠隨機指定

其中-it引數和-d引數一般不同時使用,並且代表了兩種啟動容器的不同方式:互動式啟動容器守護式啟動容器

所謂互動式啟動就是在容器啟動後直接進入容器,並會自動分配一個偽終端,可以在容器內執行各種命令;而守護式啟動容器則是容器啟動後無需進入容器,容器在後臺執行,默默的提供服務。

至於如何選擇使用哪一種方式就看是否需要進入容器,如果要進入就選擇互動式,如果只是希望容器後臺執行提供服務那就選擇守護式

接下來通過-d引數,以守護程式方式建立基於httpd映象的容器並後臺執行

[root@docker ~]# docker run -d --name mywebsit -p 8888:80 httpd:2.4
783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09
[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED   STATUS   PORTS   NAMES
783b46f5cddc  httpd:2.4   "httpd-foreground"  6 seconds ago   Up 4 seconds        0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]

只需要做這一步操作,基於Apache的web環境就搭建好了,此時在CentOS7上就可以通過瀏覽器訪問剛才搭建的基於apahce的網站了。

在這裡插入圖片描述

如果配置了防火牆,也可以在宿主機進行訪問。

在這裡插入圖片描述

接下來就可以修改容器內網站目錄裡的資料,替換為自己的web頁面即可。輕輕鬆鬆就搭建了一個apache的web靜態網站,這是不是很方便呢?甚至都無須配置任何環境。遷移也非常方便,比如想換到另外一臺主機執行該網站,也只需要下載該映象,然後run起來即可。

這就是docker的強大之處,還有很多更強大的功能,後續慢慢演示。

在這裡插入圖片描述

說明一下我本地的環境,大家一定要理清楚物理機、虛擬機器、容器之間的關係。我本地物理機系統是win10,在其上裝了VMware虛擬機器,在虛擬機器中建立了一個Centos7的例項,然後在其中安裝Docker,並執行mywebsite容器。因為我本地沒有裝Centos7,所以在虛擬機器中虛擬一個來進行演示,當然你也可以直接在windows上裝docker或直接在本地的centos上安裝docker。

外部訪問是訪問在run容器是指定對映到的Centos7的宿主機埠8888,而非mywebsite容器的80埠。

特別注意:此處之所以採用-d在後臺以守護程式的方式執行容器,原因就是當一個容器沒有前臺程式執行的時候,建立容器後立馬就會停止。所以你可以用互動式的方式建立一個容器試試,docker run -it --name mywebsit1 -p 8888:80 httpd:2.4 ,建立後你用docker ps命令檢視根本看不到容器,用docker ps -a命令檢視,你就會發現容器建立後,短暫啟動後立馬就停止了,就是這個原因。

2.3 檢視容器命令

檢視本地有哪些正在執行的容器,或者是曾經建立過的容器可以通過docker ps命令

語法

docker ps [選項]

常用引數

引數 作用
-a --all,檢視所有容器,預設情況下只顯示正在執行的容器
-l --latest,檢視最近建立的容器
-n 顯示最後建立的n個容器
--no-trunc 不截斷顯示

案例:

(1)檢視正在執行的容器

[root@docker ~]# docker ps
CONTAINER ID    IMAGE     COMMAND     CREATED  STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# 

可以看到只有剛才建立的mywebsit容器在執行。

2.4 在容器外部檢視容器資訊

2.4.1 檢視容器日誌命令

語法

docker logs [選項] 容器名或id

常用引數

引數 作用
-f 動態跟蹤列印日誌資訊,一旦有新日誌會繼續列印
-t 在每行日誌前面列印出時間
--tail 指定顯示的行數

案例

(1)檢視mywebsit的日誌,只顯示2行

[root@docker ~]# docker logs -t --tail 2 mywebsit
2020-02-29T03:09:57.654372509Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
2020-02-29T03:09:57.854284777Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
[root@docker ~]# 
2.4.2 檢視容器內程式命令

語法

docker top

案例

(1)檢視mywebsit內部的程式

[root@docker ~]# docker top mywebsit
UID      PID     PPID    C     STIME     TTY       TIME      CMD
root     3673    3655    0     10:29     pts/0     00:00:01  httpd -DFOREGROUND
bin      3708    3673    0     10:29     pts/0     00:00:00  httpd -DFOREGROUND
...省略部分輸出

此命令類似於Linux下的top命令。

2.4.3 檢視容器內部細節

語法

docker inspect 容器名稱或id

案例

(1)檢視mywebsit容器內部資訊

[root@docker ~]# docker inspect mywebsit
...省略輸出

由於輸出內容太多就不貼上了。

執行命令後將得到一個詳細描述容器資訊的JSON字串物件,該物件中包含了容器的詳細資訊,包含容器埠對映、掛載資訊、卷資訊、網路ip等資訊。

2.5 退出容器命令

如果進入了容器,退出方式有如下兩種:

exit命令

按快捷鍵:ctrl+p+q

2.6 進入容器內部與之互動

進入正在執行的容器並以命令列互動

2.6.1 docker exec命令

採用docker exec命令可以進入容器或不進入容器直接執行命令

語法

docker exec [選項] 容器名或id 命令 [引數...]

選項與docker run命令類似,也有-itd等引數。

用此命令進入容器後,用exit命令或快捷鍵退出容器後,容器不會停止。

案例

(1)不進入容器直接執行命令

[root@docker ~]# docker exec -it mywebsit pwd
/usr/local/apache2
[root@docker ~]# 

該命令的含義檢視mywebsit容器內的當前目錄,可以看到命令執行結束後我們沒沒有進入到容器內部。

pwd是linux的命令,但此處為何能執行呢?原因是httpd映象是由debian基映象繼承而來,大家知道debian也是linux的一個發行版本,因此該容器就有debian的功能。簡單說就是你可以認為mywebsit容器就是跑在docker上的一個小linux系統。

(2)進入容器執行命令

[root@docker ~]# docker exec -it mywebsit /bin/bash
root@783b46f5cddc:/usr/local/apache2# pwd
/usr/local/apache2
root@783b46f5cddc:/usr/local/apache2# exit
exit
[root@docker ~]# 

這個過程的作用給前面的案例是一樣的,只不過這裡是進入到容器內部,然後列印當前目錄,然後在退出容器,返回到centos7宿主機。

通過這兩個案例的對比,應該很清楚他們的區別了吧。

2.6.2 docker attach命令

語法

docker attach [選項] 容器名或id

用此命令重新進入容器,進入容器後如果用exit命令退出,則容器會停止。

2.7 容器與宿主機之間資料拷貝

docker cp命令可以實現宿主機與主機之間的資料拷貝,即使是容器停止的情況下也可以執行拷貝操作。

語法

docker cp 容器id:容器內路徑 宿主機路徑

案例

(1)修改容器內的首頁內容

首先:httpd映象網站的目錄為:/usr/local/apache2/htdocs/index.html

其次:由於httpd映象基於debian製作,內部並沒有包含vi/vim等工具。

再次:正好可以用docker cp演示宿主機與容器之間檔案的相互拷貝。

因此我們將網頁檔案拷貝到宿主機然後修改後在拷貝回容器網站目錄下,已達到修改首頁的目的。(在後續的講解中也可以通過資料卷的方式將網站目錄對映到宿主機上實現共享和修改)

[root@docker ~]# docker cp mywebsit:/usr/local/apache2/htdocs/index.html /
[root@docker ~]# ll /index.html 
-rw-r--r-- 1 root root 45 Jun 12  2007 /index.html
[root@docker ~]# echo "my websit is updating">/index.html
[root@docker ~]# cat /index.html 
my websit is updating
[root@docker ~]# docker cp /index.html mywebsit:/usr/local/apache2/htdocs/index.html
[root@docker ~]# 

再次在瀏覽器中檢視網頁,就會發現已經被修改過了。

2.8 停止容器命令

停止容器可以通過stop和kill兩個命令

kill是強制停止容器,stop會稍微過一小會停止容器,二者都可以指定容器停止前等待的時間。

docker stop|kill 容器id或容器名

案例

(1)停止容器

[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS  PORTS   NAMES
783b46f5cddc   httpd:2.4    "httpd-foreground"   6 hours ago  Up 21 minutes  0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# docker stop mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID  IMAGE   COMMAND   CREATED   STATUS   PORTS  NAMES
[root@docker ~]# 

2.9 啟動容器命令

可以通過start或restart啟動或重啟容器

語法

docker start|restart 容器id或容器名

案例

(1)啟動停止的容器

[root@docker ~]# docker ps -a
CONTAINER ID  IMAGE  COMMAND   CREATED    STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Exited (0) 2 minutes ago                       mywebsit
[root@docker ~]# docker start mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID    IMAGE   COMMAND   CREATED    STATUS   PORTS   NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Up 1 second         0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]#  

可以看到剛停止的mywebsit容器為exited狀態,重啟後又重新執行起來。

2.10 刪除容器命令

語法

docker rm [選項] 容器名或id

常用選項

選項 作用
-f --forece,強制刪除,當容器在執行時只能強制刪除
-v --vomumes,刪除資料卷

案例

(1)刪除正在執行容器

[root@docker ~]# docker rm mywebsit
Error response from daemon: You cannot remove a running container 783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09. Stop the container before attempting removal or force remove
[root@docker ~]# docker rm -f mywebsit
mywebsit
[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED  STATUS   PORTS  NAMES
[root@docker ~]# 

可以看到當容器執行時不能刪除,需要新增-f引數強制刪除。

(2)強制刪除所有容器

慎用,僅供演示,他會刪除所有的容器,包括正在執行的和已經停止的。

[root@docker ~]# docker rm -f $(docker ps -aq) 
3d228a470c53
[root@docker ~]# docker ps 
CONTAINER ID   IMAGE    COMMAND    CREATED    STATUS   PORTS   NAMES
[root@docker ~]#

上邊這個刪除語句也可以寫為:docker ps -a -q | xargs docker rm

三、容器內部窺探

以上基於httpd映象建立了容器進行各種容器操作的演示,接下來我們在通過centos映象,研究下映象內部的結構和原理

[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID        CREATED           SIZE
centos        latest    470671670cac    6 weeks ago       237MB

如果你本地還沒有centos進行,先用docker pull命令下載到本地,接下來我們用它來建立一個名為mycentos的容器,然後進入容器檢視結構

[root@docker ~]# docker run -it --name mycentos centos
[root@bda9ff3abfd9 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@bda9ff3abfd9 /]# pwd
/
[root@bda9ff3abfd9 /]# cat /etc/redhat-release 
CentOS Linux release 8.1.1911 (Core) 
[root@bda9ff3abfd9 /]# 

進入容器後,我們可以看到,其實它就是執行著的一個centos系統,裡邊可以執行各種centos命令,也可以檢視到核心版本。

如果你想象力在擴充套件一下,那很容易想到,映象其實就是把各種作業系統環境以及我們執行所需要的軟體包打包在一起,然後上傳到倉庫中,需要的時候直接pull下來,在執行run命令建立容器即可。這也正是我們前二篇文章反覆提到的內容,如果現在在返回去看之前的文章,應該會有更深刻的理解。

本文演示完容器相關操作命令後,docker三要素就還差倉庫了,下一篇講解倉庫相關理論和操作,敬請期待。

相關文章