最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Dockerfile創(chuàng)建鏡像過(guò)程

 更新時(shí)間:2025年07月24日 10:56:47   作者:LKAI.  
本文介紹Docker安裝及鏡像分類,詳解Dockerfile指令如FROM、RUN、CMD等,涵蓋制作鏡像步驟與優(yōu)化技巧,如減少分層和清理數(shù)據(jù),適用于自定義鏡像構(gòu)建實(shí)踐

實(shí)驗(yàn)環(huán)境

安裝好Docker服務(wù)

一、容器鏡像分類

1、操作系統(tǒng)類

CentOS、Ubuntu

在dockerhub下載或自行制作

示例:把操作系統(tǒng)的文件系統(tǒng)打包生成鏡像

1)開(kāi)啟最小化安裝的CentOS

2)打包制作CentOS鏡像

tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.tar /

  • --numeric-owner:以數(shù)字形式保存文件的所有者和組信息,而不是名稱。這在跨系統(tǒng)打包時(shí)非常有用。
  • --exclude=/proc:排除 /proc 目錄。/proc 是一個(gè)虛擬文件系統(tǒng),包含系統(tǒng)運(yùn)行時(shí)的進(jìn)程信息,不適合打包。
  • --exclude=/sys:排除 /sys 目錄。/sys 是另一個(gè)虛擬文件系統(tǒng),包含內(nèi)核和設(shè)備的運(yùn)行時(shí)信息,也不適合打包。
  • -c:創(chuàng)建新的歸檔文件。
  • -v:顯示詳細(xì)輸出,列出正在處理的文件。
  • -f centos7.tar:指定歸檔文件名為 centos7.tar。
  • /:指定要打包的根目錄

3)導(dǎo)入制作的鏡像

docker import centos7.tar centos7:v1

cat centos7.tar | docker import - centos7:v1
docker images

4)使用制作的鏡像開(kāi)啟容器

docker run -it centos7:v1 /bin/bash

yum -y install httpd

啟動(dòng)http服務(wù)

/usr/sbin/apachectl

ctrl+p+q

2、應(yīng)用類

Tomcat、Nginx、MySQL、Redis

下載、制作均可

為滿足不同環(huán)境需求,我們經(jīng)常自己制作

二、利用Dockerfile制作鏡像

1、Dockerfile介紹

Dockerfile是一種能夠被Docker程序解釋的腳本

Dockerfile由一條一條的指令組成,并且有自己的書(shū)寫(xiě)格式和支持的命令,當(dāng)需要在容器鏡像中指定自己額外的需求時(shí),只需在Dockerfile上添加或修改指令,然后通過(guò)docker build生成我們自定義的容器鏡像。

2、Dockerfile指令

(1)構(gòu)建類指令:用于構(gòu)建image

其指定的操作不會(huì)運(yùn)行在image的容器上執(zhí)行

如:FROM、MAINTAINER、RUN、ENV、ADD、COPY

(2)設(shè)置類指令:用于設(shè)置image的屬性

其指定的操作將運(yùn)行image的容器中執(zhí)行

如:CMD、ENTRYPOINT、USER、EXPOSE、WORKDIR、VOLUME

對(duì)應(yīng)指令說(shuō)明:

  • FROM            構(gòu)建新鏡像基于的基礎(chǔ)鏡像(必須為第一條指令)
  • RUN              執(zhí)行命令,通常用于安裝軟件或運(yùn)行腳本
  • COPY             將文件或目錄從主機(jī)復(fù)制到鏡像中
  • ADD              類似 COPY,但支持自動(dòng)解壓 tar 文件和從 URL 下載文件
  • ENV               設(shè)置環(huán)境變量
  • USER             指定運(yùn)行后續(xù)指令的用戶
  • EXPOSE         聲明容器運(yùn)行時(shí)監(jiān)聽(tīng)的端口(容器內(nèi)打開(kāi)的端口)
  • WORKDIR      設(shè)置工作目錄,后續(xù)指令默認(rèn)在該目錄下執(zhí)行
  • CMD              指定容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令(可以被 docker run 覆蓋)
  • ENTRYPOINT       指定容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令(不會(huì)被 docker run 覆蓋,但可以追加參數(shù))

3、Dockerfile指令的詳細(xì)解釋

(1)FROM

  • FROM指令用于指定其后構(gòu)建新鏡像所使用的基礎(chǔ)鏡像。
  • FROM指令必是Dockerfile文件中的首條命令。
  • FROM指令指定的基礎(chǔ)image可以是官方遠(yuǎn)程倉(cāng)庫(kù)中的,也可以位于本地倉(cāng)庫(kù),優(yōu)先本地倉(cāng)庫(kù)。

