六.DockerFile解析及其应用部署
六.DockerFile解析及其应用部署
- 1.dockerfile内容基础
- 2.DockerFile常用保留字指令:
- 3.自定义镜像mycentosjava8
- 4.虚悬镜像
- 5.微服务项目通过dockerfile进行docker部署
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建步骤:编写dockerfile文件->docker build命令构建镜像->docker run依镜像运行容器实例
1.dockerfile内容基础
1):每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2):指令按照从上到下,顺序执行
3):#表示注释
4):每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似dockercommit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
- Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
- Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
- Docker容器,容器是直接提供服务的。
2.DockerFile常用保留字指令:
FROM: 指定基础镜像,是 Dockerfile 的第一条指令
FROM [:] [AS ]
参数:
:基础镜像名称
:镜像标签(如 latest、alpine 等)
[AS ]:为构建阶段命名(多阶段构建)
示例:
FROM ubuntu:20.04
FROM node:16 AS builder
MAINTAINER(已弃用): 设置镜像的作者信息, 已被 LABEL 指令取代
MAINTAINER
RUN: 镜像构建过程中执行命令,每个 RUN 指令都会创建一个新的镜像层。
RUN
RUN [“executable”, “param1”, “param2”]
两种格式:
Shell 格式:RUN apt-get update
Exec 格式:RUN [“/bin/bash”, “-c”, “echo hello”]
示例:
RUN apt-get update && apt-get install -y nginx
CMD: 设置容器启动时的默认执行命令, 一个 Dockerfile 只能有一个 CMD 指令,多个则只有最后一个生效
CMD [“executable”,“param1”,“param2”]
CMD [“param1”,“param2”]
CMD command param1 param2
区别:
CMD [“executable”, “param”]:Exec 格式(推荐)
CMD [“param1”, “param2”]:为 ENTRYPOINT 提供默认参数
CMD command param:Shell 格式
LABEL: 为镜像添加元数据
LABEL = = …
示例:
LABEL version=“1.0” description=“Web App”
LABEL maintainer=example@example.com
EXPOSE: 声明容器运行时监听的端口, 仅起声明作用,不实际开放端口。
EXPOSE [/…]
示例:
EXPOSE 80/tcp
EXPOSE 8080 3000
ENV:设置环境变量
ENV = …
ENV
示例:
ENV NODE_ENV=production
ENV DB_HOST=localhost DB_PORT=5432
ADD:复制文件、目录或远程文件到镜像中
功能:
复制本地文件到容器
解压 tar 文件
下载远程 URL 文件
注意:功能较复杂,通常推荐使用 COPY
ADD [–chown=:] …
ADD [–chown=:] [“”,… “”]
COPY:复制文件或目录到镜像中
与 ADD 的区别:COPY 功能更简单明确,只复制本地文件
COPY [–chown=:] …
COPY [–chown=:] [“”,… “”]
示例:
COPY package.json /app/
COPY . /app
ENTRYPOINT:配置容器启动时执行的命令,CMD 提供参数时,会作为 ENTRYPOINT 的参数
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2
示例:
ENTRYPOINT [“npm”, “start”]
VOLUME:创建挂载点,用于数据持久化
VOLUME [“/data”]
VOLUME /var/log
示例:
VOLUME [“/var/lib/mysql”]
USER:指定运行镜像时的用户
USER [:]
USER [:]
示例:
USER nginx
USER 1000:1000
WORKDIR:设置工作目录,后续指令(如 RUN、CMD、COPY 等)都在该目录下执行
WORKDIR /path/to/workdir
示例:
WORKDIR /app
ARG:定义构建时变量,通过 docker build --build-arg = 传入
ARG [=]
示例:
ARG VERSION=latest
FROM node:${VERSION}
ONBUILD:为镜像添加触发器,当该镜像作为基础镜像时执行
ONBUILD
示例:
ONBUILD COPY . /app/src
STOPSIGNAL:设置停止容器时发送的系统调用信号
STOPSIGNAL signal
示例:
STOPSIGNAL SIGTERM
HEALTHCHECK:配置容器健康检查
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
选项:
–interval=<间隔>:检查间隔
–timeout=<超时>:超时时间
–retries=<次数>:重试次数
示例:
HEALTHCHECK --interval=30s --timeout=3s
CMD curl -f http://localhost/ || exit 1
SHELL:指定 RUN、CMD、ENTRYPOINT 指令使用的 shell
SHELL [“executable”, “parameters”]
示例:
SHELL [“/bin/bash”, “-c”]

