1. 程式人生 > 其它 >Docker學習04 - Dockerfile

Docker學習04 - Dockerfile

Docker file

Docker file:拿來做docker映象的檔案,我們要理解dockerfile需要先理解docker映象原理。

思考:

1 docker映象的本質是什麼

2 docker的centos映象為什麼只需要200MB,為什麼iso檔案要好幾個G?

3 docker的tomcat映象為什麼要500MB,但是tomcat安裝包只需要70MB?

docker映象原理

先說作業系統組成部分:

Linux檔案系統由Bootfs和Rootfs兩部分組成

bootfs:包含bootloader(引導載入程式)和kernel(核心)

rootfs:root檔案系統,包含經典linux的/dev,/proc,/bin,/etc等標準目錄和檔案。

不同的linux發行版,bootfs基本是一樣的,而rootfs不同,如ubuntu,centos等

再說docker:

  • docker是由特殊的檔案系統疊加而成。

  • 最低端是bootfs,並使用宿主機的bootfs。

  • 第二層是root檔案系統rootfs,稱為base image

  • 在往上疊加其他映象檔案

bootfs上面的映象都可以稱為只讀映象

  • 同一檔案系統(Union File System)技術能夠將不同的層整合成一個檔案系統,為這些層提供一個統一的視角,隱藏了多層的存在,使用者角度看,只存在一個檔案系統。
  • 一個映象可以放到另一個映象中,下面的映象稱為父映象,最底層的映象稱為基礎映象

只讀映象

只讀映象按理說應該是不能直接修改映象內容的,但是當我們進入容器後,卻能在容器中建立和修改,這是因為docker在原有的映象中,加入了一層可寫容器,這樣我們就可以修改了。

思考問題的說法

  1. Docker是一個分層的檔案系統
  2. centos iso映象檔案包括bootfs和rootfs,而容器映象複用作業系統的bootfs,只有rootfs和其他映象層。
  3. tomcat還依賴父映象和基礎映象。所有整個對外暴露的tomcat總和有500多MB。

我們可以通過docker inspect命令,檢視一個映象的分層資訊:

docker映象製作

分為2種方法:

1 容器轉為映象

2 dockerfile

容器轉映象

轉映象命令

docker commit {容器ID} {映象名稱}:{版本號}

可以將儲存好的映象轉成壓縮檔案

docker save -o {壓縮檔案路徑} {映象名稱}:{版本號}

我們把壓縮檔案傳給測試,然後測試使用下面的命令恢復映象

docker load -i {壓縮檔名稱}

注:掛載的檔案是不會被寫入到映象中的。

Dockerfile

說明:

1 dockerfile是一個文字檔案

2 包含了一條條指令

3 每一條指令構建一層,基於基礎映象,最終構建出一個新的映象。

對於開發人員:可以為開發人員提供一個完全一致的開發環境。

對於測試人員:直接拿著dockerfile構建一個新映象、

對於運維人員:部署時,實現無縫移植。

示例:

FROM registry.centos.org/centos/centos:7
LABEL maintainer="Mohammed Zeeshan Ahmed <[email protected]>"
LABEL VERSION="0.11.0" ARCHITECTURE="amd64"
RUN mkdir -p /etc/caddy && useradd -u 1001 -g 0 caddy
ADD ./caddy /usr/bin/caddy
RUN chmod 0755 /usr/bin/caddy \
    && /usr/bin/caddy -version

RUN mkdir -p /var/www/html && chown -R 1001:0 /var/www && chmod -R 777 /var/www && chmod -R g+s /var/www

ADD Caddyfile /etc/caddy/Caddyfile

RUN chown -R 1001:0 /etc/caddy && chmod -R 775 /etc/caddy

USER 1001

EXPOSE 80 443 2015 8080 8443

WORKDIR /var/www/html

ENTRYPOINT ["/usr/bin/caddy"]
CMD ["-quic" ,"--conf", "/etc/caddy/Caddyfile"]

關鍵字說明

參考:

https://www.cnblogs.com/python-boy/p/13091973.html

關鍵字 作用 備註
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

配置完成後,使用

docker build -f {dockerfile filename} -t {name}:{tag} {dockerfile dirpath}

來構建一個映象

案例

編寫一個dockerfile檔案,要求:

1. 自定義Centos
2. 預設登入路徑/usr
3. 可以使用vim
FROM centos:7

MAINTAINER zhaozijian <[email protected]>

RUN yum install -y vim
WORKDIR /usr

CMD /bin/bash