前文講解了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三要素就還差倉庫了,下一篇講解倉庫相關理論和操作,敬請期待,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/8622.html
標籤:大數據
