網站首頁 編程語言 正文
docker鏡像分層
分層介紹
Dockerfile中的每個指令都會創建一個新的鏡像層
鏡像層將被緩存和復用
當Dockerfile的指令修改了,復制的文件變化了,或者構建鏡像時指定的變量不同了,對應的鏡像層緩存就會失效
某一層的鏡像緩存失效之后,它之后的鏡像層緩存都會失效
鏡像層是不可變的,如果在某一層中添加一個文件,然后在下一層中刪除它,則鏡像中依然會包含該文件
Docker鏡像原理
- Docker鏡像是由特殊的文件系統疊加而成
- ·最底端是bootfs,并使用宿主機的bootfs
- ·第二層是root文件系統rootfs,稱為base image
- ·然后再往上可以疊加其他的鏡像文件
- ·統一文件系統(Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提供了 一個統一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。
- ·一個鏡像可以放在另一個鏡像的上面。位于下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。
- ·當從一個鏡像啟動容器時,Docker會在最頂層加載一個讀寫文件系統作為容器。
1.base image:基礎鏡像
2.image:固化了一個標準運行環境,鏡像本身的功能-封裝一組功能性的文件,通過統一的方式,文件格式提供出來(只讀)
3.container:容器層(讀寫)
4.docker-server 端
5.呈現給docker-client (視圖)
鏡像分層模型?
?dockerfile 編寫
dockerfile操作指令
序號 | 指令 | 含義 |
1 | FROM 鏡像 | 指定新鏡像所基于的鏡像,第 條指必須為from指令,每創建一個鏡像就需要一條from指令 |
2 | MAINTAINER 名字 | 說明新鏡像的維護人信息 |
3 | RUN 命令 | 在所基于的鏡像上執行命令,并提交到新的鏡像中;docker內每執行一條命令都是run開頭 |
4 | CMD["要運行的程序","參數1","參數2"] | 指令啟動容器時要運行的命令或者腳本,Dockerfile只能有一條CMD命令, 如果指定多條則只能最后一條被執行 |
5 | EXPOSE 端口號 | 指定新鏡像加載到Docker時要開啟的端口 |
6 | ENV 環境變量 變量值 | 設置一個環境變量的值,會被后面的run使用 |
7 | ADD 源文件、目錄 目標文件/目錄 | 具體識別壓縮格式并且自動解壓,將源文件復制到目標文件,源文件要與dockerfile位于相同目錄中,或者一個URL |
8 | COPY 源文件/目錄 目標文件/目錄 | 將本地主機上的文件/目錄復制到目標地點,源文件/目錄要與Dockerfile在相同的目錄中 |
9 | VOLUME ["目錄"] | 在容器中創建一個掛載點 |
10 | USER 用戶名/UID | 指定運行容器時的用戶 |
11 | WORKDIR 路徑 | 為后續的RUN、CMD、ENTRYPOINT指定工作目錄 |
12 | ONBUILD 命令 | 指定所生成的鏡像作為一個基礎鏡像時所要運行的命令 |
13 | HEALTHCHECK | 健康檢查 |
ADD和copy區別
? ? ? ? ? ? ? ①Dockerfile中的COPY指令和ADD指令都可以將主機上的資源復制或加入到容器鏡像中,都是在構建鏡像的過程中完成的
? ? ? ? ? ? ? ②copy只能用于復制(節省資源)
? ? ? ? ? ? ? ③ADD復制的同時,如果復制的對象時壓縮包,ADD還可以解壓(消耗資源)
? ? ? ? ? ? ? ④COPY指令和ADD指令的唯一區別在于是否支持從遠程URL獲取資源。COPY指令只能從執行docker build所在的主機上讀取資源并復制到鏡像中。而ADD指令還支持通過URL從遠程服務器讀取資源并復制到鏡像中
? ? ? ? ? ? ? ⑤滿足同等功能的情況下,推薦使用COPY指令。ADD指令更擅長讀取本地tar文件并解壓縮
CMD和entrypoint區別
? ?一般還是會用entrypoint的中括號形式作為docker 容器啟動以后的默認執行命令,里面放的是不變的部分,可變部分比如命令參數可以使用cmd的形式提供默認版本,也就是run里面沒有任何參數時使用的默認參數。如果我們想用默認參數,就直接run,否則想用其他參數,就run 里面加參數。
嘗試編寫dockerfile文件 部署nginx
mkdir nginx cd nginx/ vim Dockerfile FROM centos:7 #基于基礎鏡像 MAINTAINER nginx #用戶信息 RUN yum -y update #安裝依賴關系 RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make RUN useradd -M -s /sbin/nologin nginx #創建用戶 ADD nginx-1.12.0.tar.gz /usr/local/src #將源文件復制到目標文件,源文件要與 Dockerfile位于相同目錄中,或者是 一個URL VOLUME ["/usr/local/nginx/html"] #在容器中創建一個掛載點 WORKDIR /usr/local/src #指定工作目錄 WORKDIR nginx-1.12.0 RUN ./configure \ --prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install ENV PATH /usr/local/nginx/sbin:$PATH EXPOSE 80 #暴露端口 RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf CMD nginx
docker運行nginx為什么要使用 daemon off
原文鏈接:https://blog.csdn.net/Liangheng32/article/details/122526942
相關推薦
- 2022-12-06 Python之列表的append()方法最容易踩的坑_python
- 2022-03-20 詳解C語言對字符串處理函數的實現方法_C 語言
- 2022-11-06 react中braft-editor的基本使用方式_React
- 2022-01-05 解決:啟動Redis報錯:`Could not create server TCP listenin
- 2023-06-18 C#中如何連接海康威視_C#教程
- 2022-03-31 利用OpenCV實現質心跟蹤算法_python
- 2022-10-22 Android?Choreographer源碼詳細分析_Android
- 2023-09-17 Could not initialize class net.sf.cglib.beans.Bean
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支