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

【Docker】在Linux环境下使用Dockerfile打包镜像(图文示例)

在这里插入图片描述

文章目录

    • 前提条件
    • 准备 Dockerfile
    • Dockerfile 示例
    • 构建 Docker 镜像
    • 运行 Docker 容器
    • 验证服务是否正常运行
    • 常用 Docker 命令汇总

更多相关内容可查看

个人思路:不管多麻烦的服务,或者是一些国产化的中间件,在打包镜像的时候如果需要全自动化利用Dockerfile去实现打包镜像相对麻烦

个人建议:不管什么服务都在linux或者对应的服务器上部署好,测试通过,然后在构建一个基础的dockerfile打包到镜像中,把启动脚本以及日志暴露出来即可,具体情况可按照要求来写对应的dockerfile

前提条件

  1. 安装 Docker:确保您的 Linux 系统已安装 Docker。可以通过以下命令检查 Docker 是否已安装:

    docker --version
    

    在这里插入图片描述

    如果未安装,请参考Linux安装Docker教程(保姆篇) 进行安装。

  2. 准备文件结构:确保您的文件结构清晰,Dockerfile 和 server 包中的文件位于适当的位置。以下是一个推荐的目录结构,这样可以保证你的dockerfile相对简化一些:

    /your-project-directory
    ├── Dockerfile
    |——解压后的jdk
    └── server|——需要的jar包lib|——配置文件config|——*.jar├──ServerStart.sh└──ServerStop.sh
    

    注意:本文假设您已将 Server.bat 转换为 Start.sh,以便在 Linux 环境下运行。如果确实需要使用 .bat 文件,需要使用 Windows 容器。

    在这里插入图片描述

准备 Dockerfile

以下是一个 Dockerfile 示例。假设所有需要打包的文件都位于 server/ 目录下。

Dockerfile 示例

# 使用内部基础镜像
FROM xxxkylin-x86# 设置维护者信息(建议使用 LABEL 替代 MAINTAINER)
LABEL maintainer="xxx"# 设置工作目录
WORKDIR /server# 设置环境变量
ENV JAVA_HOME=/server/jdk
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV TZ="Asia/Shanghai"
ENV TERM=xterm# 暴露服务所需端口
EXPOSE 9544
EXPOSE 9096
EXPOSE 9196
EXPOSE 7441# 创建必要的目录
RUN mkdir -p "$JAVA_HOME" /server/tmp /server/work /server/config /server/lib# 复制应用程序文件
# 假设 server/ 目录与 Dockerfile 位于同一级
COPY server/Config /server/config/
COPY server/lib /server/lib/
COPY server/xxx.jar /server/
COPY server/ServerStart.sh /server/
COPY server/ServerStop.sh /server/# 设置文件权限
RUN chmod -R 755 /server/# 确保 ServerStart.sh 使用正确的 Java 命令运行 JAR 文件
# 编辑 ServerStart.sh 内容如下:# #!/bin/bash
# java -jar /hke/Server.jar --spring.profiles.active=prod# 如果需要,可以将上述内容写入 Dockerfile 中,但这通常在本地编辑好脚本后通过 COPY 引入# 设置容器启动时执行的命令
ENTRYPOINT ["/server/Start.sh"]

注意事项

  1. 启动脚本:确保 ServerStart.sh 已经转换为适用于 Linux 的 Shell 脚本,并且具有执行权限。脚本内容示例如下:

    #!/bin/bash# 运行 JAR 文件,可根据需要添加 JVM 参数
    java -jar /server/Server.jar --spring.profiles.active=prod
    

构建 Docker 镜像

在包含 Dockerfileserver/ 目录的父目录中,打开终端并执行以下命令来构建 Docker 镜像:

docker build -f Dockerfile_server -t server:1.0.0 .

解释

-t server:latest:为镜像命名为 server,标签为 1.0.0。建议使用语义化版本标签,如 1.0.0
.:表示当前目录为构建上下文,Docker 会在这个目录下查找 Dockerfile

构建过程中的注意事项

文件权限:确保 Start.sh 在本地具有执行权限。可以在本地运行 chmod +x server/Start.sh 后再构建镜像。
错误排查:如果构建过程中出现错误,请仔细阅读错误信息,通常是由于文件缺失、权限不足或 Dockerfile 语法错误引起的。

运行 Docker 容器

构建完成后,可以使用以下命令运行容器:

docker run -d \--name server-container \-p 9544:9544 \-p 9096:9096 \-p 9196:9196 \-p 7441:7441 \server:1.0.0

解释

