欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

實驗環(huán)境

安裝好Docker服務(wù)

一、容器鏡像分類

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

CentOS、Ubuntu

在dockerhub下載或自行制作

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

1)開啟最小化安裝的CentOS

2)打包制作CentOS鏡像

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

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

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

docker import centos7.tar centos7:v1

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

4)使用制作的鏡像開啟容器

docker run -it centos7:v1 /bin/bash

yum -y install httpd

啟動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由一條一條的指令組成,并且有自己的書寫格式和支持的命令,當(dāng)需要在容器鏡像中指定自己額外的需求時,只需在Dockerfile上添加或修改指令,然后通過docker build生成我們自定義的容器鏡像。

2、Dockerfile指令

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

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

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

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

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

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

對應(yīng)指令說明:

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

3、Dockerfile指令的詳細解釋

(1)FROM

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

(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)化的角度來講,當(dāng)有多條要執(zhí)行的命令時,不要使用多條RUN,盡量使用&&符號與\符號連接成一行,因為多條RUN命令會讓鏡像建立多層

例如:

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用于指定在容器啟動時所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時所要執(zhí)行的命令。

格式有三種:

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

CMD ["param1","param2"]

CMD command param1 param2

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

什么是啟動容器時指定運行的命令?

# docker run -d -p 80:80 鏡像名 運行的命令

(4)EXPOSE

EXPOSE指令用于指定容器在運行時監(jiān)聽的端口

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

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

(5)ENV

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

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

(6)ADD

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

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

(7)COPY

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

  • 格式:COPY <src> <dest>

(8)ENTRYPOINT

ENTRYPOINT與CMD非常類似

相同點:

  • 一個Dockerfile只寫一條,如果寫了多條,那么只有最后一條生效,都是容器啟動時才運行

不同點:

  • 如果用戶啟動容器時候指定了運行的命令,ENTRYPOINT不會被運行的命令覆蓋,而CMD則會被覆蓋。

格式有兩種:

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

(9)VOLUME

VOLUME指令用于把宿主機里的目錄與容器里的目錄映射指定掛載點,docker宿主機映射的目錄為自動生成的。

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

(10)USER

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

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

如:

  • USER daemon
  • USER 1001

注意:

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

(11)WORKDIR

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

如:

  • WORKDIR /root

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

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

三、Dockerfile生成容器鏡像方法

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

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

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

mkdir nginxdir

cd nginxdir

echo "nginx is running" > index.html

編寫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命令時,不建議每次安裝都使用一條單獨的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/

進入/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ù)可以對項目在進行并行編譯。

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

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

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

把生成容器鏡像過程中部署的應(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 .

四、通過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)建并啟動容器

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

docker ps -a

curl 192.168.10.11:8080

總結(jié)

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

相關(guān)文章

  • iptables使用及docker的iptables規(guī)則

    iptables使用及docker的iptables規(guī)則

    Docker在創(chuàng)建容器時,會自動添加一些iptables規(guī)則來實現(xiàn)網(wǎng)絡(luò)隔離和轉(zhuǎn)發(fā)等功能,本文主要介紹了iptables使用及docker的iptables規(guī)則,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • docker?images的常用方式

    docker?images的常用方式

    這篇文章主要介紹了docker?images的常用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解Docker 下開發(fā) hyperf 完整使用示例

    詳解Docker 下開發(fā) hyperf 完整使用示例

    這篇文章主要介紹了詳解Docker 下開發(fā) hyperf 完整使用示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • docker安裝minio無法訪問的解決

    docker安裝minio無法訪問的解決

    這篇文章主要介紹了docker安裝minio無法訪問的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Mac上使用Docker如何快速啟動MySQL測試

    Mac上使用Docker如何快速啟動MySQL測試

    本文主要討論如何使用Docker快速啟動 MySQL 測試,包括Mac環(huán)境。非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • docker和docker-compose的版本對應(yīng)關(guān)系的實現(xiàn)

    docker和docker-compose的版本對應(yīng)關(guān)系的實現(xiàn)

    本文主要介紹了docker和docker-compose的版本對應(yīng)關(guān)系的實現(xiàn),兩者雖非強制綁定,但新版本docker-compose可能依賴更高版本Docker引擎的API,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • 虛擬機如何安裝指定版本的Docker舉例詳解

    虛擬機如何安裝指定版本的Docker舉例詳解

    這篇文章主要介紹了虛擬機如何安裝指定版本的Docker的相關(guān)資料,包括配置yum源、查看可用版本、安裝指定版本、卸載舊版本、解決沖突、再次安裝以及最后驗證安裝,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法

    Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法

    Docker在創(chuàng)建容器時有四種網(wǎng)絡(luò)模式,bridge為默認不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時使用--net去指定。那Docker為網(wǎng)絡(luò)bridge模式指定容器ip該如何實現(xiàn)呢?下面通過通過這篇文章一起看看吧,文中給出了詳細的示例代碼,有需要的可以參考借鑒。
    2016-11-11
  • Docker容器日志查看和清理的圖文教程

    Docker容器日志查看和清理的圖文教程

    docker容器在運行過程中會產(chǎn)生日志,日志的量跟具體的容器有關(guān),下面這篇文章主要給大家介紹了關(guān)于Docker容器日志查看和清理的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • SQL?Server?簡介與?Docker?Compose?部署SQL?Server?容器

    SQL?Server?簡介與?Docker?Compose?部署SQL?Server?容器

    SQL?Server?是一個功能強大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),適用于各種規(guī)模的應(yīng)用程序和數(shù)據(jù)存儲需求,在本文中,我將簡要介紹?SQL?Server?的基本概念,并詳細闡述如何使用?Docker?Compose?部署?SQL?Server?容器,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評論