溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Docker中容器的創(chuàng)建與啟停問題怎么解決

發(fā)布時(shí)間:2022-06-07 09:27:15 來源:億速云 閱讀:156 作者:zzz 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Docker中容器的創(chuàng)建與啟停問題怎么解決的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1. 鏡像和容器

看待鏡像和容器的一種方式是將它們類比成程序與進(jìn)程。一個(gè)進(jìn)程可以視為一個(gè)被執(zhí)行的應(yīng)用程序,同樣,一個(gè)Docker容器可以視為一個(gè)運(yùn)行中的Docker鏡像。

Docker中容器的創(chuàng)建與啟停問題怎么解決

如果大家熟悉面向?qū)ο笤?,看待鏡像和容器的另一種方法是將鏡像看作類而將容器看作對象。對象是類的具體實(shí)例,同樣,容器是鏡像的實(shí)例。用戶可以從單個(gè)鏡像創(chuàng)建多個(gè)容器,就像對象一樣,它們之間全都是相互隔離的。不論用戶在對象內(nèi)修改了什么,都不會(huì)影響類的定義——它們從根本上就是不同的東西。

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用來構(gòu)建容器的“構(gòu)建塊”)的數(shù)量、Docker使用的執(zhí)行驅(qū)動(dòng)和存儲(chǔ)驅(qū)動(dòng)(execution and storage driver),以及Docker的基本配置。

