Dockerfile

鏡像原理

思考

  • Docker鏡像的本質是什麼?
  • Docker中一個CentOS鏡像爲何只有200MB,而一個CentOS操做系統的iso文件要幾個G?
  • Docker中的一個Tomcat鏡像爲何有500MB,而一個Tomcat安裝包只有70多MB。

Linux文件系統

  • 操做系統組成部分:docker

    • 進程調度子系統。
    • 進程通訊子系統。
    • 內存管理子系統。
    • 設備管理子系統。
    • 文件管理子系統。
    • 網絡通訊子系統。
    • 做業控制子系統。
  • Linux文件系統由bootfs和rootfs兩部分組成。shell

    • bootfs:包含bootloader(引導加載程序)和kernel(內核)。
    • rootfs:root文件系統,包含的就是典型的Linux系統中的/dev,/proc,/etc等標準目錄和文件。
    • 不一樣的Linux發行版,bootfs基本同樣,而rootfs不一樣,如Ubuntu和CentOS等。

Linux文件系統

Docker鏡像原理

  • Docker鏡像是由特殊的文件系統疊加而成。
  • 最低端是bootfs,並使用宿主機的bootfs。
  • 第二層是root文件系統的rootfs,稱爲base image。
  • 而後再往上能夠疊加其餘的鏡像文件。
  • 統一文件系統(Union File System)技術可以將不一樣的層整合成一個文件系統,爲這些層提供一個統一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。
  • 一個鏡像能夠放在另外一個鏡像的上面。位於下面的鏡像稱爲父鏡像,最底部的鏡像稱爲基礎鏡像。
  • 當從一個鏡像啓動容器時,Docker會在最頂層加載一個讀寫文件系統做爲容器。

Docker鏡像原理

總結

  • 問:Docker鏡像的本質是什麼?vim

  • 答:是一個分層文件系統。centos

  • 問:Docker中一個CentOS鏡像爲何只有200MB,而一個CentOS操做系統的iso文件要幾個G?bash

  • 答:CentOS的iso鏡像包含bootfs和rootfs,而Docker的centos鏡像複用操做系統的bootfs,只有rootfs和其它鏡像層。網絡

  • 問:Docker中的一個Tomcat鏡像爲何有500MB,而一個Tomcat安裝包只有70多MB?運維

  • 答:Docker中鏡像是分層的,Tomcat雖然只有70多MB,但他須要依賴於父鏡像和基礎鏡像,因此整個隊外暴露的Tomcat鏡像大小約500多MB。測試

鏡像製做

容器轉爲鏡像

  • 容器轉爲鏡像
docker commit 容器id 鏡像名稱:版本號
複製代碼
  • 將鏡像壓縮
docker save -o 壓縮文件名稱 鏡像名稱:版本號
複製代碼
  • 將壓縮文件還原爲鏡像
docker save -i 壓縮文件名稱
複製代碼

容器轉換爲鏡像

Dockerfile

概念

  • Dockerfile是一個文本文件。
  • 包含了一條條的指令。
  • 每一條指令構建一層,基於基礎鏡像,最終構建一個新的鏡像。
  • 對於開發人員,能夠爲開發團隊提供一個徹底一致的開發環境。
  • 對於測試人員,能夠直接拿開發時所構建的鏡像或者經過Dockerfile文件構建一個新的鏡像。
  • 對於運維人員,在部署的時候,能夠實現應用的無縫移植。

Dockerfile指令

關鍵字 做用 備註
FROM 指定父鏡像 指定Dockerfile基於那個image構建
MAINTAINER 做者信息 用來標明這個Dockerfile誰寫的
LABEL 標籤 用來標明Dockerfile的標籤,可使用Label代替Maintainer,最終都是在docker image基本信息中能夠查看
RUN 執行命令 執行一段命令,默認是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"]
CMD 容器啓動命令 提供啓動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"]
ENTRYPOINT 入口 通常在製做一些執行就關閉的容器中會使用
COPY 複製文件 build的時候複製文件到image中
ADD 添加文件 build的時候添加文件到image中 不單單侷限於當前build上下文 能夠來源於遠程服務
ENV 環境變量 指定build時候的環境變量 能夠在啓動的容器的時候 經過-e覆蓋 格式ENV name=value
ARG 構建參數 構建參數 只在構建的時候使用的參數 若是有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數
VOLUME 定義外部能夠掛載的數據卷 指定build的image那些目錄能夠啓動的時候掛載到文件系統中 啓動容器的時候使用 -v 綁定 格式 VOLUME ["目錄"]
EXPOSE 暴露端口 定義容器運行的時候監聽的端口 啓動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工做目錄 指定容器內部的工做目錄 若是沒有建立則自動建立 若是指定/ 使用的是絕對地址 若是不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行用戶 指定build或者啓動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶
HEALTHCHECK 健康檢查 指定監測當前容器的健康監測的命令 基本上沒用 由於不少時候 應用自己有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的鏡像做爲基礎鏡像的時候 當執行FROM完成以後 會執行 ONBUILD的命令 可是不影響當前鏡像 用處也不怎麼大
STOPSIGNAL 發送信號量到宿主機 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。
SHELL 指定執行腳本的shell 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell

自定義CentOS鏡像

  • Dockerfile
# 定義父鏡像
FROM centos:7
# 定義做者信息
MAINTAINER weiwei.xu <1900919313@qq.com>
# 執行安裝vim命令
RUN yum -y install vim # 定義默認的工做目錄
WORKDIR /usr # 定義容器啓動執行的命令
CMD /bin/bash 複製代碼
  • 經過Dockfile構建鏡像
docker build -f Dockerfile文件路徑 -t 鏡像名稱:版本號 鏡像存放的絕對路徑
複製代碼
  • 示例:

編寫Dockerfile文件

經過Dockerfile文件構建鏡像
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息