作者介紹:簡歷上沒有一個精通的運維工程師。希望大家多多關注作者,下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。
我們在上一章,講了虛擬化,虛擬化是把硬件虛擬化,然后創建出來的虛擬機完全隔離,而Docker則是軟件(內核)虛擬化,他的隔離性會低于虛擬機。我們將通過3-4周來講解Docker相關內容,由于涉及到內容較多,就不一一列出來具體的細節,主要從以下幾個方面來講解:
Docker基本情況
Docker基本命令
Dockerfile
Docker鏡像
Docker倉庫
Docker原理(本小節屬于)
Docker網絡&存儲&日志
Docker-Compose
Docker番外篇
我們經過前面兩小節介紹docker的操作命令,只要熟練掌握這些命令,實際上我們已經可以掌握容器的運行,但是如果我一個容器無法啟動或者啟動失敗,我們應該怎么去排錯呢?
所以我們需要對docker的原理有一定的理解,這里我們先介紹docker的運行原理之一。
在講解docker的運行原理之前,我們先來講解前臺進程和后臺進程。在 Linux 系統中,進程可以根據其運行方式分為前臺進程和后臺進程。理解這兩個概念有助于更好地管理和控制系統的運行狀態。下面是關于這兩個概念的詳細解釋:
前臺進程 (Foreground Process)
定義:前臺進程是指當前與終端交互的進程。用戶可以直接看到前臺進程的輸出,并可以向其發送輸入。
前臺進程通常會阻塞終端,這意味著用戶不能在前臺進程運行期間輸入其他命令,除非前臺進程結束或被暫停。
示例:在終端中運行 ping 127.0.0.1 命令,ping 命令會持續輸出結果,直到用戶按下 Ctrl+C 終止它(適合linux,win默認4個包就會退出)。
后臺進程 (Background Process)
定義:后臺進程是指在后臺運行的進程,它們不與終端直接交互。用戶可以在后臺進程運行的同時繼續使用終端執行其他命令。
示例:使用 & 符號將命令放到后臺運行。例如,運行 sleep 100 &,sleep 命令將在后臺運行,終端立即返回,用戶可以繼續輸入其他命令。
Docker的啟動
通過前面的學習,我們了解docker的隔離性實際上比虛擬機差,它并沒有從操作系統上進行隔離,而是通過Linux上的namespace特性進行的邏輯隔離(這個后面會單獨講)。
所以我們docker里面的進程實際上就是在docker子進程下面啟動了一個普通進程(在操作系統里面也可以看到這個進程)。如果這個進程退出,則這個容器就會退出,這也就是我們的docker里面必須要有一個前臺進程的原因。也是為后面的Dockerfile提前做好準備,避免我們制作的鏡像出現無法啟動情況。
下面我們講通過例子來講解這個問題,這個鏡像官方的centos7的鏡像,只有3層。
按照我們前面講解的命令,我們通過后臺啟動它,我們雖然啟動這個容器,但是這個容器啟動以后立即就退出,并沒有按照我們的預期在后臺持續運行。
[root@localhost ~]# docker run -d centos:7
88c8b9abd7000fa2366a10bd3d1caa131daffcb462094908baffb4040a1c2cd6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88c8b9abd700???centos:7???"/bin/bash"???7?seconds?ago???Exited?(0)?6?seconds?ago?????????????funny
我們換一種方式來啟動它,使用了-itd參數來啟動來,它就是按照我們的預期在后臺運行。
[root@localhost ~]# docker run -itd centos:7
c16e503b7ddafe655403fb23718b1cd638d13d30f9924f952a3e34e2cc1d065d
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c16e503b7dda???centos:7???"/bin/bash"???4?seconds?ago????????Up?4?seconds??????????????????????????????peaceful_tharp
我們再換一個nginx的鏡像,這個鏡像雖然tag被我修改過,但是它也是docker的官方鏡像。
[root@localhost ~]# docker run -d 192.168.31.43:5000/nginx
d664641bef7b6fcea5941efd6e3c38b8f13f6ac3f33181aa40b460fed51b11ca
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d664641bef7b???192.168.31.43:5000/nginx???"/docker-entrypoint.…"???3?seconds?ago???Up?3?seconds?????????????????80/tcp????elastic_taussig
[root@localhost ~]# docker run -itd 192.168.31.43:5000/nginx
38dfe0c1fea8fd643f4abb5ae0b7c5fa9efdda2eb84c47ed0ea2556b801067d7
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38dfe0c1fea8???192.168.31.43:5000/nginx???"/docker-entrypoint.…"???2?seconds?ago????Up?2?seconds?????????????????80/tcp????happy_bhabha
可以看到無論我們無論是使用-itd 還是-d?它都可以按照我們預期的方式在后臺持續運行,這個是為什么呢?
通過這個對比,讓我們了解到docker run的參數和不同的鏡像其實相關聯,不同的鏡像是可以匹配不同的參數,這個就需要對鏡像有一個基本的認識,這里簡單的分類下:
1.操作系統&環境鏡像
比如centos,ubuntu,jdk等類型的鏡像
2.服務類操作系統
比如nginx,tomcat,mysql等提高具體服務的鏡像
3.自我制作的鏡像
就需要根據自己需要來實現,規則也可以參考上面兩種。
根據前面信息,我們也就可以根據不同的鏡像輸入不同的運行命令,確保他是可以正常啟動,而不會出現啟動及退出。
運維小路
一個不會開發的運維!一個要學開發的運維!一個學不會開發的運維!歡迎大家騷擾的運維!