日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker之Dockerfile详解

發(fā)布時間:2023/12/4 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker之Dockerfile详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用Dockerfile創(chuàng)建鏡像

  • Dockerfile是一個文本格式的配置文件,我們可以利用Dockerfile來快速的創(chuàng)建一個自定義的鏡像。
基本結(jié)構(gòu)
  • Dockerfile由一行命令語句組成,并且支持以#開頭的注釋
  • 一般包括四個部分:基礎(chǔ)鏡像信息,維護(hù)者信息,鏡像操作指令,容器啟動時執(zhí)行指令,如下一個案例
# This Dockerfile uses the ubuntu image # VERSION 2 - EDITION 1 # Author: docker_user # Command format: Instruction [arguments / command] .. # Base image to use, this must be set as the first line FROM ubuntu # Maintainer: docker_user <docker_user at email.com> (@docker_user) MAINTAINER docker_user docker_user@email.com # Commands to update the image RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/ sources.list RUN apt-get update && apt-get install -y nginx RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf # Commands when creating a new container CMD /usr/sbin/nginx
  • 如上是一個官網(wǎng)的Demo,一開始指定所基于的鏡像名稱,之后是維護(hù)者的信息,后面才是鏡像操作的指令,例如RUN指令將對鏡像執(zhí)行跟隨在后面的命令,CMD用來指定運(yùn)行容器時候的操作命令。
  • 如下是一個更復(fù)雜一點(diǎn)的案例,基于buildpack-deps:jessie-scm基礎(chǔ)鏡像,安裝Golang相關(guān)環(huán)境,制作一個GO語言的運(yùn)行環(huán)境鏡像(先看看就行):
