Docker 鏡像和容器

Docker鏡像和容器

鏡像(image):提供容器運行時所需要的程序、庫、資源、配置等文件外,還包括一些爲運行時準備的配置參數,如匿名卷、環境變量、用戶等。鏡像不包含任何動態數據,內容在構建之後也不會改變。一個鏡像可以運行多個container,鏡像可以通過dockerfile創建,也可以直接從鏡像倉庫下載。
容器(container):容器的實質是進程,運行在屬於自己的獨立命名空間,因此容器可以擁有自己的root文件系統、網絡配置、進行空間等。
Docker運行容器前需要本地存在對應的鏡像,容器是鏡像的一個運行實例。所不同的是,鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層。

Docker鏡像

鏡像文件一般由若干層(layer)組成,使用docker pull命令下載會獲取並輸出鏡像的各層信息。當不同的鏡像包括相同的層時,本地僅存儲了層的一份內容,減小了存儲空間。

獲取鏡像

docker image pull NAME[:TAG]

NAME是鏡像倉庫的名稱(用來區分鏡像),TAG是鏡像的標籤(往往用來表示版本信息)。
例如:獲取Ubuntu 18.04系統的基礎鏡像使用如下命令
docker pull Ubuntu 18.04
對於Docker鏡像來說,如果不顯示指定TAG,則默認會選擇latest標籤,這會下載倉庫中最新版本的鏡像。

如果從非官方的倉庫下載,則需要在倉庫名稱前指定完整的倉庫地址。docker pull hub.c.163.com/public/ubuntu:18.04
有時需要使用鏡像代理服務來加速Docker鏡像獲取過程,可以在Docker服務啓動配置中增加–registry-mirror=proxy_URL來指定鏡像代理服務地址。

下載鏡像到本地後,利用該鏡像創建一個容器,在其中運行bash應用
docker run -it --name ubuntu-container ubuntu:18.04 /bin/bash

查看鏡像信息

列出本地主機上已有鏡像的基本信息:來自於哪個倉庫、鏡像的標籤信息、鏡像的ID、創建時間、鏡像大小

docker image ls
-f,--filter=[]:過濾出鏡像
--no-trunc=true|false:對輸出結果中太長的部分進行截斷

使用tag命令添加鏡像標籤

docker tag命令添加的標籤實際上起到了類似鏈接的作用,指向的是同一個鏡像文件。

docker tag ubuntu:latest ubuntu-image:latest

再次使用docker images列出本地主機上鏡像信息,可以看到多了一個ubuntu-image:latest標籤的鏡像,ubuntu-image鏡像的ID跟ubuntu是完全一致的,指向同一個鏡像文件

使用inspect命令查看詳細信息

使用docker[image] inspect命令可以獲取該鏡像的詳細信息,包括製作者、適應架構、各層的數字摘要等。

docker inspect tomcat-container

使用history命令查看鏡像歷史

鏡像文件由多個層組成,可以使用history子命令列出各層的創建信息。

docker history ubuntu:18.04

過長的命令會自動截斷,可以使用前面提到的–no-trunc選項來輸出完整命令。

搜尋鏡像

docker search [option] keyword
-f,--filter filter:過濾輸出內容
--no-trunc:不截斷輸出結果

刪除和清理鏡像

使用標籤刪除鏡像

docker rmi IMAGE
其中IMAGE可以爲標籤或ID
-f,-force:強制刪除鏡像,即使有容器依賴它

當同一個鏡像擁有多個標籤的時候,docker rmi命令只是刪除了該鏡像多個標籤中的指定標籤而已,並不影響鏡像文件。但當鏡像只剩下一個標籤的時候,再使用docker rmi命令會徹底刪除鏡像。

使用鏡像ID來刪除鏡像

當使用docker rmi命令,並且後面跟上鏡像的ID時,會先嚐試刪除所有指向該鏡像的標籤,然後刪除該鏡像文件本身。
注意:當有該鏡像創建的容器存在時,鏡像文件默認是無法刪除的。例如:後臺存在一個退出狀態的容器,試圖刪除該鏡像時,Docker會提示有容器正在運行,無法刪除。
如果要想強行刪除鏡像,可以使用-f參數:

