理解docker鏡像與容器

2020-12-13 一個有理想的代碼狗

docker有兩個重要的概念:鏡像,容器。

1.鏡像

docker pull ubuntu:15.04

使用上面的命令可以下載一個ubuntu鏡像,這裡我沒有指定倉庫,默認是從Docker Hub下載。

使用下面命令查看本地鏡像的信息

docker images

有一個問題:為什麼docker下載的鏡像只有131.3MB,而通常我們在虛擬機中安裝ubuntu的鏡像一般都有3個G多?

這裡需要說明一個概念,傳統虛擬機上面安裝的鏡像包含兩個部分,一個是Linux內核的發行版(比如Linux3.13內核),一個是作業系統的發行版(比如說ubuntu15.04),這部分內容不包含Linux內核,但是包含Linux之外的軟體管理方式,軟體驅動,如 apt-get軟體管理包等。內核和發行版是相對獨立的,我們可能都做過這樣的事:升級發行版中的內核。同樣的道理相同的內核也可以對應不同的發行版,docker的鏡像就是利用了這個技術。

使用docker pull ubuntu:15.04命令下載鏡像時系統會出現這樣的消息

給人的第一感覺就是鏡像並不是鐵板一塊,好像是分成4個部分,一個一個的下載。事實也確實如此,下面就要介紹鏡像的分層概念。

首先在說一下docker鏡像的存儲位置/var/lib/docker/,在aufs/layer/下可以看到ubuntu15.04鏡像的分層,正是這四層組成了ubuntu15.04鏡像。

在aufs/diff目錄下使用 ls | xargs ls命令,下圖所顯示的內容相信大家都已經很熟悉了

有人可能已經觀察到了下載時所顯示的層標識和在aufs/layer/下看到的不一樣,首先說一下下載時顯示的ID

在docker 1.10之前鏡像和分層數據通過一個隨機產生的UUID標識,到1.10版本時docker引入了哈希值的方式,而且在1.10之前層ID與aufs/layer/下的目錄名是相同的,1.10之後也變得不一樣了。

鏡像分層的可以使得鏡像的規模變小了很多,這裡通過自己創建一個鏡像來說明。下面用一個簡單的Dockerfile來創建鏡像,將Dockerfile放到當前目錄下。

Dockerfile內容:

FROM ubuntu:15.04RUN echo "hello world" > /tmp/newfile

執行docker build命令

docker build -t changed-ubuntu .

生成的鏡像ID為769951131a6a,使用docker images查看

使用docker history命令查看創建了那些鏡像層

docker history changed-ubuntu

這裡可以看出新創建的changed-ubuntu鏡像並不是所有的東西的是新的,它只是在原有的ubuntu15.04上增加了一層,這個層只有12B。一個鏡像可以被重複利用創建新的鏡像,這會使得鏡像可以被高效的存儲和創建。

2.容器

下面介紹一下創建一個容器的過程。

鏡像是靜態的,鏡像的每一層都只是可讀的,而容器是動態的裡面運行著我們指定的應用,容器裡面的應用可能會新建一個文件,修改一個目錄,這些操作所帶來的改變並不會作用到鏡像裡面,因為鏡像只是可讀的。所以通過鏡像創建容器就是在鏡像上加一個可讀寫的層。下面的圖引用自docker docs,ID上有些不同。

一個鏡像可創建多個容器,每個容器都有各自的一個可讀寫層,這些層相互獨立共享下面的鏡像