FROM buildpack-deps:jessie-scm # gcc for cgo RUN apt-get update && apt-get install -y --no-install-recommends \ g++ \ gcc \ libc6-dev \ make \ && rm -rf /var/lib/apt/lists/* ENV GOLANG_VERSION 1.6.3 ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz ENV GOLANG_DOWNLOAD_SHA256 cdde5e08530c0579255d6153b08fdb3b8e47caabbe717bc7bcd 7561275a87aeb RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ && echo "$GOLANG_DOWNLOAD_SHA256 golang.tar.gz" | sha256sum -c - \ && tar -C /usr/local -xzf golang.tar.gz \ && rm golang.tar.gz ENV GOPATH /go ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH COPY go-wrapper /usr/local/bin/
指令說明
  • FROM
    • 指定所創(chuàng)建鏡像的基礎(chǔ)鏡像,如果本地不存在,默認(rèn)去Docker Hub上下載,格式:FROM < image>
    • 任何一個Dockerfile中第一條指令必須是FROM,并且,如果在同一個Dockerfile中創(chuàng)建多個鏡像,可以用多個FROM指令
  • MAINTAINER
    • 指定維護(hù)者信息,格式MAINTAINER< name>。信息會寫入生成鏡像的Author屬性域中例如:
    MAINTAINER ljmadmin@docker.com
  • RUN
    • 運(yùn)行指定命令格式如下
    • 上面第一個命令默認(rèn)將在shell中斷中運(yùn)行,即 /bin/sh -C ,后面的使用exec執(zhí)行不會啟動shell環(huán)境
    • 每一條RUN指令將在當(dāng)前鏡像的基礎(chǔ)上執(zhí)行指定的命令,并且提交為新的進(jìn)行,當(dāng)命令比較長的時候,可以用\ 來換行,比如:
    RUN <command> 或者 RUN ["executable", "param1","param2"], //案例 RUN apt-get update \&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \&& rm -rf /var/cache/apt
  • CMD
    • CMD指令用來指定啟動容器時候默認(rèn)執(zhí)行的命令,他支持三種格式:
      • CMD[“executable”, “param1”, “param2”] 使用exec執(zhí)行,是推薦使用的方式
      • CMD command param1 param2 在/bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用
      • CMD [“param1”, “param2”]提供給ENTRYPOINT的默認(rèn)數(shù)
    • 每個DOckerfile只能有一條CMD命令,如果指定多條,最后一條覆蓋之前的
  • LABEL
    • LABEL指令用來指定生成鏡像的元數(shù)據(jù)標(biāo)簽信息
    • 格式為如下例如
    LABEL<key> = <value><key>=<value>.... //案例 LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."
  • EXPOSE
    • 聲明鏡像內(nèi)服務(wù)所監(jiān)聽的端口
    • 格式如下。 例如
    EXPOSE <port>[ <port>......] //案例 EXPOSE 22 80 8443
    • 改指令只是起到聲明作用,不會自動完成端口映射
    • 啟動容器時候需要使用-P,Docker主機(jī)會自動分配一個宿主機(jī)臨時端口轉(zhuǎn)發(fā)到指定的端口,使用-p,則可以具體的指定哪個宿主機(jī)本地端口會映射過來。
  • ENV
    • 指定環(huán)境變量,在鏡像生成過程中會被后續(xù)RUN指令使用,在鏡像啟動的容器中也會存在
    • 格式…。如下:
    ENV <key><value> 或者 EVN <key>=<value> //案例 ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3.4 RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/ postgress && … ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
    • 指令指定的環(huán)境變量在運(yùn)行時可以被覆蓋掉,比如docker run --evn< key>=< value>built_image
  • ADD
    • 該命令將復(fù)制指定額< src> 路徑下的內(nèi)容到容器中的< dest> 路徑下,格式如下
    • 其中< src> 可以是Dockerfile所在的目錄的一個相對路徑,也可以是一個URL,還可以是一個tar文件。< desc>可以使鏡像內(nèi)部的絕對路徑,或者相對于工作目錄的相對路徑。
    ADD <src><desc>
  • COPY
    • 格式如下,復(fù)制本地主機(jī)的< src> (為Dockerfile所在目錄的相對路徑,文件,或者目錄) 下的內(nèi)容 到鏡像中的< dest> 下。目標(biāo)路徑不存在時候回自動創(chuàng)建 。路徑支持正則,當(dāng)使用本地目錄為源目錄時候,推薦使用COPY
    COPY<src><desc>
  • ENTRYPOINT
    • 指定鏡像的默認(rèn)入口命令,該入口命令會在啟動容器時候作為命令執(zhí)行,所有傳入值作為改命令的參數(shù),支持如下兩種格式
    ENTRYPOINT ["executable", "param1", "param2"](exec調(diào)用執(zhí)行) ENTRYPOINT command param1 param2(shell中執(zhí)行)
    • 每個Dockerfila中只能有一個ENTRYPOINT,當(dāng)指定過個時候,只有最后一個有效,在運(yùn)行時候可以被–entrypoint參數(shù)覆蓋掉,如docker run–entrypoint
  • VOLUME
    • 創(chuàng)建一個數(shù)據(jù)卷掛載點(diǎn), 可以從本地主機(jī)或者其他容器掛載數(shù)據(jù)卷,一般用來存放數(shù)據(jù)庫和需要保存的數(shù)據(jù)等。格式如下
    VULUME ["/data"]
  • USER
    • 指定運(yùn)行容器時候的用戶名或者UID,后續(xù)的RUN等指令也會使用指定的用戶身份格式如下:
    USER daemon //案例 RUN groupadd -r postgres && useradd -r -g postgres postgres
    • 需要臨時獲取管理員權(quán)限可以使用gosu或者sudo
  • WORKDIR
    • 為后續(xù)的RUN,CMD和ENTRYPOINT指令配置工作目錄,格式如下
    WORKDIR /path/to/workdir //案例 WORKDIR /a WORKDIR b WORKDIR c RUN pwd
    • 如上案例,可以使用多個WORKDIR指令,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑。最終的路徑為/a/b/c
  • ARG
    • 指定一些鏡像內(nèi)使用的參數(shù)(例如版本號信息等),這些參數(shù)在執(zhí)行docker build命令時以下格式傳入
    ARG<name>[=<default value>] //案例 docker build--build-arg<name>=<value>
  • ONBUILD
    • 配置當(dāng)所有創(chuàng)建的鏡像作為其他鏡像的基礎(chǔ)鏡像時,所執(zhí)行的創(chuàng)建操作指令,格式如下:
    ONBUILD [INSTRUCTION] //Dockerfile使用如下內(nèi)容創(chuàng)建鏡像image-A [...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bing/python-build --dir /app/src [...]
    • 如果基于image-A創(chuàng)建新的鏡像時候,新的Dockerfile使用FROM image-A指定基礎(chǔ)進(jìn)行,會自動執(zhí)行ONBUILD指令的內(nèi)容,等價于在后面添加了兩條指令,如下:
    FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src
    • 使用ONBUILD指令的鏡像,推薦在邊去中注明,例如ruuby:1.9-onbuild
  • STOPSIGNAL
    • 指定所創(chuàng)建的鏡像啟動的容器接受退出的信號值,例如:
    STOPSIGNAL signal
  • HEALTHCHECK
    • 配置所啟動容器如何進(jìn)行健康檢查(如何判斷健康與否),自Docker1.12開始支持,格式如下:
    HEALTHCHECK [OPTIONS] CMS command :根據(jù)執(zhí)行命令返回值是否為0 判斷 HEALTHCHECK NONE : 禁止基礎(chǔ)鏡像中的監(jiān)看檢查
    • OPTION參數(shù)支持如下:
      • __interval=DURATION(默認(rèn)30s):過多久檢查一次
      • __timeout=DURATION(默認(rèn)30s):每次檢查等待結(jié)果的超時
      • __retries=N(默認(rèn)為3):如果失敗,重試幾次才最終確定失敗。
    創(chuàng)建鏡像
    • 編寫完Dockerfile后,可以通過docker build命令來創(chuàng)建鏡像,基礎(chǔ)格式如下:
    docker build [選項(xiàng)]
    • 如上命令將讀取指定路徑下(包括子目錄)的Dockerfile文件,并將該路勁下所有內(nèi)容發(fā)送給Docker 服務(wù)端,由服務(wù)端來創(chuàng)建鏡像,因此除非生成鏡像需要,否則一般建議放置Dockerfile的目錄為空目錄。
      • 如果使用非內(nèi)容路徑下Dockerfile,可以通過-f 選項(xiàng)指定其他路徑
      • 要指定生成鏡像的便簽可以用-t 選項(xiàng)
    • 案例:指定Dockerfile路徑/tmp/docker_builder/,并且生成鏡像標(biāo)簽為build_repo/first_image,命令如下
    docker build -t build_repo/first_image /temp/docker_builder
    使用.dockerignore文件
    • 上說的,Dockerfile路徑下的所有文件都會發(fā)到Docker服務(wù)端打包,那肯定有響應(yīng)的規(guī)避措施,
    • 我們通過.dockerignore文件(沒一行添加一條匹配模式)來讓Docker忽略匹配模式路徑下的目錄和文件。如下:
    #comment*/temo**/*/temp*tmp?~*

    Dockerfile實(shí)戰(zhàn)測試

    • 以下將分別通過docker commit命令方式,Dockerfile的方式分別為鏡像添加SSH服務(wù)并且生成新的鏡像文件,來對象兩者的區(qū)別,
    通過docker commit 方式創(chuàng)建鏡像
    • Docker提供了docker commit 命令,支持用戶提交自己對指定容器的修改,并且生成新的鏡像在本地。格式如下:
    docker commit CONTAINER [REPOSITORY[:TAG]]
    • 如下步驟依次執(zhí)行:
    //使用ubuntu:lasted docker run -it ubuntu:lasted /bin/bash //更新apt緩存,并安裝openssh-server apt-get update; apt-get install openssh-server -y //如需正常啟動SSH服務(wù),則目錄/var/run/sshd必須存在,手動創(chuàng)建,并啟動SSH服務(wù) mkdir -p /var/run/sshd /usr/sbin/ssh -D & //修改SSH服務(wù)的安全登錄配置,取消pam登錄限制 sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd //在root賬戶下創(chuàng)建.ssh目錄,并負(fù)責(zé)需要登錄的公鑰(公鑰信息一般為本機(jī)主機(jī)用戶目錄下.ssh/id_rsa.pub文件,可由ssh-keygen-t rsa命令生成)到authorized_keys文件中: mkdir root/.ssh vi /root/.ssh/authorized_keys //創(chuàng)建自動啟動ssh服務(wù)的可執(zhí)行文件run.sh,并添加權(quán)限: vi /run.sh chmod +x run.sh //編輯內(nèi)容 #!/bin/bash /usr/sbin/sshd -D //退出容器 exit //保存鏡像 docker commit [CONTAINER ID] sshd:ubuntu //使用docker images查看本地生成的鏡像sshd:ubuntu,目前擁有鏡像信息如下截圖 //使用鏡像 docker run -p 10022:22 -d ssh:ubuntu /run.sh //啟動成功后可以在宿主機(jī)上看到容器運(yùn)行的詳細(xì)信息 docker ps //可以通過該宿主機(jī)ip訪問,通過ssh 10022 端口登錄容器 ssh 192.168.*.* -p 10022

    使用Dockerfile創(chuàng)建
    • 依次按如下步驟
    //創(chuàng)建工作目錄sshd_ubuntu工作目錄 mkdir sshd_ubuntu //在其中創(chuàng)建Dockerfile和run.sh文件 cd /sshd_ubuntu/ touch Dockerfile run.sh //編寫run.sh腳本和authorized_key文件 #!/bin/bash /usr/sbin/sshd -d //在宿主機(jī)上生成SSH秘鑰對,并創(chuàng)建authorized_keys文件: ssh-keygen -t rsa .... cat ~/.ssh/id_rsa.pub > authorized_keys
    • 編寫Dockerfile,下面是Dockerfile的內(nèi)容以及部分的解釋信息,可以對比docker commit 命令創(chuàng)建的過程,操作基本一致:
    #設(shè)置基礎(chǔ)鏡像 FROM ubuntu:latest #提供一些作者信息 MAINTAINER ljmadmin (645121107@qq.com) #下面開始運(yùn)行更新命令 RUN apt-get update #安裝ssh服務(wù) RUN apt-get install -y openssh-server RUN mkdir -p /var/run/sshd RUN mkdir -p /root/.ssh #取消pam限制 RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd #復(fù)制配置文件到相應(yīng)位置,并賦予可執(zhí)行權(quán)限 ADD authorized_keys /root/.ssh/authorized_keys ADD run.sh /run.sh RUN chmod 755 /run.sh #開放端口 EXPOSE 22 #設(shè)置自啟動命令 CMD ["/run.sh"]
    • 創(chuàng)建鏡像:在sshd_ubuntu目錄下使用docker build命令創(chuàng)建鏡像,
    cd sshd_ubuntu docker build -t ssh:Dockerfile .
    • 查看本地ssh:Dockerfile鏡像已經(jīng)存在:
    • 測試啟動鏡像運(yùn)行容器效果與上面一致

    總結(jié)

    • Dockerfile使用前需要熟悉每個命令,多實(shí)踐,自己寫一些簡單的案例測試,弄清楚原理在寫,Docker Hub官方倉庫有很多優(yōu)秀鏡像對應(yīng)的Dockerfile可以借鑒學(xué)習(xí)
    • 創(chuàng)建原則有如下幾個:
      • 精簡鏡像用途:
      • 選合適基礎(chǔ)鏡像
      • 提供足夠清晰的命令注釋和維護(hù)者信息
      • 正確使用版本號碼
      • 減少鏡像層數(shù)
      • 及時刪除臨時文件和緩存文件
      • 提高生成速度
      • 調(diào)整合理的指令順序
      • 減少外部源干擾

    上一篇:Docker中數(shù)據(jù)管理
    下一篇:Docker容器實(shí)戰(zhàn)思維

    總結(jié)

    以上是生活随笔為你收集整理的Docker之Dockerfile详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。