(2)RUN

RUN指令用于在構(gòu)建鏡像中執(zhí)行命令,有以下兩種格式:

shell格式

  • 格式:RUN <命令>
  • 例:RUN echo 'test' > /var/www/html/index.html

exec格式

  • 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
  • 例:RUN ["/bin/bash", "-c", "echo test > /var/www/html/index.html"]

注意:

按優(yōu)化的角度來(lái)講,當(dāng)有多條要執(zhí)行的命令時(shí),不要使用多條RUN,盡量使用&&符號(hào)與\符號(hào)連接成一行,因?yàn)槎鄺lRUN命令會(huì)讓鏡像建立多層

例如:

RUN yum install httpd httpd-devel -y
RUN echo test > /var/www/html/index.html

可以改成

RUN yum install httpd httpd-devel -y && echo test > /var/www/html/index.html

或者改成

RUN yum install httpd httpd-devel -y \ && echo test > /var/www/html/index.html

(3)CMD

CMD不同于RUN,CMD用于指定在容器啟動(dòng)時(shí)所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時(shí)所要執(zhí)行的命令。

格式有三種:

CMD ["executable","param1","param2"]

CMD ["param1","param2"]

CMD command param1 param2

每個(gè)Dockerfile只能有一條CMD命令,如果指定了多條命令,只有最后一條會(huì)被執(zhí)行;如果用戶啟動(dòng)容器時(shí)候指定了運(yùn)行的命令,則會(huì)覆蓋掉CMD指定的命令。

什么是啟動(dòng)容器時(shí)指定運(yùn)行的命令?

# docker run -d -p 80:80 鏡像名 運(yùn)行的命令

(4)EXPOSE

EXPOSE指令用于指定容器在運(yùn)行時(shí)監(jiān)聽(tīng)的端口

  • 格式:EXPOSE <port> [<port>...]
  • 例:EXPOSE 80 3306 8080

上述運(yùn)行的端口還需要使用docker run運(yùn)行容器時(shí)通過(guò)-p參數(shù)映射到宿主機(jī)的端口。

(5)ENV

ENV指令用于指定一個(gè)環(huán)境變量。

  • 格式:ENV <key> <value> 或者 ENV <key>=<value>
  • 例:ENV JAVA_HOME /usr/local/jdkxxxx/

(6)ADD

ADD指令用于把宿主機(jī)上的文件拷貝到鏡像中。

  • 格式:ADD <src> <dest>
  • <src>可以是一個(gè)本地文件或本地壓縮文件,還可以是一個(gè)url,如果把<src>寫(xiě)成一個(gè)url,那么ADD就類似于wget命令
  • <dest>路徑的填寫(xiě)可以是容器內(nèi)的絕對(duì)路徑,也可以是相對(duì)于工作目錄的相對(duì)路徑

(7)COPY

COPY指令與ADD指令類似,但COPY的源文件只能是本地文件或目錄

  • 格式:COPY <src> <dest>

(8)ENTRYPOINT

ENTRYPOINT與CMD非常類似

相同點(diǎn):

  • 一個(gè)Dockerfile只寫(xiě)一條,如果寫(xiě)了多條,那么只有最后一條生效,都是容器啟動(dòng)時(shí)才運(yùn)行

不同點(diǎn):

  • 如果用戶啟動(dòng)容器時(shí)候指定了運(yùn)行的命令,ENTRYPOINT不會(huì)被運(yùn)行的命令覆蓋,而CMD則會(huì)被覆蓋。

格式有兩種:

ENTRYPOINT      ["executable", "param1", "param2"]
ENTRYPOINT      command param1 param2

(9)VOLUME

VOLUME指令用于把宿主機(jī)里的目錄與容器里的目錄映射指定掛載點(diǎn),docker宿主機(jī)映射的目錄為自動(dòng)生成的。

  • 格式:VOLUME  ["<mountpoint>"]

(10)USER

USER指令設(shè)置啟動(dòng)容器的用戶,即程序用戶

像hadoop需要hadoop用戶操作;oracle需要oracle用戶操作,可以是用戶名或UID

如:

  • USER daemon
  • USER 1001

注意:

如果設(shè)置了容器以daemon用戶去運(yùn)行,那么RUN,CMD和ENTRYPOINT都會(huì)以這個(gè)用戶去運(yùn)行;鏡像構(gòu)建完成后,通過(guò)docker run運(yùn)行容器時(shí),可以通過(guò)-u參數(shù)來(lái)覆蓋指定的用戶

