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在原有的映象中,加入了一層可寫容器,這樣我們就可以修改了。
思考問題的說法:
- Docker是一個分層的檔案系統
- centos iso映象檔案包括bootfs和rootfs,而容器映象複用作業系統的bootfs,只有rootfs和其他映象層。
- 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