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

发布于:2025-07-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

在这里插入图片描述


更多相关内容可查看

个人思路:不管多麻烦的服务,或者是一些国产化的中间件,在打包镜像的时候如果需要全自动化利用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使用

网站公告

今日签到

点亮在社区的每一天
去签到