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 来作为构建上下文。
- -: 通过标准输入接收构建上下文。
常用选项
给构建的镜像指定一个标签(名称:版本
)。标签用于标识构建的镜像。
1
| docker build -t myimage:v1 .
|
指定 Dockerfile
的路径。如果你的 Dockerfile
不在当前目录或文件名不是 Dockerfile
,可以使用此选项。
1
| docker build -f /path/to/Dockerfile .
|
禁用缓存。默认情况下,Docker 会缓存中间层(层级缓存),以便在下次构建时加快构建过程。如果你不希望使用缓存,可以添加此选项。
1
| docker build --no-cache -t myimage:v1 .
|
定义构建时的环境变量(构建参数)。可以在 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 项目
 |
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
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
|