前文講解了Docker鏡像的原理和常用命令,本文繼續通過官方的Apache鏡像演示Docker容器相關的常用操作及命令。 ...
前文講解了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三要素就還差倉庫了,下一篇講解倉庫相關理論和操作,敬請期待。