当前位置: 首页 > news >正文

六.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中的下一条指令直到所有指令都执行完成

  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  2. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
  3. 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>的形式显示。

虚悬镜像的特点

  1. 标识特征
    REPOSITORY 显示为
    TAG 显示为
    仍然占用磁盘空间
    有唯一的IMAGE ID
  2. 影响
    占用磁盘空间
    无法直接通过标签引用
    不能被删除(除非强制)

形成原因

  1. 镜像标签被覆盖

    # 构建新镜像覆盖旧标签
    docker build -t myapp:v1 .  # 第一次构建
    docker build -t myapp:v1 .  # 第二次构建,覆盖了第一次的镜像
    # 第一次构建的镜像变成虚悬镜像
    
  2. 镜像更新

    # 拉取新版本镜像覆盖旧版本
    docker pull nginx:latest  # 假设当前是1.20
    docker pull nginx:latest  # 更新到1.21
    # 1.20版本可能变成虚悬镜像
    
  3. 使用镜像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

在这里插入图片描述
访问验证
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/561845.html

相关文章:

  • wp企业网站模板数据分析师事务所
  • AWS DMS 大规模数据库迁移:完全加载+持续复制最佳实践
  • 阿里巴巴六边形架构-从解耦到可测试的架构设计利器
  • 中国世界排名前500大学seo网上培训多少钱
  • 做网站做哪个行业好商城网站建设高端
  • 正规网站建设建设公司雅安建设局网站
  • 如何在Java中整合Redis?
  • 官方网站是什么意思免费链接生成器
  • 增加网站访客珠宝首饰商城网站建设
  • 网络通信的奥秘:TCP与UDP详解(三)
  • 理财网站开发最近中国新闻
  • 详解网络安全免杀对抗:攻防的猫鼠游戏
  • 【开题答辩全过程】以 高考志愿分析系统为例,包含答辩的问题和答案
  • ESP-IDF基础入门(2)
  • 中国建设官方网站首页网上商城推广方案
  • 网站建设必须安装程序天眼查公司信息查询
  • 织梦网站首页是哪个文件网站手机访问跳转代码
  • 博弈dp|凸包|math分类
  • 网站浏览器兼容性问题wordpress手机端网站
  • 中国建设银行预约网站xampp做网站
  • VS2019+CUDA 编译通过但有错误提示
  • 有哪些做问卷调查挣钱的网站单页 网站模板
  • 承德网站制作数据库营销案例
  • 32位汇编:实验9分支程序结构使用
  • Kanass实践指南(3) - 开发团队如何通过kanass有效管控开发任务
  • 基于双向时序卷积网络与双向门控循环单元(BiTCN-BiGRU)混合模型的时间序列预测(Matlab源码)
  • 电子商务网站建设 精品课wordpress主题缓存
  • 站建设 app开发网站网站建设中怎么添加源码
  • qq推广网站建立企业网站 优帮云
  • 【AHE数据集】历史/未来全球网格热排放数据 PF-AHF