(11)WORKDIR

WORKDIR指令設(shè)置工作目錄,類似于cd命令,不建議使用RUN cd /root,建議使用WORKDIR

如:

  • WORKDIR /root

4、Dockerfile基本構(gòu)成

  • 基礎(chǔ)鏡像信息                FROM
  • 維護(hù)者信息                    MAINTAINER
  • 鏡像操作指令                RUN
  • 容器啟動(dòng)時(shí)執(zhí)行指令     CMD

三、Dockerfile生成容器鏡像方法

1、使用Dockerfile生成容器鏡像步驟

  • 第一步:創(chuàng)建一個(gè)文件夾(目錄)
  • 第二步:在文件夾(目錄)中創(chuàng)建Dockerfile文件及其它文件
  • 第三步:使用docker build命令構(gòu)建鏡像
  • 第四步:使用構(gòu)建的鏡像啟動(dòng)容器

2、使用Dockerfile生成Nginx容器鏡像

mkdir nginxdir

cd nginxdir

echo "nginx is running" > index.html

編寫(xiě)Dockerfile文件

vim Dockerfile

添加:

FROM centos:7

MAINTAINER "lkk"

RUN rm -rf /etc/yum.repos.d/*

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

RUN yum -y install wget

RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

RUN yum -y install nginx

ADD index.html /usr/share/nginx/html/

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

EXPOSE 80

CMD /usr/sbin/nginx

生成鏡像

docker build -t nginx:v1 .

3、使用Dockerfile生成容器鏡像優(yōu)化

(1)減少鏡像分層

Dockerfile中包含多種指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令時(shí),不建議每次安裝都使用一條單獨(dú)的RUN命令,可以把能夠合并安裝指令合并為一條,這樣就可以減少鏡像分層。

FROM centos:7

MAINTAINER lkk

RUN rm -rf /etc/yum.repos.d/*

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

RUN yum -y install epel-release

RUN yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz

RUN tar zxf php-5.6.36.tar.gz

RUN cd php-5.6.36

RUN ./configure --prefix=/usr/local/php

RUN make -j 4

RUN make install

優(yōu)化如下:

mkdir /root/phpdir
cd /root/phpdir

將php-5.6.27.tar.gz包上傳到/root/phpdir/

進(jìn)入/root/phpdir目錄

vim Dockerfile

添加:

FROM centos:7

MAINTAINER lkk

RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum -y install epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget

ADD ./php-5.6.27.tar.gz /

RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 4 && make install

-j(表示 job 的數(shù)目)參數(shù)可以對(duì)項(xiàng)目在進(jìn)行并行編譯。

make -j 4,讓make 最多允許 4 個(gè)編譯命令同時(shí)執(zhí)行,這樣可以更有效的利用 CPU 資源。在多核 CPU 上,適當(dāng)?shù)倪M(jìn)行并行編譯還是可以明顯提高編譯速度的,但并行的任務(wù)不宜太多,一般是以 CPU 的核心數(shù)目的兩倍為宜

(2)清理無(wú)用數(shù)據(jù)

一次RUN形成新的一層,如果沒(méi)有在同一層刪除,無(wú)論文件是否最后刪除,都會(huì)帶到下一層,所以要在每一層清理對(duì)應(yīng)的殘留數(shù)據(jù),減小鏡像大小。

把生成容器鏡像過(guò)程中部署的應(yīng)用軟件包做刪除處理

vim Dockerfile

添加粗體部分內(nèi)容:

FROM centos:7

MAINTAINER lkk

RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum -y install epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget && yum clean all && rm -rf /var/cache/yum/*

ADD ./php-5.6.27.tar.gz /

RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 16 && make install && rm -rf /php*

生成鏡像

docker build -t php:v1 .

四、通過(guò)Dockerfile方式創(chuàng)建tomcat鏡像

1、創(chuàng)建目錄準(zhǔn)備相關(guān)文件

mkdir tomcatdir
cd tomcatdir/
echo "tomcat test page" > index.html

上傳jdk-8u91-linux-x64.tar.gz包到tomcatdir目錄

2、編輯Dockerfile文件

vim Dockerfile

注意安裝版本(粗體部分)

添加:

FROM centos:7
MAINTAINER "lkk"
ENV VERSION=9.0.99
ENV JAVA_HOME=/usr/local/jdk
ENV TOMCAT_HOME=/usr/local/tomcat
ENV PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum -y install wget && \
    wget https://dlcdn.apache.org/tomcat/tomcat-9/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz --no-check-certificate && \
    tar xf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/ROOT
ADD ./index.html /usr/local/tomcat/webapps/ROOT/
ADD ./jdk-8u91-linux-x64.tar.gz /
RUN mv /jdk1.8.0_91/ /usr/local/jdk
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

3、構(gòu)建鏡像

docker build -t tomcat:v1 .

4、創(chuàng)建并啟動(dòng)容器

docker run -d -p 8080:8080 tomcat:v1

docker ps -a

curl 192.168.10.11:8080

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • docker容器數(shù)據(jù)卷之具名掛載和匿名掛載問(wèn)題

    docker容器數(shù)據(jù)卷之具名掛載和匿名掛載問(wèn)題

    容器數(shù)據(jù)卷就是目錄的掛載,將我們的容器的目錄掛載到宿主機(jī)上,從而實(shí)現(xiàn)打通宿主機(jī)和容器之間的文件共享功能,這篇文章主要介紹了docker容器數(shù)據(jù)卷 - 具名掛載和匿名掛載問(wèn)題,需要的朋友可以參考下
    2021-11-11
  • 基于安裝docker desktop失敗的解決方案

    基于安裝docker desktop失敗的解決方案

    這篇文章主要介紹了基于安裝docker desktop失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Docker安裝MySQL及授權(quán)遠(yuǎn)程訪問(wèn)的詳細(xì)教程

    Docker安裝MySQL及授權(quán)遠(yuǎn)程訪問(wèn)的詳細(xì)教程

    Docker是一種流行的容器化平臺(tái),可以簡(jiǎn)化應(yīng)用程序的部署和管理,下面這篇文章主要給大家介紹了關(guān)于Docker安裝MySQL及授權(quán)遠(yuǎn)程訪問(wèn)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn)

    Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn)

    Kubernetes用于協(xié)調(diào)高度可用的計(jì)算機(jī)集群,本文主要介紹了Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • docker搭建nginx的實(shí)現(xiàn)步驟

    docker搭建nginx的實(shí)現(xiàn)步驟

    本文主要介紹了docker搭建nginx的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Docker容器的創(chuàng)建、啟動(dòng)、和停止的方法

    Docker容器的創(chuàng)建、啟動(dòng)、和停止的方法

    這篇文章主要介紹了Docker容器的創(chuàng)建、啟動(dòng)、和停止的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • docker安裝zookeeper全過(guò)程

    docker安裝zookeeper全過(guò)程

    這篇文章介紹了在CentOS上使用Docker安裝Zookeeper的步驟,包括拉取鏡像、查看鏡像、啟動(dòng)容器、檢查容器狀態(tài)以及運(yùn)行客戶端
    2025-11-11
  • docker 重命名鏡像的實(shí)現(xiàn)方法

    docker 重命名鏡像的實(shí)現(xiàn)方法

    在Docker中無(wú)法直接重命名鏡像,但可通過(guò)添加新標(biāo)簽、刪除舊鏡像后重新拉取/構(gòu)建,或在Docker Compose中修改配置文件實(shí)現(xiàn)名稱變更,感興趣的可以了解一下
    2025-09-09
  • Docker容器使用方法詳解

    Docker容器使用方法詳解

    容器是基于鏡像創(chuàng)建的,容器中的進(jìn)程依賴于鏡像中的文件,那么本篇文章我們就來(lái)深入學(xué)習(xí)容器的基本操作方法,通過(guò)示例來(lái)加深各位看官對(duì)docker容器操作的理解以及記憶,需要的朋友可以參考下
    2022-07-07
  • docker安裝ElasticSearch:7.8.0集群的詳細(xì)教程

    docker安裝ElasticSearch:7.8.0集群的詳細(xì)教程

    這篇文章主要介紹了docker安裝ElasticSearch:7.8.0集群的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

武陟县| 阳朔县| 曲阳县| 黎川县| 辽中县| 陇川县| 东宁县| 盐池县| 瑞金市| 丰县| 南岸区| 平山县| 宜丰县| 金昌市| 张北县| 扎赉特旗| 桃源县| 仁怀市| 同仁县| 山西省| 伽师县| 安新县| 榆社县| 响水县| 鲁山县| 繁昌县| 安吉县| 云梦县| 扎囊县| 渭南市| 朔州市| 高雄县| 安西县| 巴林左旗| 芮城县| 罗城| 黄龙县| 南雄市| 姚安县| 德兴市| 沽源县|