文章

05.Dockerfile

05.Dockerfile

Dockerfile

什么是 Dockerfile?

Dockerfile 就是一个文本文件,其中包含一个个的指令 (Instruction),用指令来说明要执行什么操作来构建 image。每一个指令都会形成一层 Layer。

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./mysql-5.7.rpm /tmp
RUN执行 Linux 的 shell 命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
` Entrypoint是 `镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

docker build

docker build 是 Docker 中用于从 Dockerfile 构建镜像的命令。通过此命令,你可以根据 Dockerfile 文件中的指令来自动化构建一个镜像。

基本语法

1
docker build [OPTIONS] PATH | URL | -
  • PATH: 构建上下文的路径。通常是一个包含 Dockerfile 的目录。如果你在当前目录下构建,可以使用 . 来代表当前目录。
  • URL: 你也可以提供一个 Git 仓库 URL 来作为构建上下文。
  • -: 通过标准输入接收构建上下文。

常用选项

  • -t, --tag

给构建的镜像指定一个标签(名称:版本)。标签用于标识构建的镜像。

1
docker build -t myimage:v1 .
  • -f, --file

指定 Dockerfile 的路径。如果你的 Dockerfile 不在当前目录或文件名不是 Dockerfile,可以使用此选项。

1
docker build -f /path/to/Dockerfile .
  • --no-cache

禁用缓存。默认情况下,Docker 会缓存中间层(层级缓存),以便在下次构建时加快构建过程。如果你不希望使用缓存,可以添加此选项。

1
docker build --no-cache -t myimage:v1 .
  • --build-arg

定义构建时的环境变量(构建参数)。可以在 Dockerfile 中使用 ARG 指令引用。

1
docker build --build-arg MY_ARG=value -t myimage:v1 .
  • --pull 强制从远程仓库拉取基础镜像,即使本地已有该镜像的最新版本。
1
docker build --pull -t myimage:v1 .
  • --rm 构建完成后删除中间容器(默认是启用的)。如果你希望保留中间容器(用于调试等目的),可以使用 --rm=false
1
docker build --rm=false -t myimage:v1 .
  • -q, --quiet 以安静模式构建镜像,只输出镜像的 ID。
1
docker build -q -t myimage:v1 .

示例

  • 最简单的构建命令: 假设你在当前目录下有一个 Dockerfile,执行以下命令来构建一个标签为 myapp:latest 的镜像:
1
docker build -t myapp:latest .
  • 指定 Dockerfile 路径和构建参数: 如果 Dockerfile 不在当前目录或者文件名不是默认的 Dockerfile,你可以使用 -f 选项指定文件路径,并通过 --build-arg 传递构建参数:
1
docker build -f /path/to/Dockerfile --build-arg VERSION=1.0 -t myapp:1.0 .
  • 使用缓存和禁用缓存: 默认情况下,Docker 会使用缓存来加速构建。如果你希望构建过程中不使用缓存,可以添加 --no-cache
1
docker build --no-cache -t myapp:v2 .

案例

基于 Ubuntu 镜像构建一个新的 image,运行一个 FCMHttpV1 项目

  • 准备文件:
![500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412142251556.png)
  • Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK安装目录
ENV JAVA_DIR=/usr/local

# 拷贝JDK和Spring Boot包
COPY ./jdk-17.0.12_linux-x64_bin.tar.gz $JAVA_DIR/
COPY ./FCMHttpV1.jar /tmp/app.jar

# 安装JDK
RUN cd ${JAVA_DIR} \
    && tar -xf ./jdk-17.0.12_linux-x64_bin.tar.gz \
    && mv ./jdk-17.0.12 ./java17/

# 配置环境变量
ENV JAVA_HOME=${JAVA_DIR}/java17
ENV PATH=$PATH:${JAVA_HOME}/bin

# 暴露端口
EXPOSE 11111
# 入口
ENTRYPOINT java -jar /tmp/app.jar
  • 构建
1
2
# 构建
docker build -t javaweb:1.0 .

查看 image :

1
docker images
![500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412142231744.png)

添加防火墙规则:

1
2
3
4
# 放行11111端口
firewall-cmd --zone=public --add-port=11111/tcp --permanent
# 查看所有打开的端口
firewall-cmd --zone=public --list-ports

运行:

1
docker run --name fcm -p 11111:11111 -d javaweb:1.0
本文由作者按照 CC BY 4.0 进行授权