前言
Dockerfile是一個文本文件,包含了用于構建Docker鏡像的所有命令和說明。它定義了容器的運行環境、依賴以及啟動方式,是創建Docker鏡像的核心部分。
由于制作鏡像的過程中,需要逐層處理和打包,比較復雜,所以Docker就提供了自動打包鏡像的功能。我們只需要將打包的過程,每一層要做的事情用固定的語法寫下來,交給Docker去執行即可。而這種記錄鏡像結構的文件就稱為Dockerfile,其對應的語法可以參考官方文檔:
Dockerfile reference | Docker DocsFind all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.https://docs.docker.com/engine/reference/builder/
組成部分
一個dockerfile文件包含以下部分:
- 基礎鏡像信息: 使用FROM關鍵字指定基礎鏡像信息,FROM是dockerfile文件的第一條指令。
- 維護者信息: 使用MAINTAINER關鍵字指定,通常可以使用dockerfile文件創建者的名字或者郵件作為維護者的信息。
- 鏡像操作指令: 沒執行一條鏡像操作指令,都會在鏡像中添加新的一層。
- 容器啟動執行命令: 用戶指定在啟動容器時需要執行的命令,通過:CMD ENTRYPOINT指定
其中的語法比較多,比較常用的有:
指令 | 說明 | 示例 |
---|---|---|
FROM | 指定基礎鏡像 | FROM centos:6 |
ENV | 設置環境變量,可在后面指令使用 | ENV key value |
COPY | 拷貝本地文件到鏡像的指定目錄 | COPY ./xx.jar /tmp/app.jar |
RUN | 執行Linux的shell命令,一般是安裝過程的命令 | RUN yum install gcc |
EXPOSE | 指定容器運行時監聽的端口,是給鏡像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 鏡像中應用的啟動命令,容器運行時調用 | ENTRYPOINT java -jar xx.jar |
例如,要基于Ubuntu鏡像來構建一個Java應用,其Dockerfile內容如下:
# 指定基礎鏡像
FROM ubuntu:16.04
# 配置環境變量,JDK的安裝目錄、容器內時區
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷貝jdk和java項目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 設定時區
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安裝JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置環境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定項目監聽的端口
EXPOSE 8080
# 入口,java項目的啟動命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
思考一下:以后我們會有很多很多java項目需要打包為鏡像,他們都需要Linux系統環境、JDK環境這兩層,只有上面的3層不同(因為jar包不同)。如果每次制作java鏡像都重復制作前兩層鏡像,是不是很麻煩。所以,就有人提供了基礎的系統加JDK環境,我們在此基礎上制作java鏡像,就可以省去JDK的配置了:
# 基礎鏡像
FROM openjdk:11.0-jre-buster
# 設定時區
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷貝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
構建鏡像
當Dockerfile文件寫好以后,就可以利用命令來構建鏡像了。
我們準備好了一個demo項目及對應的Dockerfile:
我們將文件拷貝到虛擬機的/root/demo目錄:?
# 進入鏡像目錄
cd /root/demo
# 開始構建
docker build -t docker-demo:1.0 .
然后,執行命令,構建鏡像:
# 進入鏡像目錄
cd /root/demo
# 開始構建
docker build -t docker-demo:1.0 .
?
命令說明:
-
docker build
: 就是構建一個docker鏡像 -
-t docker-demo:1.0
:-t
參數是指定鏡像的名稱(repository
和tag
) -
.
: 最后的點是指構建時Dockerfile所在路徑,由于我們進入了demo目錄,所以指定的是.
代表當前目錄,也可以直接指定Dockerfile目錄:# 直接指定Dockerfile目錄 docker build -t docker-demo:1.0 /root/demo
結果:
-
查看鏡像列表:
成功!?