3.自定义镜像mycentosjava8
目的:Centos7镜像具备vim+ifconfig+jdk8
准备构建所需jdk:

在同一文件夹创建dockerfile
# 基础镜像
FROM centos:7.9.2009
# 添加元数据标签
LABEL version="1.0" description="centos镜像,具备vim+ifconfig+jdk8"
LABEL maintainer=1576193328@qq.com
# 设置环境变量,便于后续指令引用该路径
ENV MYPATH /usr/local
# 指定工作目录,后续的RUN、CMD等指令都会在此目录下执行
WORKDIR $MYPATH
# 更换yum源为阿里云镜像
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' \-i.bak /etc/yum.repos.d/CentOS-*.repo
# 清除缓存并生成新缓存
RUN yum clean all && yum makecache
# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令查看网络IP
RUN yum -y install net-tools
# 安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# ADD 是相对路径jar,把jdk-8-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8-linux-x64.tar.gz /usr/local/java/
# 配置java环境变量(请根据实际解压后的目录名调整)
ENV JAVA_HOME /usr/local/java/jdk1.8.0_301
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 声明容器在运行时监听的端口号,该容器应用使用80端口提供服务
EXPOSE 80
# 指定容器启动时执行的命令,每个Dockerfile只能有一个CMD生效
CMD ["/bin/bash", "-c", "echo ${MYPATH} && echo 'success--------------ok' && java -version"]

构建
docker build-t 新镜像名字:TAG .
docker build -t mycentosjava8:1.0 .

运行镜像
docker run -it mycentosjava8:1.0 /bin/bash

4.虚悬镜像
虚悬镜像(Dangling Images)是指那些没有标签(tag)且不再被任何容器或镜像引用的镜像,在Docker中以<none>:<none>的形式显示。
虚悬镜像的特点
- 标识特征
REPOSITORY 显示为
TAG 显示为
仍然占用磁盘空间
有唯一的IMAGE ID - 影响
占用磁盘空间
无法直接通过标签引用
不能被删除(除非强制)
形成原因
-
镜像标签被覆盖
# 构建新镜像覆盖旧标签 docker build -t myapp:v1 . # 第一次构建 docker build -t myapp:v1 . # 第二次构建,覆盖了第一次的镜像 # 第一次构建的镜像变成虚悬镜像 -
镜像更新
# 拉取新版本镜像覆盖旧版本 docker pull nginx:latest # 假设当前是1.20 docker pull nginx:latest # 更新到1.21 # 1.20版本可能变成虚悬镜像 -
使用镜像ID重新标记
# 使用镜像ID给镜像打新标签 docker tag <image-id> newrepo:newtag # 原来的镜像如果没有其他标签引用,会变成虚悬镜像 查看虚悬镜像 # 输出中显示为 <none> <none> 的就是虚悬镜像 docker images -f dangling=true
管理虚悬镜像
# 删除所有虚悬镜像
docker image prune
# 通过IMAGE ID删除
docker rmi <image-id>
总结

5.微服务项目通过dockerfile进行docker部署
将项目打包成jar包,上传至服务器

在jar包同文件夹中创建dockerfile文件
# 基础镜像
FROM openjdk:8-jdk-alpine
# 添加元数据标签
LABEL version="1.0" description="前后端分离微服务后端项目"
LABEL maintainer=1576193328@qq.com
# 创建应用目录
WORKDIR /app
# VOLUME 指定临时文件目录为/tmp,docker会在主机/var/lib/docker目录下创建一个临时目录,将这个临时目录链接到容器的/tmp
VOLUME /tmp
# 复制应用文件
COPY springboot-fenli-back-end-1.0-SNAPSHOT app.jar
#暴露8080端口作为微服务
EXPOSE 8080
# 安装 curl
RUN apk add --no-cache curl
# 使用应用根路径或实际存在的端点进行健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \CMD curl -f http://localhost:8080/ || exit 1
# 设置 JVM 参数
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# 运行应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

构建镜像
docker build -t springboot-fenli-back-end:1.0 .

运行容器
docker run -d -p 8080:8080 springboot-fenli-back-end:1.0

访问验证


