天天看點

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

Docker基礎修煉3--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)檢視正在運作的容器

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 -

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

該指令的含義檢視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

root@783b46f5cddc:/usr/local/apache2# exit

exit

這個過程的作用給前面的案例是一樣的,隻不過這裡是進入到容器内部,然後列印目前目錄,然後在退出容器,傳回到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

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

2.8 停止容器指令

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

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

docker stop|kill 容器id或容器名

(1)停止容器

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

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

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

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

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

可以看到當容器運作時不能删除,需要添加-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鏡像,研究下鏡像内部的結構和原理

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.cnblogs.com/heimatengyun/p/12886651.html