Docker構(gòu)建鏡像

文章首發(fā)于微信公眾號(hào)《程序員果果》
地址:https://mp.weixin.qq.com/s/foVeANf0imgU4hfOempp3A

創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站制作、做網(wǎng)站、App定制開(kāi)發(fā)重慶小程序開(kāi)發(fā)公司、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

構(gòu)建Docker鏡像有以下兩種方法:

  • 使用docker commit命令,從容器創(chuàng)建一個(gè)新的鏡像。
  • 使用docker build命令和 Dockerfile 文件。

一、通過(guò)commit命令創(chuàng)建鏡像

語(yǔ)法

docker commit 容器ID:tag

OPTIONS說(shuō)明:

  • -a :提交的鏡像作者;

  • -c :使用Dockerfile指令來(lái)創(chuàng)建鏡像;

  • -m :提交時(shí)的說(shuō)明文字;

  • -p :在commit時(shí),將容器暫停。

實(shí)例

我們獲取一nginx的鏡像,修改nginx的歡迎頁(yè)面,之后重新構(gòu)建成新鏡像。

#下載鏡像
docker pull nginx
#運(yùn)行鏡像
docker run -it -d -p 81:80  --name mynginx nginx

我們?cè)L問(wèn)127.0.0.1:81 如下:

Docker 構(gòu)建鏡像

下載我們來(lái)修改nginx的歡迎頁(yè)

#進(jìn)入容器
docker exec -it mynginx /bin/bash
#更新源
apt-get update
#安裝vim
apt-get install -y vim
#修改歡迎頁(yè)的title為 "Welcome to nginx , ha ha ha!"

我們刷新訪問(wèn)127.0.0.1:81如下:

Docker 構(gòu)建鏡像

那么現(xiàn)在修改把修改過(guò)的容器,重新構(gòu)件成新的鏡像。

docker commit -a "程序員果果" -m "my nginx" mynginx:v1

之后,我們查看下本地鏡像列表,可以發(fā)現(xiàn)已經(jīng)存在我們構(gòu)件的新鏡像。

Docker 構(gòu)建鏡像

二、通過(guò) Dockerfile 創(chuàng)建鏡像

我們先看個(gè)Dockerfile文件實(shí)例:

# Version: 0.0.1
FROM ubuntu:latest
MAINTAINER gf "gf@163.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80
構(gòu)建
docker build -f /path/Dockerfile

Dockerfile由一系列指令和參數(shù)組成。每條指令都必須為大寫(xiě)字母,切后面要跟隨一個(gè)參數(shù)。Dockerfile中的指令會(huì)按照順序從上到下執(zhí)行,所以應(yīng)該根據(jù)需要合理安排指令的順序。每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層并對(duì)鏡像進(jìn)行提交。Docker大體上按照如下流程執(zhí)行Dockerfile中的指令。

Dockerfile構(gòu)建構(gòu)過(guò)程:

  • 從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
  • 執(zhí)行一條指令,對(duì)容器做出修改
  • 執(zhí)行類似docker commit 的操作,提交一個(gè)新的鏡像層
  • 再基于剛提交的鏡像運(yùn)行一個(gè)新容器
  • 執(zhí)行Dockerfile中的下一條指令,直至所有指令執(zhí)行完畢

從上面可以看出,如果你的Dockerfile由于某些原因(如某條指令失敗了)沒(méi)有正常結(jié)束,那你也可以得到一個(gè)可以使用的鏡像。這對(duì)調(diào)試非常有幫助:可以基于該鏡像運(yùn)行一個(gè)具備交互功能的容器,使用最后創(chuàng)建的鏡像對(duì)為什么你的指令會(huì)失敗進(jìn)行調(diào)試。

Dockerfile也支持注釋。以#開(kāi)頭的行都會(huì)被認(rèn)為是注釋,# Version: 0.0.1這就是個(gè)注釋。

Dockerfile指令

1. FROM

指定基礎(chǔ)鏡像,必須為第一個(gè)命令。

格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM MySQL:5.6
注:
  tag或digest是可選的,如果不使用這兩個(gè)值時(shí),會(huì)使用latest版本的基礎(chǔ)鏡像
2. MAINTAINER

維護(hù)者信息

格式:
    MAINTAINER <name>
示例:
    MAINTAINER san zhang
    MAINTAINER zhangsan@163.com
    MAINTAINER zs<gf@163.com>
3. RUN

構(gòu)建鏡像時(shí)執(zhí)行的命令。

RUN用于在鏡像容器中執(zhí)行命令,其有以下兩種命令執(zhí)行方式:

格式:
    用法1(shell模式) RUN <command>
    用法1(exec模式) RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令創(chuàng)建的中間鏡像會(huì)被緩存,并會(huì)在下次構(gòu)建中使用。如果不想使用這些緩存鏡像,可以在構(gòu)建時(shí)指定--no-cache參數(shù),如:docker build --no-cache
4. ADD

將本地文件添加到容器中,tar類型文件會(huì)自動(dòng)解壓,可以訪問(wèn)網(wǎng)絡(luò)資源,類似wget。