-d:后台运行容器(detached 模式)。
--name server-container:为容器命名为 server-container`

-p:将主机的端口映射到容器的端口。例如,-p 9544:9544 将主机的 9544 端口映射到容器的 9544 端口。根据实际需要调整端口号。
server:1.0.0:指定要运行的镜像。

验证容器是否运行

docker ps -a

您应该能在列表中看到名为 server-container 的容器正在运行。

验证服务是否正常运行

  1. 检查容器日志

    如果服务未按预期运行,可以查看容器日志以排查问题:

    docker logs server-container
    
  2. 访问服务

    根据您的服务配置,通过浏览器或 curl 命令访问相应的端口。例如:

    curl http://localhost:9544/your-endpoint
    

    注意:确保防火墙或安全组规则允许访问这些端口。

常用 Docker 命令汇总

以下是一些我在做这件事,遇到一些报错情况的使用的 Docker 命令:

检查容器中jdk是否正常

docker exec hserver java -version

查看名为"kylin"的容器的操作系统类型和CPU架构

docker inspect --format='{{.Os}}/{{.Architecture}}' kylin

临时运行容器并执行Java版本检查

# --rm: 容器退出后自动删除
# -it: 交互式终端
# --entrypoint /bin/sh: 覆盖原入口点,改为启动shell
# -c "java -version": 在容器内执行Java版本检查命令
docker run --rm -it --entrypoint /bin/sh server:1.0.0 -c "java -version"

检查容器内特定脚本文件

# 临时运行容器并列出指定路径的脚本文件详细信息
# ls -l: 长格式显示文件信息
docker run --rm -it --entrypoint /bin/sh server:1.0.0 -c "ls -l /Server/ServerStart.sh"

后台运行服务容器

# -d: 后台运行(detached模式)
# --name: 为容器指定名称
# server:1.0.0: 使用的镜像名称和标签
docker run -d --name serve-container server:1.0.0

调试Web服务容器

# 以交互方式临时运行web服务容器
# 使用/bin/sh作为入口点进入容器shell环境
# 容器退出后自动删除(--rm)
docker run --rm -it --entrypoint /bin/sh webservice:1.0.0

列出所有运行中的容器

docker ps

列出所有容器(包括停止的)

docker ps -a

停止容器

docker stop server-container

重启容器

docker restart server-container

删除容器

docker rm server-container

注意:删除前确保容器已停止。

删除镜像

docker rmi server:latest

命令总结表

命令功能关键参数说明
docker inspect检查容器详细信息--format 格式化输出
docker run --rm -it临时调试容器--rm自动清理,-it交互终端
docker run -d后台运行服务-d守护模式,--name命名容器
--entrypoint覆盖默认入口点常用于调试时改为shell
-c "command"在容器内执行命令需配合/bin/sh使用
http://www.dtcms.com/a/285352.html

相关文章:

  • Spring中的设计模式
  • 因果图方法设计测试用例的价值与使用范围
  • untiy之导入插件(文件方式,适用于git克隆失败)
  • TCP通讯开发注意事项及常见问题解析
  • MTSC2025参会感悟:手工测试用例的智能化生成
  • Typecho+阿里云CDN完整配置:防止DDoS攻击与IP暴露
  • 6 种无线传输照片从安卓到 Mac 的方法
  • CertiK创始人顾荣辉出席上海Conflux大会,聚焦Web3全球化中的安全与合规路径
  • grpo 优化
  • 超简单linux上部署Apache
  • 力扣 hot100 Day48
  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 力扣刷题Day 79:跳跃游戏 II(45)
  • 算法-排序算法
  • Docker报错:No address associated with hostname
  • vue3+vite 使用scss、sass 全局定义的变量以及使用
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计
  • 前端项目利用Gitlab CI/CD流水线自动化打包、部署云服务
  • 基于单片机电机转速检测测速报警设计
  • STM32之L298N电机驱动模块
  • CSS样式中的布局、字体、响应式布局
  • FastCAE—Flow流体软件网格划分模块功能介绍(多区域网格划分)
  • 如何区别HTML和HTML5?
  • C++进阶-红黑树(难度较高)
  • Java学习第五十三部分——后端常用函数
  • 闭包探秘:JavaScript环境捕获机制深度解析
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度拷问
  • 飞凌嵌入式亮相第九届瑞芯微开发者大会:AIoT模型创新重做产品
  • Go-Redis 入门与实践从连接到可观测,一站式掌握 go-redis v9**
  • #vscode# #SSH远程# #Ubuntu 16.04# 远程ubuntu旧版Linux