Docker是基于客戶端-服務(wù)器構(gòu)架的。它有一個(gè)docker程序,既能作為客戶端,也可以作為服務(wù)器端。作為客戶端時(shí),docker程序向Docker守護(hù)進(jìn)程發(fā)送請求(如請求返回守護(hù)進(jìn)程自身的信息),然后再對返回的請求結(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頁(即執(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)輸入保持打開。
利用docker run來創(chuàng)建并啟動(dòng)容器時(shí),Docker在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:
        ·檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載;
        ·利用鏡像創(chuàng)建一個(gè)容器,并啟動(dòng)該容器;
        ·分配一個(gè)文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫層;
        ·從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中;
        ·從網(wǎng)橋的地址池配置一個(gè)IP地址給容器;
        ·執(zhí)行用戶指定的應(yīng)用程序;
        ·執(zhí)行完畢后容器被自動(dòng)終止。

官方文檔上列出了docker run命令的所有標(biāo)志,此外還可以用命令docker help run查看這些標(biāo)志?;蛘?,也可以用Docker的man頁(也就是執(zhí)行man docker-run命令)。

接下來,我們告訴Docker基于什么鏡像來創(chuàng)建容器,示例中使用的是ubuntu鏡像。ubuntu鏡像是一個(gè)常備鏡像,也可以稱為“基礎(chǔ)”(base)鏡像,它由Docker公司提供,保存在Docker HubRegistry上??梢砸評buntu基礎(chǔ)鏡像(以及類似的fedora、debian、centos等鏡像)為基礎(chǔ),在選擇的操作系統(tǒng)上構(gòu)建自己的鏡像。到目前為止,我們基于此基礎(chǔ)鏡像啟動(dòng)了一個(gè)容器,并且沒有對容器增加任何東西。

首先Docker會(huì)檢查本地是否存在ubuntu鏡像,如果本地還沒有該鏡像的話,那么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è)用來和宿主機(jī)進(jìn)行通信的橋接網(wǎng)絡(luò)接口。最后,我們告訴Docker在新容器中要運(yùn)行什么命令,在本例中我們在容器中運(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用戶登錄到了新容器中,容器的ID f7cbdac22a02,乍看起來有些令人迷惑的字符串`。這是一個(gè)完整的Ubuntu系統(tǒng),可以用它來做任何事情。下面就來研究一下這個(gè)容器。首先,我們可以獲取該容器的主機(jī)名,如下:

root@f7cbdac22a02:/# hostname 
f7cbdac22a02

可以看到,容器的主機(jī)名就是該容器的ID。再來看看/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)。 再來看看容器的網(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

接下來嘗試安裝一個(gè)軟件包:

root@f7cbdac22a02:/# apt-get update && apt-get install vim

通過上述命令,就在容器中安裝了Vim編輯器軟件。 用戶可以繼續(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)行的容器,無論其正在運(yùn)行還是已經(jīng)停止。也可以通過--format標(biāo)志,進(jìn)一步控制顯示哪些信息,以及如何顯示這些信息

從該命令的輸出結(jié)果中我們可以看到關(guān)于這個(gè)容器的很多有用信息:ID、用于創(chuàng)建該容器的鏡像、容器最后執(zhí)行的命令、創(chuàng)建時(shí)間以及容器的退出狀態(tài)(在上面的例子中,退出狀態(tài)是0,因?yàn)槿萜魇峭ㄟ^正常的exit命令退出的)。我們還可以看到,每個(gè)容器都有一個(gè)名稱。 有3種方式可以唯一指代容器:短UUID(如f7cbdac22a02)、長UUID(如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名稱(如gray_cat)。

4. 容器命名

Docker會(huì)為我們創(chuàng)建的每一個(gè)容器自動(dòng)生成一個(gè)隨機(jī)的名稱。例如,上面我們剛剛創(chuàng)建的容器就被命名為gray_cat。如果想為容器指定一個(gè)名稱,而不是使用自動(dòng)生成的名稱,則可以用--name標(biāo)志來實(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è)合法的容器名稱只能包含以下字符:小寫字母a~z、大寫字母A~Z、數(shù)字 0~9、下劃線、圓點(diǎn)、橫線(如果用正則表達(dá)式來表示這些符號,就是[a-zA-Z0-9_.-])

在很多Docker命令中,都可以用容器的名稱來替代容器ID,后面我們將會(huì)看到。容器名稱有助于分辨容器,當(dāng)構(gòu)建容器和應(yīng)用程序之間的邏輯連接時(shí),容器的名稱也有助于從邏輯上理解連接關(guān)系。具體的名稱(如web、db)比容器ID和隨機(jī)容器名好記多了。我推薦大家都使用容器名稱,以更加方便地管理容器。 容器的命名必須是唯一的。如果試圖創(chuàng)建兩個(gè)名稱相同的容器,則命令將會(huì)失敗。如果要使用的容器名稱已經(jīng)存在,可以先用docker rm命令刪除已有的同名容器后,再來創(chuàng)建新的容器。

5.重啟容器

容器已經(jīng)停止了,我們可以用下面的命令重新啟動(dòng)一個(gè)已經(jīng)停止的容器,如下:

[root@localhost ~]# sudo docker start bob_the_container

除了容器名稱,也可以用容器ID來指定容器,

[root@localhost ~]# sudo docker start aa3f365f0f4e

也可以使用docker restart命令來重新啟動(dòng)一個(gè)容器。 這時(shí)運(yùn)行不帶-a標(biāo)志的docker ps命令,就應(yīng)該看到我們的容器已經(jīng)開始運(yùn)行了。 類似地,Docker也提供了docker create命令來創(chuàng)建一個(gè)容器,但是并不運(yùn)行它。這讓我們可以在自己的容器工作流中對其進(jìn)行精準(zhǔn)化的控制。

6. 附著到容器上

Docker容器重新啟動(dòng)的時(shí)候,會(huì)沿用docker run命令時(shí)指定的參數(shù)來運(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:/_#_

可能需要按下回車鍵才能進(jìn)入該會(huì)話。 如果退出容器的shell,容器會(huì)再次停止運(yùn)行。

容器是直接提供應(yīng)用服務(wù)的組件,也是Docker實(shí)現(xiàn)快速啟停和高效服務(wù)性能的基礎(chǔ)。 在生產(chǎn)環(huán)境中,因?yàn)槿萜髯陨淼妮p量級特性,推薦大家使用容器時(shí)在一組容器前引入HA(High Availability,高可靠性)機(jī)制。例如使用HAProxy工具來代理容器訪問,這樣在容器出現(xiàn)故障時(shí),可以快速切換到功能正常的容器。此外,建議通過指定合適的容器重啟策略,來自動(dòng)重啟退出的容器。

以上就是“Docker中容器的創(chuàng)建與啟停問題怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI