應用容器引擎-Docker

yuan發表於2023-01-31

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows作業系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
@Author:Akai-yuan
@更新時間:2023/1/31

1.為什麼要有Docker

在伺服器配置一個應用的執行環境,要安裝各種軟體。例如一個專案通常需要Java/RabbitMQ/MySQL/JDBC驅動包等。安裝和配置非常麻煩,而且不能跨平臺。假如我們是在 Windows 上安裝的這些環境,到了 Linux 又得重新裝。況且就算不跨作業系統,換另一臺同樣作業系統的伺服器,要移植應用也是非常麻煩。
Linux容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用打成映象,透過映象成為執行在Docker容器上面的例項,而 Docker容器在任何作業系統上都是一致的,這就實現了跨平臺、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。

2.Docker與傳統虛擬機器的不同

  1. 傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程式;
  2. 容器內的應用程式直接執行於宿主的核心,容器內沒有自己的核心且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
  3. 每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程式不會相互影響,能區分計算資源。

3.基本組成

3.1 映象

  • 是一種輕量級、可執行的獨立軟體包,它包含執行某個軟體所需的所有內容,我們把應用程式和配置依賴打包好形成一個可交付的執行環境(包括程式碼、執行時需要的庫、環境變數和配置檔案等),這個打包好的執行環境就是image映象檔案。 只有透過這個映象檔案才能生成Docker容器例項(類似Java中new出來一個物件)。
  • Docker 映象(Image)就是一個只讀的模板。映象可以用來建立 Docker 容器,一個映象可以建立很多容器。它也相當於是一個root檔案系統。比如官方映象 centos:7 就包含了完整的一套 centos:7 最小系統的 root 檔案系統。相當於容器的“原始碼”,docker映象檔案類似於Java的類别範本,而docker容器例項類似於java中new出來的例項物件。

3.2 容器

  1. 從物件導向角度Docker 利用容器(Container)獨立執行的一個或一組應用,應用程式或服務執行在容器裡面,容器就類似於一個虛擬化的執行環境容器是用映象建立的執行例項。就像是Java中的類和例項物件一樣,映象是靜態的定義,容器是映象執行時的實體。容器為映象提供了一個標準的和隔離的執行環境,它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺
  2. 從映象容器角度可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程式空間、使用者空間和網路空間等)和執行在其中的應用程式。

3.3 倉庫

倉庫(Repository)是集中存放映象檔案的場所。 類似於Maven倉庫,存放各種jar包的地方;github倉庫,存放各種git專案的地方;Docker公司提供的官方registry被稱為Docker Hub,存放各種映象模板的地方。 倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是DockerHub,存放了數量龐大的映象供使用者下載。國內的公開倉庫包括阿里雲 、網易雲等。

4.docker為什麼比vm虛擬機器快

(1)docker有著比虛擬機器更少的抽象層   **
由於docker
不需要Hypervisor(虛擬機器)實現硬體資源虛擬化,執行在docker容器上的程式直接使用的都是實際物理機的硬體資源。因此在CPU、記憶體利用率上docker將會在效率上有明顯優勢
(2)docker利用的是宿主機的核心,而不需要載入作業系統OS核心   **
當新建一個容器時,docker
不需要和虛擬機器一樣重新載入一個作業系統核心
。進而避免引尋、載入作業系統核心返回等比較費時費資源的過程,當新建一個虛擬機器時,虛擬機器軟體需要載入OS,返回新建過程是分鐘級別的。而docker由於直接利用宿主機的作業系統,則省略了返回過程,因此新建一個docker容器只需要幾秒鐘

5.docker常用啟動類命令

5.1 幫助啟動類命令

啟動docker: systemctl start docker
停止docker: systemctl stop docker
重啟docker: systemctl restart docker
檢視docker狀態: systemctl status docker
開機啟動: systemctl enable docker
檢視docker概要資訊: docker info
檢視docker總體幫助文件: docker --help
檢視docker命令幫助文件: docker 具體命令 --help

5.2 映象命令

列出本地主機上的映象: docker images [OPTIONS]

OPTIONS說明:
-a :列出本地所有的映象(含歷史映像層)
-q :只顯示映象ID。

選項說明:
REPOSITORY:表示映象的倉庫源 ** TAG:映象的標籤版本號
IMAGE ID:映象ID CREATED:映象建立時間 ** SIZE:
映象大小

