聊聊Docker中容器的創(chuàng)建與啟停問(wèn)題
1. 鏡像和容器
看待鏡像和容器的一種方式是將它們類(lèi)比成程序與進(jìn)程。一個(gè)進(jìn)程可以視為一個(gè)被執(zhí)行的應(yīng)用程序,同樣,一個(gè)Docker容器可以視為一個(gè)運(yùn)行中的Docker鏡像。

如果大家熟悉面向?qū)ο笤恚创R像和容器的另一種方法是將鏡像看作類(lèi)而將容器看作對(duì)象。對(duì)象是類(lèi)的具體實(shí)例,同樣,容器是鏡像的實(shí)例。用戶(hù)可以從單個(gè)鏡像創(chuàng)建多個(gè)容器,就像對(duì)象一樣,它們之間全都是相互隔離的。不論用戶(hù)在對(duì)象內(nèi)修改了什么,都不會(huì)影響類(lèi)的定義——它們從根本上就是不同的東西。
2. 新建并啟動(dòng)容器
首先,我們會(huì)查看Docker是否能正常工作,然后學(xué)習(xí)基本的Docker的工作流:創(chuàng)建并管理容器。我們將瀏覽容器的典型生命周期:從創(chuàng)建、管理到停止,直到最終刪除。 第一步,查看docker程序是否存在,功能是否正常:
[root@localhost ~]# sudo docker info Containers: 1 Images: 8 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 10 Execution Driver: native-0.2 Kernel Version: 3.13.0-43-generic Operating System: Ubuntu 14.04.2 LTS CPUs: 1 Total Memory: 994 MiB Name: riemanna ID: DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:GO3V:NDR7:YW6E:VFXT:FXHM WARNING: No swap limit support
在這里我們調(diào)用了docker可執(zhí)行程序的info命令,該命令會(huì)返回所有容器和鏡像(鏡像即是Docker用來(lái)構(gòu)建容器的“構(gòu)建塊”)的數(shù)量、Docker使用的執(zhí)行驅(qū)動(dòng)和存儲(chǔ)驅(qū)動(dòng)(execution and storage driver),以及Docker的基本配置。
Docker是基于客戶(hù)端-服務(wù)器構(gòu)架的。它有一個(gè)docker程序,既能作為客戶(hù)端,也可以作為服務(wù)器端。作為客戶(hù)端時(shí),docker程序向Docker守護(hù)進(jìn)程發(fā)送請(qǐng)求(如請(qǐng)求返回守護(hù)進(jìn)程自身的信息),然后再對(duì)返回的請(qǐng)求結(jié)果進(jìn)行處理。
現(xiàn)在,讓我們嘗試啟動(dòng)第一個(gè)Docker容器。我們可以使用docker run命令創(chuàng)建容器。 docker run命令提供了Docker容器的創(chuàng)建到啟動(dòng)的功能:
[root@localhost ~]# sudo docker run -i -t ubuntu /bin/bash Unable to find image 'ubuntu' locally ubuntu:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete d497ad3926c8: Pull complete ccb62158e970: Pull complete e791be0477f2: Pull complete 3680052c0f5c: Pull complete 22093c35d77b: Pull complete 5506de2b643b: Pull complete Status: Downloaded newer image for ubuntu:latest root@fcd78e1a3569:/#
官方文檔列出了完整的Docker命令列表,也可以使用docker help獲取這些命令。此外,還可以使用Docker的man頁(yè)(即執(zhí)行man docker-run)。
[root@localhost ~]# sudo docker run -i -t ubuntu /bin/bash
上述命令中:
上述命令中:
-t 選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,
-i 則讓容器的標(biāo)準(zhǔn)輸入保持打開(kāi)。
利用docker run來(lái)創(chuàng)建并啟動(dòng)容器時(shí),Docker在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:
·檢查本地是否存在指定的鏡像,不存在就從公有倉(cāng)庫(kù)下載;
·利用鏡像創(chuàng)建一個(gè)容器,并啟動(dòng)該容器;
·分配一個(gè)文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫(xiě)層;
·從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中;
·從網(wǎng)橋的地址池配置一個(gè)IP地址給容器;
·執(zhí)行用戶(hù)指定的應(yīng)用程序;
·執(zhí)行完畢后容器被自動(dòng)終止。
官方文檔上列出了docker run命令的所有標(biāo)志,此外還可以用命令docker help run查看這些標(biāo)志?;蛘撸部梢杂肈ocker的man頁(yè)(也就是執(zhí)行man docker-run命令)。
接下來(lái),我們告訴Docker基于什么鏡像來(lái)創(chuàng)建容器,示例中使用的是ubuntu鏡像。ubuntu鏡像是一個(gè)常備鏡像,也可以稱(chēng)為“基礎(chǔ)”(base)鏡像,它由Docker公司提供,保存在Docker HubRegistry上??梢砸評(píng)buntu基礎(chǔ)鏡像(以及類(lèi)似的fedora、debian、centos等鏡像)為基礎(chǔ),在選擇的操作系統(tǒng)上構(gòu)建自己的鏡像。到目前為止,我們基于此基礎(chǔ)鏡像啟動(dòng)了一個(gè)容器,并且沒(méi)有對(duì)容器增加任何東西。
首先Docker會(huì)檢查本地是否存在ubuntu鏡像,如果本地還沒(méi)有該鏡像的話,那么Docker就會(huì)連接官方維護(hù)的Docker Hub Registry,查看Docker Hub中是否有該鏡像。Docker一旦找到該鏡像,就會(huì)下載該鏡像并將其保存到本地宿主機(jī)中。 隨后,Docker在文件系統(tǒng)內(nèi)部用這個(gè)鏡像創(chuàng)建了一個(gè)新容器。該容器擁有自己的網(wǎng)絡(luò)、IP地址,以及一個(gè)用來(lái)和宿主機(jī)進(jìn)行通信的橋接網(wǎng)絡(luò)接口。最后,我們告訴Docker在新容器中要運(yùn)行什么命令,在本例中我們?cè)谌萜髦羞\(yùn)行/bin/bash命令啟動(dòng)了一個(gè)Bash shell。 當(dāng)容器創(chuàng)建完畢之后,Docker就會(huì)執(zhí)行容器中的/bin/bash命令,這時(shí)就可以看到容器內(nèi)的shell了,如下:
root@f7cbdac22a02:/#
3. 使用第一個(gè)容器
現(xiàn)在,我們已經(jīng)以root用戶(hù)登錄到了新容器中,容器的ID f7cbdac22a02,乍看起來(lái)有些令人迷惑的字符串`。這是一個(gè)完整的Ubuntu系統(tǒng),可以用它來(lái)做任何事情。下面就來(lái)研究一下這個(gè)容器。首先,我們可以獲取該容器的主機(jī)名,如下:
root@f7cbdac22a02:/# hostname f7cbdac22a02
可以看到,容器的主機(jī)名就是該容器的ID。再來(lái)看看/etc/hosts文件內(nèi)容:
root@f7cbdac22a02:/# cat /etc/hosts 172.17.0.4 f7cbdac22a02 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Docker已在hosts文件中為該容器的IP地址添加了一條主機(jī)配置項(xiàng)。 再來(lái)看看容器的網(wǎng)絡(luò)配置情況,如下:
root@f7cbdac22a02:/# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff inet 172.17.0.4/16 scope global eth0 inet6 fe80::1450:3aff:feb6:f2cc/64 scope link valid_lft forever preferred_lft forever
可以看到,這里有l(wèi)o的環(huán)回接口,還有IP為172.17.0.4的標(biāo)準(zhǔn) eth0網(wǎng)絡(luò)接口,和普通宿主機(jī)是完全一樣的。我們還可以查看容器中運(yùn)行的進(jìn)程,如下:
root@f7cbdac22a02:/# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 18156 1936 ? Ss May30 0:00 /bin/bash root 21 0.0 0.0 15568 1100 ? R+ 02:38 0:00 ps -aux
接下來(lái)嘗試安裝一個(gè)軟件包:
root@f7cbdac22a02:/# apt-get update && apt-get install vim
通過(guò)上述命令,就在容器中安裝了Vim編輯器軟件。 用戶(hù)可以繼續(xù)在容器中做任何自己想做的事情。當(dāng)所有工作都結(jié)束時(shí),輸入exit,就可以返回到Ubuntu宿主機(jī)的命令行提示符了。 但是,容器現(xiàn)在已經(jīng)停止運(yùn)行了!只有在指定的/bin/bash命令處于運(yùn)行狀態(tài)的時(shí)候,我們的容器也才會(huì)相應(yīng)地處于運(yùn)行狀態(tài)。一旦退出容器,/bin/bash命令也就結(jié)束了,這時(shí)容器也隨之停止了運(yùn)行。
但容器仍然是存在的,可以用docker ps -a命令查看當(dāng)前系統(tǒng)中容器的列表,如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cd57c2cdf7f ubuntu:14.04 "/bin/bash" A minute Exited gray_cat
默認(rèn)情況下,當(dāng)執(zhí)行docker ps命令時(shí),只能看到正在運(yùn)行的容器。如果指定-a標(biāo)志的話,那么docker ps命令會(huì)列出所有容器,包括正在運(yùn)行的和已經(jīng)停止的。 注意:也可以為docker ps命令指定-l標(biāo)志,列出最后一個(gè)運(yùn)行的容器,無(wú)論其正在運(yùn)行還是已經(jīng)停止。也可以通過(guò)--format標(biāo)志,進(jìn)一步控制顯示哪些信息,以及如何顯示這些信息
從該命令的輸出結(jié)果中我們可以看到關(guān)于這個(gè)容器的很多有用信息:ID、用于創(chuàng)建該容器的鏡像、容器最后執(zhí)行的命令、創(chuàng)建時(shí)間以及容器的退出狀態(tài)(在上面的例子中,退出狀態(tài)是0,因?yàn)槿萜魇峭ㄟ^(guò)正常的exit命令退出的)。我們還可以看到,每個(gè)容器都有一個(gè)名稱(chēng)。 有3種方式可以唯一指代容器:短UUID(如f7cbdac22a02)、長(zhǎng)UUID(如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名稱(chēng)(如gray_cat)。
4. 容器命名
Docker會(huì)為我們創(chuàng)建的每一個(gè)容器自動(dòng)生成一個(gè)隨機(jī)的名稱(chēng)。例如,上面我們剛剛創(chuàng)建的容器就被命名為gray_cat。如果想為容器指定一個(gè)名稱(chēng),而不是使用自動(dòng)生成的名稱(chēng),則可以用--name標(biāo)志來(lái)實(shí)現(xiàn),如下:
[root@localhost ~]# sudo docker run --name bob_the_container -i -t ubuntu /bin/bash root@aa3f365f0f4e:/# exit
上述命令將會(huì)創(chuàng)建一個(gè)名為bob_the_container的容器。一個(gè)合法的容器名稱(chēng)只能包含以下字符:小寫(xiě)字母a~z、大寫(xiě)字母A~Z、數(shù)字 0~9、下劃線、圓點(diǎn)、橫線(如果用正則表達(dá)式來(lái)表示這些符號(hào),就是[a-zA-Z0-9_.-])
在很多Docker命令中,都可以用容器的名稱(chēng)來(lái)替代容器ID,后面我們將會(huì)看到。容器名稱(chēng)有助于分辨容器,當(dāng)構(gòu)建容器和應(yīng)用程序之間的邏輯連接時(shí),容器的名稱(chēng)也有助于從邏輯上理解連接關(guān)系。具體的名稱(chēng)(如web、db)比容器ID和隨機(jī)容器名好記多了。我推薦大家都使用容器名稱(chēng),以更加方便地管理容器。 容器的命名必須是唯一的。如果試圖創(chuàng)建兩個(gè)名稱(chēng)相同的容器,則命令將會(huì)失敗。如果要使用的容器名稱(chēng)已經(jīng)存在,可以先用docker rm命令刪除已有的同名容器后,再來(lái)創(chuàng)建新的容器。
5.重啟容器
容器已經(jīng)停止了,我們可以用下面的命令重新啟動(dòng)一個(gè)已經(jīng)停止的容器,如下:
[root@localhost ~]# sudo docker start bob_the_container
除了容器名稱(chēng),也可以用容器ID來(lái)指定容器,
[root@localhost ~]# sudo docker start aa3f365f0f4e
也可以使用docker restart命令來(lái)重新啟動(dòng)一個(gè)容器。 這時(shí)運(yùn)行不帶-a標(biāo)志的docker ps命令,就應(yīng)該看到我們的容器已經(jīng)開(kāi)始運(yùn)行了。 類(lèi)似地,Docker也提供了docker create命令來(lái)創(chuàng)建一個(gè)容器,但是并不運(yùn)行它。這讓我們可以在自己的容器工作流中對(duì)其進(jìn)行精準(zhǔn)化的控制。
6. 附著到容器上
Docker容器重新啟動(dòng)的時(shí)候,會(huì)沿用docker run命令時(shí)指定的參數(shù)來(lái)運(yùn)行,因此我們的容器重新啟動(dòng)后會(huì)運(yùn)行一個(gè)交互式會(huì)話shell。此外,也可以用docker attach命令,重新附著到該容器的會(huì)話上,如下:
[root@localhost ~]# sudo docker attach bob_the_container
也可以使用容器ID,重新附著到容器的會(huì)話上,如下:
[root@localhost ~]# sudo docker attach aa3f365f0f4e
現(xiàn)在,又重新回到了容器的Bash提示符,如下:
root@aa3f365f0f4e:/_#_
可能需要按下回車(chē)鍵才能進(jìn)入該會(huì)話。 如果退出容器的shell,容器會(huì)再次停止運(yùn)行。
容器是直接提供應(yīng)用服務(wù)的組件,也是Docker實(shí)現(xiàn)快速啟停和高效服務(wù)性能的基礎(chǔ)。 在生產(chǎn)環(huán)境中,因?yàn)槿萜髯陨淼妮p量級(jí)特性,推薦大家使用容器時(shí)在一組容器前引入HA(High Availability,高可靠性)機(jī)制。例如使用HAProxy工具來(lái)代理容器訪問(wèn),這樣在容器出現(xiàn)故障時(shí),可以快速切換到功能正常的容器。此外,建議通過(guò)指定合適的容器重啟策略,來(lái)自動(dòng)重啟退出的容器。
到此這篇關(guān)于Docker中容器的創(chuàng)建與啟停的文章就介紹到這了,更多相關(guān)docker容器創(chuàng)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker容器自啟動(dòng)的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker容器自啟動(dòng)的實(shí)現(xiàn)方法,詳細(xì)的介紹了Docker的 Restart policy命令,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-09-09Docker部署Mysql,.Net6,Sqlserver等容器
這篇文章介紹了Docker部署Mysql,.Net6,Sqlserver等容器的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12docker安裝elastic?search的詳細(xì)過(guò)程
這篇文章主要介紹了docker安裝elastic?search的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Idea通過(guò)docker compose?發(fā)布項(xiàng)目的過(guò)程
這篇文章主要介紹了Idea結(jié)合docker-compose發(fā)布項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08詳解如何使用Docker快速部署ELK環(huán)境(最新5.5.1版本)
這篇文章主要介紹了詳解如何使用Docker快速部署ELK環(huán)境(最新5.5.1版本),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08解決docker安裝后運(yùn)行hello-world報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決docker安裝后運(yùn)行hello-world報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Docker?Compose中如何限制容器的CPU和內(nèi)存使用
這篇文章主要為大家介紹了Docker?Compose中限制容器的CPU和內(nèi)存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05