docker commit 與 docker build

在使用Docker的過程當中,咱們除了從Docker Hub上下載已經作好的鏡像,不少時候須要咱們本身製做鏡像。下面想在這個文章中說明一下鏡像的製做方法。php

製做鏡像的方式主要有兩種:mysql

經過docker commit 製做鏡像linux

經過docker build 製做鏡像sql

這兩種方式都是經過改進已有的鏡像來達到本身的目的。製做基礎鏡像,會在另一篇文章「從零開始製做基礎鏡像」中介紹。docker

docker commitshell

docker commit 是往版本控制系統裏提交一次變動。使用這種方式製做鏡像,本質上是運行一個基礎鏡像,而後在基礎鏡像上進行軟件安裝和修改。最後再將改動提交到版本系統中。apache

選擇基礎鏡像ubuntu

基礎鏡像的選擇要結合本身的需求。能夠選擇已有的應用鏡像來改造,也能夠選擇Ubuntu,Debian,OpenSuse這類基礎系統鏡像bash

咱們以ubuntu爲例子來講明curl

步驟1:運行ubuntu 鏡像

docker run -i -t ubuntu /bin/bash

步驟2:安裝軟件並修改軟件配置, 好比:安裝apache2

apt-get -yqq update

apt-get -y install apache2

安裝完成後,對apache2進行配置和修改

步驟3:退出docker並保存鏡像

使用「exit」命令退出容器

運行docker comit 命令, 進行保存

docker commit 61412230ae46 own-apache2

docker commit 命令參數說明

命令格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

-a, --author=        提交的鏡像做者

-c, --change=[]    Apply Dockerfile instruction to the created image, 沒用過

-m, --message=   提交時的說明文字

-p, --pause=true  在commit時,將container 暫停

CONTAINER:

可使用container 的名字或者ID

REPOSITORY

指定鏡像倉庫,上述例子中,指定的是本地存儲

能夠指定遠程鏡像倉庫,如docker hub。也可自建倉庫來存放image

TAG:

鏡像TAG

docker build

使用docker build建立鏡像須要編寫Dockerfile.

步驟:

編寫本身的Dcokerfile

運行docker build 命令打包鏡像

仍然以apache打包爲例子。如下是Dockerfile的例子

FROM ubuntu:latest

MAINTAINER sky

#Add 163 mirror for apt

ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \        s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \        s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]

編輯完成後,在與Dockerfile同一目錄下運行docker build 命令

docker build -t apache-img .

若是沒有命令出錯,docker build會持續運行直到鏡像建立完成

而建立的過程本質上是運行一個鏡像,而後在鏡像中按序執行在Dockerfile中的命令,直到執行結束。

若是中間有命令執行失敗,鏡像建立會中止。這時就須要看log,並修改Dockerfile,而後再次執行docker build

注:兩種鏡像建立方式的對比:

docker commit

docker build

難度相對容易,適合新手和對Linux不熟悉的用戶相對難,要求有必定的linux和腳本基礎知識

文檔化

文檔化在經過其餘文件來實現

Dockerfile自己就是比較好的文檔,可讀和可理解性比較強。也可配合其餘文檔帶來詳細說明

升級,維護

後續升級和維護麻煩,須要再次運行鏡像並對內部軟件進行升級或者安裝新軟件增長特性

後續升級和維護會相對簡單,能夠直接在dockerfile中更改並增長新特性

具體選擇哪一種方式來製做鏡像須要結合實際狀況來選擇

Dockerfile 關鍵字詳解

FROM

FROM用來指定基礎包。在上面的例子中,基礎包用的是ubuntu。

MAINTAINER

鏡像做者信息,或者維護人員信息

ADD

將文件拷貝到Container內文件系統對應的路徑

格式 ADD <src file> <dst file>

全部拷貝到Container中的文件和文件夾權限爲0755,uid和gid爲0

若是須要修改owner用戶或者權限,須要使用RUN進行修改

ADD文件,文件路徑要在docker build<PATH>中指定的<PATH>下

RUN

建立鏡像時執行

ENV

用來設置環境變量

EXPOSE

Container內部服務開啓的端口

主機上若是要使用,還須要在啓動Container時,作host-container的商品映射

使用EXPOSE後,一些自動化佈署工具能夠直接讀取這個信息,自動進行端口映射

EXPOSE能夠有多條,指定多個端口

WORKDIR

切換工做目錄,可進行屢次切換(至關於cd命令)

切換目錄對RUN,CMD,ENTRYPOINT有效

USER

執行container的用戶,如未指定,則默認使用root用戶

ENTRYPOINT

Container啓動時執行的命令,一個Dockerfile中只能有一條ENTRYPOINT

ENTRYPOINT沒有CMD的可替換特性

CMD

Container 啓動時執行的命令,一個Dockerfile 中只能有一條CMD命令,若是有多條則只執行最後一條CMD

若是有多條命令但願在啓動後執行,能夠考慮使用shell 腳本

與ENTRYPOINT的區別

CMD的主要用途是爲可執行的container提供默認命令

CMD在運行時是可替換的,好比

在ubuntu中,CMD指定的是/bin/bash。默認狀況下運行ubuntu,container中的/bin/bash會被執行

若是使用docker run指定運行命令,那CMD會被替換掉

如:docker run ubuntu /bin/echo "this is a echo". 這時,container 啓動後會執行echo 而不是/bin/bash了

ENTRYPOINT是不會替換的,若是在ubuntu鏡像中加入ENTRYPOINT,那ENTRYPOINT在啓動後會先被執行

CMD能夠爲ENTRYPOINT來提供參數

例子:

FROM ubuntu:14.10  

ENTRYPOINT ["top", "-b"]   

CMD ["-c"]

VOLUME

語法:VOLUME [PATH]

VOLUME指令用來設置一個掛載點,能夠用來讓其餘容器掛載以實現數據共享或對容器數據的備份、恢復或遷移

能夠將本地文件夾或者其餘Container的文件夾掛載到Container中

相關文章
相關標籤/搜索