docker構建鏡像的三種方式(Dockerfile初步)
前言
上篇講述了有關docker網絡通信部分原理以及案例,本篇文章將講述有關docker構建鏡像的具體操作。本文將從docker構建鏡像的方式入手,逐一講述。
構建鏡像的三種方式:
- Dockerfile
- 基於已有的鏡像容器進行創建
- 基於本地模板創建
首先,我們爲什麼需要構建docker鏡像?只有明白了這個問題,我們才知道構建docker鏡像的意義或者說價值是什麼。
答案其實很簡單:docker鏡像是docker的三大核心之一,也是應用發佈的標準格式,一個完整的docker鏡像可以支持一個docker容器的運行。我們在容器進行相關的操作,例如安裝應用服務,假設某個業務的需求恰好需要方纔安裝配置好的應用服務,我們就可以將環境以及搭建的服務生成新的鏡像提供出去。
下面我們來具體看看這三種方式的構建手法。
基於Dockerfile構建鏡像
什麼是Dockerfile?
Dockerfile構建鏡像的方式就目前而言是使用最爲廣泛的,這是一種可以自動化生成鏡像的一種方式,就類似shell腳本一樣,一個腳本執行完就可以將一個服務安裝配置好,支持正常使用了。Dockerfile也是一樣,也是由一組指令組成的文件,其中每條指令對應Linux中的一條命令,Docker程序將通過讀取Dockerfile中的指令最終生成鏡像。
Dockerfile可以認爲是一個普通文件,其結構大致分爲四個部分:基礎鏡像信息、維護者信息、鏡像操作指令以及容器啓動時執行指令。並且在Dockerfile中支持以“#”開頭的註釋。
Docker鏡像的分層
- Dockerfile中的每個指令都會創建一個新的鏡像層
- 鏡像層將被緩存和複用
- 當Dockerfile的指令被修改了,複製的文件變化了,或者構建鏡像時指定的變量不同了,對應的鏡像層緩存就會失效
- 某一層的鏡像緩存失效後,其之後的鏡像層緩存都會隨之失效
- 鏡像層是不可變的,如果在某一層中添加一個文件,然後在下一層中刪除則鏡像中依然會包含該文件
Dockerfile編寫規則
Dockerfile中是基於其指令進行編寫的,其規則可以參考下面的表格,當然,在編寫Dockerfile時,其格式是需要嚴格遵循的:
除註釋外,第一行必須使用FROM指令所基於的鏡像名稱;之後使用MAINTAINER指明維護信息;然後就是一系列鏡像操作指令,如RUN、 ADD等;最後便是CMD指令來指定啓動容器時要運行的命令操作。其中RUN指令可以使用多條,CMD只有最後一條可以生效!
本文主要是講述docker構建鏡像的三種方式,Dockerfile的構建具體過程筆者將在之後的文章中通過各種實際案例來講述演示,本文暫時給出一個Dockerfile文件的例子給大家參考。
[root@localhost ~]# cat Dockerfile
#務必先指明基於的基礎鏡像
FORM centos:7
#維護該鏡像的用戶信息(自定義)
MAINTAINER [email protected]
#鏡像操作命令
RUN yum -y update
RUN yum -y install openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#開啓端口
EXPOSE 22
#啓動容器時執行指令
CMD ["/usr/sbin/sshd","-D"]
基於已有鏡像構建鏡像
上述的Dockerfile的構建鏡像的方式是自動化進行的,那麼手動構建的方式就是剩下的兩種了。
基於已有的鏡像構建主要是通過docker commit 命令來構建新的鏡像,其實質就是將一個容器裏面運行的程序以及該程序的運行環境打包起來生成新的鏡像。
docker commit的語法規則及可選項介紹
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <[email protected]>")#作者信息
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message #說明信息
-p, --pause Pause container during commit (default true) #生成過程中停止容器的運行
案例:基於原有鏡像構建新的鏡像(看實質原理)
1.創建一個容器
[root@localhost ~]# docker create -it nginx /bin/bash
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
123275d6e508: Pull complete
6cd6a943ce27: Pull complete
a50b5ac4a7fb: Pull complete
Digest: sha256:d81f010955749350ef31a119fb94b180fde8b2f157da351ff5667ae037968b28
Status: Downloaded newer image for nginx:latest
fb9a4cdb1b79a5e4d82177afdbe8c1f1956888733979f15ae562e0013f4e0f29
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb9a4cdb1b79 nginx "/bin/bash" 17 seconds ago Created vibrant_heisenberg
2.基於該容器使用docker commit 命令創建新的鏡像
[root@localhost ~]# docker commit -m new_image -a lokott fb9a4cdb1b79 lokott:demo
sha256:bb848fe7eb3655a07e6577e05bc04ab6404549a24c49fa5d3161ceb767a048f2
[root@localhost ~]# docker images | grep lokott
lokott demo bb848fe7eb36 26 seconds ago 127MB
基於本地模板構建鏡像
該方式是通過導入操作系統模板文件生成鏡像,模板可以從OPENVZ開源項目下載,下載地址爲:http://openvz.org/Download/template/precreated
下面直接給出例子——將debian模板壓縮包導入爲本地鏡像
[root@localhost ~]# ls
anaconda-ks.cfg docker.sh 公共 視頻 文檔 音樂
debian-7.0-x86-minimal.tar.gz initial-setup-ks.cfg 模板 圖片 下載 桌面
[root@localhost ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - lokott:new
sha256:df2ce16066413515db7db8a76243fcaebbd904d10304ab467fefde852dddd9a8
[root@localhost ~]# docker images | grep new
lokott new df2ce1606641 14 seconds ago 215MB
本文講述了docker構建鏡像的三種方式,最重要的是上述的第一種方式使用的非常多。