從遠端倉庫查詢某個映象: docker search 某個XXX映象名字
                          docker search [OPTIONS] 映象名字

OPTIONS說明:
--limit : 只列出N個映象,預設25個
docker search --limit 5 redis
下載映象: docker pull 某個XXX映象名字
						docker pull 映象名字[:TAG]
				
沒有TAG就是最新版(等價於 docker pull 映象名字:latest)

eg:  docker pull redis:6.0.8

拉取redis6.0.8如圖:

此時此刻再去查詢:

檢視映象/容器/資料卷所佔的空間: docker system df 

刪除映象:docker rmi 某個XXX映象名字ID
刪除單個:docker rmi  -f 映象ID
刪除多個:docker rmi -f 映象名1:TAG 映象名2:TAG
刪除全部:docker rmi -f $(docker images -qa)

docker rmi 某個XXX映象名字ID 出現的問題:

需要強制刪除:docker rmi -f 映象ID

此時再查出來:

docker虛懸映象是什麼

倉庫名、標籤都是的映象,俗稱虛懸映象dangling image

docker虛懸映象長什麼樣

6.docker容器命令

6.1 容器命令A:新建+啟動容器

新建+啟動容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 
 OPTIONS說明(常用):有些是一個減號,有些是兩個減號
 
--name="容器新名字"       為容器指定一個名稱;
-d: 後臺執行容器並返回容器ID,也即啟動守護式容器(後臺執行);
 
-i:以互動模式執行容器,通常與 -t 同時使用;
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
也即啟動互動式容器(前臺有偽終端,等待互動);
 
-P: 隨機埠對映,大寫P
-p: 指定埠對映,小寫p

以互動模式啟動一個容器,在容器內執行/bin/bash命令。docker run -it centos /bin/bash
引數說明:
-i: 互動式操作。-t: 終端。centos : centos 映象。
/bin/bash:放在映象名後的是命令,這裡我們希望有個互動式 Shell,因此用的是 /bin/bash。要退出終端,直接輸入 exit:

舉個例子:使用映象centos

再舉個例子:使用映象ubuntu造一個容器

再使用ubuntu造一個容器,自己命名:

6.2 容器命令B:列出執行的容器

此時此刻,呼叫語句:docker ps

列出當前所有正在執行的容器:docker ps [OPTIONS]
OPTIONS說明
OPTIONS說明(常用):
 
-a :列出當前所有正在執行的容器+歷史上執行過的
-l :顯示最近建立的容器。
-n:顯示最近n個建立的容器。
-q :靜默模式,只顯示容器編號。

6.3 容器命令C:退出與重啟容器

兩種退出方式:

exit
run進去容器,exit退出,容器停止
ctrl+p+q
run進去容器,ctrl+p+q退出,容器不停止

1.退出一個容器

啟動已停止執行的容器:

docker start 容器ID或者容器名

1.查一查當前執行的容器,發現只有一個

2.啟動之前停止的容器(即使用exit指令退出的容器)

3.能查出來了

重啟容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
強制停止容器
docker kill 容器ID或容器名
刪除已停止的容器
docker rm 容器ID
一次性刪除多個容器例項
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

6.4 容器命令D:啟動守護式容器 (後臺伺服器)

redis 前後臺啟動演示case:

前臺互動式啟動:docker run -it redis:6.0.8
後臺守護式啟動:docker run -d redis:6.0.8
檢視容器日誌:  docker logs 容器ID
檢視容器內執行的程式:docker top 容器ID
檢視容器內部細節:docker inspect 容器ID
進入正在執行的容器並以命令列互動:docker exec -it 容器ID bashShell
重新進入:docker attach 容器ID

docker logs 容器ID:

docker top 容器ID:

docker inspect 容器ID:

docker exec -it 容器ID bashShell:

使用exec後exit,不會導致容器停止:

使用attach後exit,會導致容器停止:

6.5 容器命令E:從容器內複製檔案到主機上

從容器內複製檔案到主機上:

docker cp  容器ID:容器內路徑 目的主機路徑

匯入和匯出容器:
export 匯出容器的內容留作為一個tar歸檔檔案[對應import命令]
import 從tar包中的內容建立一個新的檔案系統再匯入為映象[對應export]

docker cp 容器ID:容器內路徑 目的主機路徑:

匯入和匯出容器:

相關文章