docker rmi -f ubuntu:18.04

注意:通常並不推薦使用-f參數來強制刪除一個存在容器依賴的鏡像。正確的做法是:先刪除依賴該鏡像的所有容器,再來刪除鏡像。

清理鏡像

使用Docker一段時間後,系統中可能會遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,可以通過docker image prune命令來進行清理。

docker image prune
-a,-all:刪除所有無用鏡像,不光是臨時鏡像
-filter filter:只清理符合給定過濾器的鏡像
-f,-force:強制刪除鏡像,而不進行提示確認

創建鏡像

創建鏡像的方法主要有三種:基於已有鏡像的容器創建、基於本地模板導入、基於Dockerfile創建。
1、基於已有容器創建
使用docker [container] commit命令來提交爲一個新的鏡像

docker [container] commit CONTAINER
-a:作者信息
-c:提交時候執行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
-m:提交信息

CONTAINER:提交時可以使用ID或名稱來指定容器

2、基於本地模板導入
用戶可以直接從一個操作系統模板文件導入一個鏡像

docker [image] import [OPTIONS] file|URL-[REPOSITORY[:TAG]]

要直接導入一個鏡像,可以使用已導出的鏡像模板來創建。例如:導入ubuntu-18.04模板壓縮包

cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
#查看新導入的鏡像,已經成功導入本地
docker image

3、基於Dockerfile創建
基於Dockerfile創建是最常見的方式。Dockerfile是一個文本文件,利用給定的指令描述基於某個父鏡像創建新鏡像的過程。
基於Dockerfile創建鏡像詳細參考這篇博客:Docker 使用Dockerfile創建鏡像
創建鏡像的過程可以使用docker [image] build命令,編譯成功後本地將多出一個鏡像

#-f指定Dockerfile文件的路徑
#-t指定鏡像名字和TAG
#.指定當前目錄,指定上下文路徑,默認使用上下文路徑下的dockerfile創建鏡像
docker build -t tomcat-image .

存出和載入鏡像

1、存出鏡像
導出鏡像到本地文件,可以使用docker [image] save 命令。該命令支持-o、-output string參數,導出鏡像到指定的文件中

docker save -o /home/data/tomcat-image.tar tomcat-image

用戶就可以通過複製tomcat-image.tar文件將該鏡像分享給他人

2、載入鏡像
可以使用docker [image] load將導出的tar文件再導入到本地鏡像庫。支持-i選項,從指定文件中讀入鏡像內容。
從文件tomcat-image.tar導入鏡像到本地鏡像列表。

docker load -i tomcat-image.tar

導入鏡像及其相關的元數據信息(包括標籤)。導入成功後,可以使用docker images命令進行查看,與原鏡像一致。

上傳鏡像

可以使用docker [image] push命令上傳鏡像到倉庫,默認上傳到Docker Hub官方倉庫(需要登錄)。
命令格式爲:

docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

例如:上傳tomcat-image鏡像到鏡像倉庫

docker push tomcat-image:latest

Docker容器

新建容器

使用docker [container] create命令新建一個容器,創建的容器處於停止狀態,可以使用docker [container] start命令來啓動。

docker create -it ubuntu:latest

create命令與容器運行模式相關的選項

選項 說明
-d 後臺運行容器
-i 保持標準輸入打開
-P 通過NAT機制將容器標記暴露的端口自動映射到本地主機的臨時端口
-p 指定容器端口到本地端口的映射
-rm 容器退出後是否自動刪除,不能跟-d同時使用
-t 分配一個僞終端
-v 掛載主機上的文件捲到容器內
-w 容器內的默認工作目錄
-e 指定容器內環境變量
-h 指定容器內的主機名
–name 指定容器的別名

啓動容器

使用docker [container] start命令來啓動一個已經創建的容器。

docker start java-container
java-container

查看運行中的容器

通過docker ps命令查看一個運行中的容器

docker ps 

查看所有容器的ID

docker ps -qa

新建並啓動容器docker run

