為什么一個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 鏡像名稱:版本