相關焦點

  • docker鏡像及容器命令
    運行容器docker run <容器名>3. 查看容器列表docker ps -a4.後臺運行容器docker run -d <容器名>-d 後臺執行5.暴露容器埠docker run -d -P <容器名>5.1 自定義埠暴露docker run -d -p 2020:80 2021:443 <容器名>
  • 這10張圖帶你深入理解Docker容器和鏡像
    這篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和鏡像(image)之間的區別,並深入探討容器和運行中的容器之間的區別
  • 阿里P8架構師談:Docker鏡像和Docker容器的關係?
    1.什麼是Docker鏡像A:從整體的角度來講,一個完整的Docker鏡像可以支撐一個Docker容器的運行,在 Docker容器運行過程中主要提供文件系統視角。剛才提到了「Debian鏡像中安裝MySQL 5.6,就成了mysql:5.6鏡像」,其實在此時Docker鏡像的層級概念就體現出來了。底層一個Debian作業系統鏡像,上面疊加一個 mysql層,就完成了一個mysql鏡像的構建。層級概念就不難理解,此時我們一般debian作業系統鏡像稱為mysql鏡像層的父鏡像。
  • docker容器的啟動方式
    使用Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。 二、docker中的基本概念鏡像(Image):  鏡像,從認識上簡單的來說,就是面向對象中的類,相當於一個模板。從本質上來說,鏡像相當於一個文件系統。
  • Docker系列教程01-使用Docker鏡像
    前言學習Docker,我們需要掌握它的三大核心概念:鏡像、容器和倉庫。今天先帶大家學習Docker鏡像相關的基礎知識。如果讀者之前是VM管理員,則可以把Docker鏡像理解為VM模板,如果您是一名研發人員,可以將鏡像理解為類(class)。簡單說,Docker鏡像是一個不包含系統內核而又精簡的作業系統。
  • 如何開始docker - docker架構及創建容器
    容器的創建過程: 鏡像倉庫 ->pull 鏡像到本地 -> 本地鏡像 -> run容器 from 鏡像 -> 創建容器並執行程序->程序退出->容器退出1、dockerd服務端(守護進程),dockerd是docker的守護進程。
  • Docker系列教程02-操作Docker容器
    簡介通過前面的學習,相信您已經對鏡像有所了解,是時候學習容器了。容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例。正如從虛擬機模板上啟動VM一樣,用戶也同樣可以從單個鏡像上啟動一個或多個容器。
  • 【Docker】系列教程02-操作Docker容器
    簡介通過前面的學習,相信您已經對鏡像有所了解,是時候學習容器了。容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例。正如從虛擬機模板上啟動VM一樣,用戶也同樣可以從單個鏡像上啟動一個或多個容器。
  • 雲計算核心技術Docker教程:Docker鏡像使用
    當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。我們可以使用 docker images 來列出本地主機上的鏡像。
  • 輕鬆理解Docker倉庫、Docker鏡像和Docker容器的含義及關係
    Docker只是一個容器引擎,那如何正確的理解容器呢?我們舉個例子來說,飛機是可以在天空中飛行的,在製造飛機的時候,就是解決飛機能夠在各種情況下的空氣中飛行,從而解決一些不能飛行的物質,可以裝配在飛機上,達到了可在天空中的目的。
  • Docker鏡像進階:了解其背後的技術原理
    什麼是 docker 鏡像  docker 鏡像是一個只讀的 docker 容器模板,含有啟動 docker 容器所需的文件系統結構及其內容,因此是啟動一個 docker 容器的基礎。
  • 雲計算核心技術Docker教程:Docker容器使用
    例如我們要查看 docker stats 指令的具體使用方法:命令如下:$ docker stats --help如果我們本地沒有 ubuntu 鏡像,我們可以使用 docker pull 命令來載入 ubuntu 鏡像:
  • ​Docker 數據卷的管理及自動構建docker鏡像
    >手動將容器保存為鏡像本次是基於docker官方centos 6.8 鏡像創建官方鏡像列表:https://hub.docker.com/explore/[root@docker01 ~]# docker pull  centos:6.8[root@docker01 ~]# docker run
  • 攻擊和審計Docker容器01
    Docker容器鏡像是一個輕量級,獨立的可執行軟體包,包含運行應用程式所需的一切:代碼,運行時,系統工具,系統庫和設置。容器鏡像在運行時成為容器,在Docker容器的情況下- 鏡像在Docker Engine上運行時成為容器。適用於基於Linux和Windows的應用程式,無論基礎架構如何,容器化軟體都將始終運行相同。容器將軟體與其環境隔離開來,並確保它可以統一工作,儘管開發和演示之間存在差異。
  • 通過容器化一個Python Web應用學習Docker容器技術
    ", "sha256:fc7b1fecdbe2f45d44d04b33017a2f89d2ac3928d2fb75dfb3db12738416b91f" ] }, "Metadata": { "LastTagTime": "2020
  • Docker 容器的網絡
    如果你通過 Docker 提供的用戶指南,你應該已經完成了構建你的第一個 Docker 容器,並且運行了示例應用。你已經構建了你自己的鏡像(images)。本部分的內容將會指導你如何對你的容器進行網絡配置。
  • CoreOS實踐指南(七):Docker容器管理服務
    後者可以直接使用:docker pull docker.cn/docker/node:latestdocker pull docker.cn/docker/mongo:latest二、製作定製鏡像MongoDB可以直接使用官方的Docker鏡像。
  • 上手 Docker 容器數據管理
    Docker 數據管理概覽好久不見,歡迎繼續閱讀「築夢師系列」 Docker 教程,前情回顧:在《一杯茶的時間,上手 Docker》[1]中,我們以「工作」和「做夢」來類比「應用開發」和「部署」,並通過一些小實驗讓你理解 Docker 是如何實現從「做夢」到「築夢」的跨越的,並且理解了鏡像和
  • 生產中的NLP:創建Docker鏡像
    只有需要支持三個不同的Docker鏡像,因為最終階段版本被推送到Prod,一旦Stage版本通過了安全和驗收測試。Stage和Prod使用相同的Docker鏡像。Python和R用戶希望Jupyter和RStudio Notebook和Nbextensions首選項出現在Docker鏡像中。
  • 容器到底是個啥?(附Docker學習資源匯總)
    Docker鏡像類似於虛擬機鏡像,可以將它理解為一個只讀的模板。例如,一個鏡像可以包含一個基本的作業系統環境,裡面僅安裝了Apache應用程式(或用戶需要的其他軟體)。可以把它稱為一個Apache鏡像。鏡像是創建Docker容器的基礎。