docker [container] run,等價於先執行docker [container] create命令,再執行docker [container] start命令。
當利用docker [container] run來創建並啓動容器時,Docker在後臺運行的標準操作包括:

  1. 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  2. 利用鏡像創建一個容器,並啓動該容器
  3. 分配一個文件系統給容器,並在只讀的鏡像層外面掛載一層可讀寫層
  4. 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  5. 從網橋的地址池配置一個IP地址給容器
  6. 執行用戶指定的應用程序
  7. 執行完畢後容器被自動終止

啓動一個bash終端,允許用戶進行交互,-t選項讓Docker分配一個僞終端(並綁定到容器的標準輸入上),-i則讓容器的標準輸入保持打開。

docker run -it --rm --name java-container java-image /bin/bash

在容器內使用ps命令查看進程,可以看到,只運行了bash應用,並沒有運行其他無關的進程。用戶可以輸入exit命令退出容器。對於所創建的bash容器,當用戶使用exit命令退出bash進程後,容器也會自動退出。

在這裏插入圖片描述
守護態運行
需要讓Docker容器在後臺以守護態形式運行,此時可以通過添加-d參數來實現。

查看容器輸出

獲取容器輸出信息

 docker container logs tomcat-container

停止容器

1、暫停容器
可以使用docker [container] pause CONTAINER 命令來暫停一個運行中的容器
處於paused狀態的容器,可以使用docker [container] unpause CONTAINER命令來恢復到運行狀態。

2、終止容器
docker container stop來終止一個運行中的容器

docker container prune命令,會自動清除掉所有處於停止狀態的容器

docker [container] restart 命令會將一個運行態的容器先終止,然後再重新啓動。

進入容器

進入剛創建的容器中,並啓動一個bash,exec命令對容器執行操作是最爲推薦的方式

docker container exec -it mysql /bin/bash

刪除容器

使用docker [container] rm命令來刪除處於終止或退出狀態的容器。docker rm命令只能刪除已經處於終止或退出狀態的容器,並不能刪除還處於運行狀態的容器。要直接刪除一個運行中的容器,可以添加-f參數。

docker rm java-container

導出容器

導出一個已經創建的容器到一個文件。使用docker [container] export命令。

docker export -o /home/yangfei/mysql.tar mysql

導入容器

導出的文件可以使用docker [container] import命令導入變成鏡像。

docker import file|URL|-[REPOSITORY[:TAG]]
docker import mysql.tar mysql-container
#查看鏡像
docker images

實際上,既可以使用docker load命令來導入鏡像存儲文件到本地鏡像庫,也可以使用docker [container] import命令來導入一個容器快照到本地鏡像庫。兩者的區別在於:容器快照文件將丟失所有的歷史記錄和元數據信息(僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積更大。另外,從容器快照文件導入時可以重新指定標籤等元數據信息。

查看容器

以json格式返回包括容器ID、創建時間、路徑、狀態、鏡像、配置等在內的各項信息。

docker container inspect CONTAINER

####查看容器內進程
打印出容器內的進程信息,包括PID、用戶、時間、命令等。

docker container stats --no-stream tomcat-container-yf
-a:輸出所有容器統計信息,默認僅在運行中
--no-strema:不持續輸出,默認會自動更新持續實時結果
--no-trunc:不截斷輸出信息

在這裏插入圖片描述

複製文件

container cp命令支持在容器和主機之間複製文件。

docker cp /home/test.html tomcat-container-yf:/tmp/
#查看文件是否複製成功
#進入容器
docker container exec -it tomcat-container-yf /bin/bash
ls /tmp/

在這裏插入圖片描述

查看變更

container diff查看容器內文件系統的變更

docker container diff CONTAINER
docker diff mysql
A /logs
C /root
A /root/.mysql_history
A /root/.bash_history

查看端口映射

container port命令可以查看容器的端口映射情況

docker container port tomcat-container
8080/tcp -> 0.0.0.0:8080

更新配置

container update命令可以更新容器的一些運行時配置,主要時一些資源限制份額。

docker [container] update [OPTIONS] CONTAINER
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章