Docker鏡像原理
思考:
- Docker鏡像本質是什么?
是一個分層文件系統
- Docker中一個centos鏡像為什么只有200MB,而一個centos操作系統的iso文件要幾個個G?
Centos的iso鏡像文件包含bootfs和rootfs,而docker的centos鏡像復用操作系統的bootfs,只有rootfs和其他鏡像層
- Docker中一個tomcat鏡像為什么有500MB,而一個tomcat安裝包只有70多MB?
由于docker中鏡像是分層的,tomcat雖然只有70多MB,但他需要依賴于父鏡像和基礎鏡像
所有整個對外暴露的tomcat鏡像大小500多MB
鏡像制作
Docker鏡像如何制作?
1.容器轉為鏡像
docker commit 容器id 鏡像名稱:版本號
docker save -o 壓縮文件名稱 鏡像名稱:版本號
docker load -i 壓縮文件名稱
2.dockerfile
| 關鍵字 |
作用 |
備注 |
| 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 |
使用dockerfile構建自己的鏡像
命令:
docker build -f ./dockerfile -t [新的鏡像名稱:版本]
-f:設置當前dockerfile的文件路徑
Docker Compose
Docker Compose是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建,啟動和停止。使用步驟:
1.利用Dockerfile定義運行環境鏡像
2.使用dopker-compose.yml定義組成應用的各服務
3.運行docker-compose up啟動應用
Docker 私有倉庫
一、私有倉庫搭建
# 1、拉取私有倉庫鏡像
docker pu1l registry
# 2、啟動私有倉庫容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打開瀏覽器 輸入地址http://私有倉庫服務器ip:5000/v2/_catalog,看到{"repositories":[]}表示私有倉庫搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一個key,保存退出。此步用于讓docker信任私有倉庫地址;注意將私有倉庫服務器ip修改為自己私有倉庫服務器真實ip
"insecure-registries":["私有倉庫服務器ip:5000"]}
# 5、重啟docker服務
systemctl restart docker
docker start registry
二、將鏡像上傳至私有倉庫
# 1、標記鏡像為私有倉庫的鏡像, 將其打個標簽準備上傳到私有倉庫
docker tag centos:7 私有倉庫服務器IP:5000/centos:7
# 2、上傳標記的鏡像
docker push 私有倉庫服務器IP:5000/centos:7
三、從私有倉庫拉取鏡像
# 拉取鏡像
docker pull 私有倉庫服務器ip:5000/centos:7