格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路徑
示例:
    ADD hom* /mydir/          # 添加所有以"hom"開(kāi)頭的文件
    ADD hom?.txt /mydir/      # ? 替代一個(gè)單字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
5. COPY

功能類似ADD,但是不會(huì)自動(dòng)解壓文件,也不能訪問(wèn)網(wǎng)絡(luò)資源。

格式:
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"] 用于支持包含空格的路徑
示例:
    COPY hom* /mydir/          # 添加所有以"hom"開(kāi)頭的文件
    COPY hom?.txt /mydir/      # ? 替代一個(gè)單字符,例如:"home.txt"
    COPY test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    COPY test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
注:
    如果單純復(fù)制文件,Docker 推薦適用COPY
6. ENTRYPOINT

配置容器,使其可執(zhí)行化。配合CMD可省去"application",只使用參數(shù)。

格式:
    用法1(exec模式) ENTRYPOINT ["executable", "param1", "param2"]
    用法2(shell模式) ENTRYPOINT command param1 param2
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT與CMD非常類似,不同的是通過(guò)docker run執(zhí)行的命令不會(huì)覆蓋ENTRYPOINT,而docker run命令中指定的任何參數(shù),都會(huì)被當(dāng)做參數(shù)再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個(gè)ENTRYPOINT命令,多指定時(shí)會(huì)覆蓋前面的設(shè)置,而只執(zhí)行最后的ENTRYPOINT指令。
    所以可以指定ENTERYPOINT和CMD組合使用 通過(guò)ENTERYPOINT指定命令,CMD指定命令的參數(shù)
7. CMD

指定容器運(yùn)行時(shí)的命令。

格式:
    用法1(exec模式) ENTERYPOINT ["executable" , "param1" , "param2"] 
    用法2(shell模式) ENTERYPOINT command param1 param2
示例:
    CMD [ "sh", "-c", "echo $HOME" ]
8. EXPOSE

指定運(yùn)行改鏡像的容器使用的端口。

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
注:
  但是docker 容器處于安全的考慮并不會(huì)打開(kāi)指定端口,而是需要在使用的時(shí)候 ,通過(guò) -p 打開(kāi)
    例如 $docker run -p 80 -d huanchupk/df_test1 nginx -g "daemon off"
9. ENV

設(shè)置環(huán)境變量。

格式:
    ENV <key> <value>
    ENV <key>=<value> ...
示例:
    ENV myName gf
    ENV myAddress shanghai
10. VOLUME

向容器中添加卷(指定持久化目錄)。

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一個(gè)卷可以存在于一個(gè)或多個(gè)容器的指定目錄,該目錄可以繞過(guò)聯(lián)合文件系統(tǒng),并具有以下功能:
    1. 卷可以容器間共享和重用
    2. 容器并不一定要和其它容器共享卷
    3. 修改卷后會(huì)立即生效
    4. 對(duì)卷的修改不會(huì)對(duì)鏡像產(chǎn)生影響
    5. 卷會(huì)一直存在,直到?jīng)]有任何容器在使用它
11. WORKDIR

從鏡像創(chuàng)建一個(gè)新容器時(shí),在容器中設(shè)置工作目錄(類似于cd命令)。

格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (這時(shí)工作目錄為/a)
    WORKDIR b  (這時(shí)工作目錄為/a/b)
    WORKDIR c  (這時(shí)工作目錄為/a/b/c)
注:
  通過(guò)WORKDIR設(shè)置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會(huì)在該目錄下執(zhí)行。在使用docker run運(yùn)行容器時(shí),可以通過(guò)-w參數(shù)覆蓋構(gòu)建時(shí)所設(shè)置的工作目錄。
12. USER

鏡像由什么用戶執(zhí)行,如果不指定默認(rèn)以root用戶執(zhí)行。

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www
 注:
  使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構(gòu)建完成后,通過(guò)docker run運(yùn)行容器時(shí),可以通過(guò)-u參數(shù)來(lái)覆蓋所指定的用戶。
13. ARG

用于指定傳遞給構(gòu)建運(yùn)行時(shí)的變量。

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
14. ONBUILD

用于設(shè)置鏡像觸發(fā)器。

格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  當(dāng)所構(gòu)建的鏡像被用做其它鏡像的基礎(chǔ)鏡像,該鏡像中的觸發(fā)器將會(huì)被觸發(fā)

Dockerfile 實(shí)例

# This my first nginx Dockerfile
# Version 1.0

# Base images 基礎(chǔ)鏡像
FROM centos

#MAINTAINER 維護(hù)者信息
MAINTAINER tianfeiyu 

#ENV 設(shè)置環(huán)境變量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在當(dāng)前目錄下,拷過(guò)去會(huì)自動(dòng)解壓
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 執(zhí)行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相當(dāng)于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 運(yùn)行以下命令
CMD ["nginx"]

最后用一張圖解釋常用指令的意義:

Docker 構(gòu)建鏡像

參考資料: Dockerfile文件詳解

名稱欄目:Docker構(gòu)建鏡像
瀏覽路徑:http://bm7419.com/article38/ijpgpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)定制開(kāi)發(fā)、網(wǎng)站排名網(wǎng)站設(shè)計(jì)公司、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作