首頁 > 軟體

Docker構建映象的三種方式(Dockerfile初步)

2020-06-16 16:12:21

構建映象的三種方式:

  • Dockerfile
  • 基於已有的映象容器進行建立
  • 基於本地模板建立

首先,我們為什麼需要構建docker映象?只有明白了這個問題,我們才知道構建docker映象的意義或者說價值是什麼。

答案其實很簡單:docker映象是docker的三大核心之一,也是應用發布的標準格式,一個完整的docker映象可以支援一個docker容器的執行。我們在容器進行相關的操作,例如安裝應用服務,假設某個業務的需求恰好需要方才安裝設定好的應用服務,我們就可以將環境以及搭建的服務生成新的映象提供出去。

下面我們來具體看看這三種方式的構建手法。

基於Dockerfile構建映象

什麼是Dockerfile?

? Dockerfile構建映象的方式就目前而言是使用最為廣泛的,這是一種可以自動化生成映象的一種方式,就類似shell指令碼一樣,一個指令碼執行完就可以將一個服務安裝設定好,支援正常使用了。Dockerfile也是一樣,也是由一組指令組成的檔案,其中每條指令對應Linux中的一條命令,Docker程式將通過讀取Dockerfile中的指令最終生成映象。

? Dockerfile可以認為是一個普通檔案,其結構大致分為四個部分:基礎映象資訊、維護者資訊、映象操作指令以及容器啟動時執行指令。並且在Dockerfile中支援以“#”開頭的注釋。

Docker映象的分層

  1. Dockerfile中的每個指令都會建立一個新的映象層
  2. 映象層將被快取和複用
  3. 當Dockerfile的指令被修改了,複製的檔案變化了,或者構建映象時指定的變數不同了,對應的映象層快取就會失效
  4. 某一層的映象快取失效後,其之後的映象層快取都會隨之失效
  5. 映象層是不可變的,如果在某一層中新增一個檔案,然後在下一層中刪除則映象中依然會包含該檔案

Dockerfile編寫規則

Dockerfile中是基於其指令進行編寫的,其規則可以參考下面的表格,當然,在編寫Dockerfile時,其格式是需要嚴格遵循的:

除注釋外,第一行必須使用FROM指令所基於的映象名稱;之後使用MAINTAINER指明維護資訊;然後就是一系列映象操作指令,如RUN、 ADD等;最後便是CMD指令來指定啟動容器時要執行的命令操作。其中RUN指令可以使用多條,CMD只有最後一條可以生效!

? 本文主要是講述docker構建映象的三種方式,Dockerfile的構建具體過程筆者將在之後的文章中通過各種實際案例來講述演示,本文暫時給出一個Dockerfile檔案的例子給大家參考。

[root@localhost ~]# cat Dockerfile 
#務必先指明基於的基礎映象
FORM CentOS:7
#維護該映象的使用者資訊(自定義)
MAINTAINER lokott@123.com
#映象操作命令
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 <hannibal@a-team.com>")#作者資訊
  -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構建映象的三種方式,最重要的是上述的第一種方式使用的非常多。


IT145.com E-mail:sddin#qq.com