docker鏡像原理 鏡像制作 dockerfile


為什么一個centos鏡像只有兩百多兆,而tomcat鏡像五百多兆

1.先說說操作系統

操作系統組成部分:

進程調度子系統
進程通信子系統
內存管理子系統
設備管理子系統
文件管理子系統
網絡通信子系統
作業控制子系統

Linux文件系統由bootfs和rootfs兩部分組成
 bootfs:包含bootloader(引導加載程序)和 kernel(內核)
 rootfs: root文件系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標准目錄和文件
不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等

2.而Docker鏡像是由特殊的文件系統疊加而成

最底端是 bootfs,並使用宿主機的bootfs-復用

第二層是 root文件系統rootfs,稱為base image

然后再往上可以疊加其他的鏡像文件

統一文件系統(Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角,隱藏多層的存在,我們看來只是存在一個文件系統。

所以當我們安裝的tomcat鏡像大小是五百多兆 是因為里面還包含了jdk和centos的鏡像

而centos鏡像復用了宿主機的bootfs 下載的只有rootfs 所以小很多

一個鏡像可以放在另一個鏡像的上面。位於下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。

所以tomcat-》jdk(父鏡像)-》centos(基礎鏡像) 所以整個向外暴露就是五百多兆

鏡像只讀 當從一個鏡像啟動容器時, 所以docker會在鏡像上面加載一個可讀可寫的文件系統作為容器

docker鏡像本質就是一個分層系統

3.鏡像制作 注意容器轉鏡像 容器里面文件不會消失 但是容器掛載的鏡像卷會消失

容器轉為鏡像 docker commit 容器id 鏡像名稱:版本號

鏡像壓縮(鏡像不能傳輸 所以做好的鏡像) docker save -o 壓縮文件名稱 鏡像名稱:版本號

鏡像壓縮文件解壓成鏡像 docker load -i 壓縮文件名稱

3.dockerfile

docker就是一個文本文件 包含了一條條的指令

每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像

為開發、測試。運維提供完全一致的開發環境 只需要通過一個dockerfile文件構建出相同的鏡像

4.dockerfile關鍵字

FROM 指定父鏡像  基於哪個鏡像image構建
RUN 容器創建的時候執行一段命令 
CMD 容器啟動的時候執行的命令
COPY 創建容器是復制文件到鏡像
ADD 添加文件到鏡像還會自動解壓 還可以添加遠程的
ENV 設置環境變量 啟動容器時 -e參數可以覆蓋ENV設置的環境變量
VOIUME 啟動容器時掛載目錄到容器里面 
EXPOSE 暴露端口
WORKDIR 設置進入容器時的路徑

案例:需求 自定義一個centos7鏡像 默認登錄路徑為/usr 並且可以使用vim

定義父鏡像:FROM centos:7
定義作者信息:MAINTAINER  itheima <itheima@itcast.cn>
執行安裝vim命令: RUN yum install -y vim
定義默認的工作目錄:WORKDIR /usr
定義容器啟動執行的命令:CMD /bin/bash
通過dockerfile構建鏡像:docker bulid –f dockerfile文件路徑 –t 鏡像名稱:版本

docker build -f ./centos_docker(dockerfile文件) -t mycentos:1.1(鏡像名稱和版本號) .(尋址路徑)

案例:java程序做成一個鏡像
1.先package 打包成jar包 hello.jar
2.創建一個hello_dockerfile 寫入下面數據

定義父鏡像:FROM java:8
定義作者信息:MAINTAINER  itheima <itheima@itcast.cn>
將jar包添加到容器: ADD hello.jar app.jar
定義容器啟動執行的命令:CMD java –jar app.jar
通過dockerfile構建鏡像:docker bulid –f dockerfile文件路徑 –t 鏡像名稱:版本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM