更多相关内容可查看
个人思路:不管多麻烦的服务,或者是一些国产化的中间件,在打包镜像的时候如果需要全自动化利用Dockerfile去实现打包镜像相对麻烦
个人建议:不管什么服务都在linux或者对应的服务器上部署好,测试通过,然后在构建一个基础的dockerfile打包到镜像中,把启动脚本以及日志暴露出来即可,具体情况可按照要求来写对应的dockerfile
前提条件
安装 Docker:确保您的 Linux 系统已安装 Docker。可以通过以下命令检查 Docker 是否已安装:
docker --version
如果未安装,请参考Linux安装Docker教程(保姆篇) 进行安装。
准备文件结构:确保您的文件结构清晰,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"]
注意事项:
启动脚本:确保
ServerStart.sh
已经转换为适用于 Linux 的 Shell 脚本,并且具有执行权限。脚本内容示例如下:#!/bin/bash # 运行 JAR 文件,可根据需要添加 JVM 参数 java -jar /server/Server.jar --spring.profiles.active=prod
构建 Docker 镜像
在包含 Dockerfile
和 server/
目录的父目录中,打开终端并执行以下命令来构建 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
的容器正在运行。
验证服务是否正常运行
检查容器日志:
如果服务未按预期运行,可以查看容器日志以排查问题:
docker logs server-container
访问服务:
根据您的服务配置,通过浏览器或
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 使用 |