西安正規(guī)網(wǎng)站建設(shè)報(bào)價(jià)重慶seo服務(wù)
引言
? 在容器化技術(shù)日益普及的今天,Dockerfile 成為了構(gòu)建 Docker 鏡像的核心工具。通過編寫 Dockerfile,開發(fā)者可以將應(yīng)用程序及其依賴打包成一個(gè)可移植、可復(fù)用的鏡像,從而簡化部署和運(yùn)維工作。本文將詳細(xì)介紹 Dockerfile 的基本概念、常用指令、制作鏡像實(shí)例以及優(yōu)化技巧,幫助讀者掌握如何構(gòu)建簡單高效的容器鏡像。
Dockerfile 簡介
Dockerfile 是一個(gè)包含了一系列命令的文本文件,這些命令用于自動(dòng)化地創(chuàng)建一個(gè) Docker 鏡像。通過編寫 Dockerfile,開發(fā)者可以將環(huán)境配置、應(yīng)用程序代碼、依賴關(guān)系等打包成一個(gè)鏡像,從而快速創(chuàng)建容器。用戶可以將自己的應(yīng)用打包成鏡像,讓應(yīng)用在容器中運(yùn)行,也可以對(duì)官方鏡像進(jìn)行擴(kuò)展,打包成適合生產(chǎn)環(huán)境的應(yīng)用鏡像。
Dockerfile 常用指令
2.1 FROM:指定基礎(chǔ)鏡像
# 格式 | |
FROM <image:[版本標(biāo)簽]> | |
# 示例 | |
FROM centos | |
FROM ubuntu:20.04 |
FROM 指令用于指定構(gòu)建新鏡像時(shí)使用的基礎(chǔ)鏡像,通常是 Dockerfile 的第一個(gè)有效指令。如果不指定版本標(biāo)簽,默認(rèn)使用?latest
。
2.2 LABEL:添加鏡像的元數(shù)據(jù)
# 格式 | |
LABEL <key>=<value> <key>=<value>.... | |
# 示例 | |
LABEL version="2.0" description="業(yè)務(wù)系統(tǒng)第二個(gè)版本" |
LABEL 指令使用鍵值對(duì)方式為鏡像添加元數(shù)據(jù)。一條 LABEL 可以指定多條元數(shù)據(jù),盡量不要寫多個(gè) LABEL。
2.3 RUN:構(gòu)建鏡像時(shí)執(zhí)行的命令
RUN 指令有兩種執(zhí)行方式:shell 執(zhí)行和 exec 執(zhí)行。
# 格式 | |
RUN <command> | |
# 示例 | |
RUN yum update -y |
RUN 指令創(chuàng)建的中間鏡像會(huì)被緩存,并在下次構(gòu)建中使用??梢栽跇?gòu)建時(shí)使用?--no-cache
?取消緩存。
Exec 執(zhí)行
# 格式 | |
RUN ["executable", "參數(shù)1", "參數(shù)2"] | |
# 示例 | |
RUN ["/bin/bash", "-c", "echo hello"] |
2.4 ENV:在容器內(nèi)部設(shè)置環(huán)境變量
# 格式 | |
ENV <key> <value> | |
# 示例 | |
ENV MYPATH /usr/local |
ENV 指令用于在容器內(nèi)部設(shè)置環(huán)境變量。
2.5 ADD:將本地文件添加到鏡像中
# 語法 | |
ADD <src> <dest> | |
ADD ["src", "dest"] | |
# 示例 | |
ADD nginx.tar /opt |
ADD 指令類似于 scp,但不需要用戶名和密碼權(quán)限驗(yàn)證。tar 類型文件會(huì)自動(dòng)解壓,可以訪問網(wǎng)絡(luò)資源,類似 wget。建議使用絕對(duì)路徑,盡量不要把?<src>
?寫成一個(gè)文件夾。
2.6 COPY:將文件或目錄復(fù)制到鏡像中
# 語法 | |
COPY <src> <dest> | |
COPY ["<src>", "<dest>"] | |
# 示例 | |
COPY myapp.jar /app/ |
COPY 指令的功能類似 ADD,但不會(huì)自動(dòng)解壓文件,也不能訪問網(wǎng)絡(luò)資源。COPY 的只能是本地文件,其他用法一致。
2.7 VOLUME:指定持久化目錄
# 格式 | |
VOLUME ["/path/to/dir"] | |
# 示例 | |
VOLUME ["/data"] | |
VOLUME ["/data/log", "/data/config"] |
VOLUME 指令用于指定持久化目錄。卷可以在容器間共享和重用,修改卷后會(huì)立即生效,對(duì)卷的修改不會(huì)對(duì)鏡像產(chǎn)生影響。
2.8 CMD:容器啟動(dòng)時(shí)運(yùn)行的命令(不常用)碼
# 語法 | |
CMD ["executable", "param1", "param2"] | |
CMD command param1 param2 | |
# 示例 | |
CMD echo $LANG |
CMD 指令用于指定容器啟動(dòng)時(shí)運(yùn)行的命令。如果寫了多條 CMD 指令,只有最后一條生效。
2.9 ENTRYPOINT:容器啟動(dòng)時(shí)運(yùn)行的命令(常用)
# 語法 | |
ENTRYPOINT ["executable", "param1", "param2"] | |
ENTRYPOINT command param1 param2 | |
# 示例 | |
ENTRYPOINT java -jar /data/config.jar |
ENTRYPOINT 指令也用于指定容器啟動(dòng)時(shí)運(yùn)行的命令。與 CMD 不同,ENTRYPOINT 不會(huì)被運(yùn)行的 command 覆蓋,而 CMD 則會(huì)被覆蓋。如果同時(shí)寫了 ENTRYPOINT 和 CMD,CMD 指定的內(nèi)容將作為 ENTRYPOINT 的參數(shù)。
2.10 EXPOSE:暴露容器運(yùn)行時(shí)的監(jiān)聽端口給外部
# 格式 | |
EXPOSE <port> [<port>...] | |
# 示例 | |
EXPOSE 8080 | |
EXPOSE 443/tcp 80/tcp |
EXPOSE 指令用于暴露容器運(yùn)行時(shí)的監(jiān)聽端口給外部。但需要注意的是,EXPOSE 并不會(huì)讓容器的端口訪問到主機(jī)。在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),會(huì)自動(dòng)隨機(jī)映射 EXPOSE 的端口。
2.11 WORKDIR:工作目錄
WORKDIR 指令用于設(shè)置工作目錄,后續(xù)指令將在該目錄中執(zhí)行。
2.12 其他指令
- MAINTAINER:指定作者。
- USER:設(shè)置啟動(dòng)容器的用戶。
- ONBUILD:用于設(shè)置鏡像觸發(fā)器。
- HEALTHCHECK:用于檢查容器健康狀況。
制作鏡像實(shí)例(重點(diǎn))
3.1 制作鏡像語法
docker build -t 鏡像名:標(biāo)簽名 Dockerfile路徑 |
3.2 實(shí)例1:構(gòu)建 Nginx 鏡像
(1)編寫 Dockerfile
# 使用官方 Nginx 鏡像 | |
FROM nginx:1.25 | |
# 復(fù)制自定義配置文件 | |
COPY nginx.conf /etc/nginx/nginx.conf | |
# 復(fù)制網(wǎng)站文件 | |
COPY html /usr/share/nginx/html | |
# 暴露 Nginx 端口 | |
EXPOSE 80 |
(2)編寫配置文件和網(wǎng)站文件
將?nginx.conf
?和?html
?目錄放在 Dockerfile 同級(jí)目錄下。
(3)構(gòu)建鏡像
由于 Docker Hub 鏡像拉取可能不穩(wěn)定,可以使用公開的鏡像加速服務(wù),如?docker.m.daocloud.io
。
# 拉取 nginx 鏡像(需要跟 Dockerfile 中同版本) | |
docker pull docker.m.daocloud.io/nginx:1.25 | |
# 修改標(biāo)簽 | |
docker tag docker.m.daocloud.io/nginx:1.25 nginx:1.25 | |
# 構(gòu)建鏡像 | |
docker build -t mynginx . |
(4)運(yùn)行容器
docker run -d -p 80:80 --name mynginx mynginx |
3.3 實(shí)例2:構(gòu)建 Java 應(yīng)用鏡像
(1)準(zhǔn)備工作
確保 Java 應(yīng)用已經(jīng)打包成 JAR 文件,并放在 Dockerfile 同級(jí)目錄下。
(2)編寫 Dockerfile
# 使用官方 OpenJDK 鏡像 | |
FROM openjdk:8 | |
# 指定作者 | |
MAINTAINER liyb <liyb@gdhmail.com> | |
# 設(shè)置時(shí)區(qū)并創(chuàng)建工作目錄 | |
RUN cp -a -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ | |
mkdir /work | |
# 復(fù)制 JAR 文件到工作目錄 | |
COPY *.jar /work/app.jar | |
# 暴露應(yīng)用端口 | |
EXPOSE 9999 | |
# 設(shè)置容器啟動(dòng)時(shí)運(yùn)行的命令 | |
ENTRYPOINT java -jar /work/app.jar |
(3)構(gòu)建鏡像
# 構(gòu)建鏡像 | |
docker build -t myapp . |
(4)運(yùn)行容器
docker run -d -p 8080:9999 myapp |
Dockerfile 優(yōu)化技巧
在編寫高效的 Dockerfile 時(shí),可以遵循以下最佳實(shí)踐,以便優(yōu)化鏡像的構(gòu)建和運(yùn)行性能:
4.1 使用輕量基礎(chǔ)鏡像
選擇小巧的基礎(chǔ)鏡像,如 Alpine,以減少最終鏡像的體積。
4.2 合并命令
每個(gè)指令(如 RUN、COPY 等)都會(huì)生成一個(gè)新的鏡像層。使用?&&
?將多個(gè) RUN 命令合并,減少鏡像層數(shù),從而提高構(gòu)建速度和效率。
RUN wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz && \ | |
tar -zxvf nginx-$NGINX_VERSION.tar.gz && \ | |
cd nginx-$NGINX_VERSION && \ | |
./configure --prefix=/usr/local/nginx --with-http_ssl_module && \ | |
make && \ | |
make install |
4.3 緩存優(yōu)化
合理地安排指令順序,將不常變化的指令放在 Dockerfile 前面,常變化的放在后面,以利用緩存,加快構(gòu)建速度。
4.4 使用?.dockerignore
排除不必要的文件,減小上下文大小,提升構(gòu)建速度。
4.5 多階段構(gòu)建
利用多階段構(gòu)建,僅將最終運(yùn)行所需的文件復(fù)制到最終鏡像,降低鏡像大小。
4.6 優(yōu)化入口
Dockerfile是一個(gè)文本文件,其中包含了用于創(chuàng)建Docker鏡像的一系列指令和參數(shù)。這些指令定義了鏡像的構(gòu)建步驟,從基礎(chǔ)鏡像開始,逐層添加軟件、配置文件、依賴項(xiàng)等,直到構(gòu)建出最終的應(yīng)用鏡像。