在/usr/local/kiftd下新建文件夹,后续文件都在此目录

上传kiftd文件到/usr/local/kiftd下

新建Dockerfile如下

::: tip 提示

Dockerfile必须跟文件同一目录,如果只有一个jar包,则跟jar包同一个目录;

:::

      # 使用jdk8镜像
FROM openjdk:8-jre-alpine

# 设置工作目录
WORKDIR /app

# 设置时区,否则跟北京时间有8个小时时间差
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone

# 将kiftd-1.1.1-release文件夹拷贝到工作目录下,最后一个/表示是目录
# 如果只有一个jar包,则为COPY kiftd.jar /app/kiftd.jar
COPY kiftd-1.1.1-release/ /app/kiftd-1.1.1-release/

# 暴露端口
EXPOSE 8080

# 启动程序,如果只有一个jar包,则为 "/app/kiftd.jar"
CMD ["java","-jar","/app/kiftd-1.1.1-release/kiftd.jar","-start"]
    

WORKDIR /app跟VOLUME /tmp区别

WORKDIRVOLUME 是 Dockerfile 中两个不同的指令,它们分别用于不同的目的。

  1. WORKDIR
    • WORKDIR /app 设置容器内部的工作目录为 /app。这意味着在之后的命令中,相对路径将以 /app 为基础。这对于在容器中运行命令或设置路径时非常有用,可以简化命令并提高可读性。
    • 例如,如果有一个命令是 COPY ./source /app/destination,那么它会将主机上的 source 目录中的文件复制到容器内的 /app/destination 目录中。
    • WORKDIR 不会在主机上创建任何目录,它只是在容器内部切换当前工作目录。
  2. VOLUME /tmp
    • VOLUME /tmp 声明在容器中创建一个挂载点(volume),并将其关联到主机上的 /tmp 目录。这个挂载点在容器中是一个持久化的存储位置,允许容器之间共享数据,也可以在容器停止后保留数据。
    • 这通常用于存储容器中的临时文件、日志文件或其他需要在容器之间或容器启动停止周期中保留的数据。

总体而言,WORKDIR 用于设置容器内的当前工作目录,而 VOLUME 用于声明一个挂载点,将容器内的某个目录挂载到主机上,以实现数据的持久性和共享。

COPY 与ADD区别

在大多数情况下,COPYADD 在 Dockerfile 中可以互相替代,但它们有一些不同之处:

  1. COPY
    • 主要用于将本地文件复制到容器中。
    • COPY 只能复制本地文件或目录到容器中,不支持 URL。
    • 语法:COPY <src>... <dest>
  2. ADD
    • 除了复制本地文件,还支持从 URL 复制文件、解压缩 tar 文件等额外功能。
    • ADD 指令会自动解压缩 tar 文件,因此如果要复制的是一个本地 tar 文件,可以使用 ADD
    • 语法:ADD <src>... <dest>

在你的例子中,如果 ./kiftd-1.1.1-release 是一个本地目录,而且不需要额外的 ADD 功能(如自动解压缩 tar 文件),那么可以将 COPY 换成 ADD,语法基本相同:

      ADD ./kiftd-1.1.1-release /app/kiftd-1.1.1-release/
    

但请注意,一般来说,推荐使用 COPY,因为它更明确,更容易理解,并且不引入不必要的复杂性。只有在需要 ADD 的额外功能时才使用它。

新建kiftd-start.sh如下

      # 创建的docker部署根目录
SOURCE_PATH=/usr/local/kiftd

# 镜像名称
SERVER_NAME=kiftd/docker
# 版本
TAG=latest
# 端口号
SERVER_PORT=8080

CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
if [ -n "$CID" ]; then
  echo "存在容器$SERVER_NAME,CID-$CID"
  docker stop $CID
  echo "成功停止容器$SERVER_NAME,CID-$CID"
  docker rm $CID
  echo "成功删除容器$SERVER_NAME,CID-$CID"
fi
if [ -n "$IID" ]; then
  echo "存在镜像$SERVER_NAME:$TAG,IID=$IID"
  docker rmi $IID
  echo "成功删除镜像$SERVER_NAME:$TAG,IID=$IID"
fi
echo "开始构建镜像$SERVER_NAME:$TAG"
# 进入创建的docker部署根目录
cd $SOURCE_PATH
# 构建docker镜像
docker build -t $SERVER_NAME:$TAG .
echo "成功构建镜像$SERVER_NAME:$TAG"

# 运行docker容器
# 无挂载模式,容器删除数据也被删除
# docker run --restart=always --name=kiftd -d -p 8080:8080 --privileged=true kiftd/docker:latest
# 挂载模式,数据写在主机,容器内的路径实际上是主机上的路径的映射
docker run --restart=always -v /usr/local/kiftd/kiftd-1.1.1-release/:/app/kiftd-1.1.1-release/ --name=kiftd -d -p 8080:8080 --privileged=true kiftd/docker:latest

echo "成功创建并运行容器$SERVER_NAME"
    

-v /usr/local/kiftd/kiftd-1.1.1-release : /app/kiftd-1.1.1-release 这个选项使用-v来将主机上的/usr/local/kiftd/kiftd-1.1.1-release目录挂载到容器内的/app/kiftd-1.1.1-release目录。这样的挂载通常用于将主机上的数据卷挂载到容器内,以实现数据的持久性。

docker -v选项

这是一个Docker运行时的-v--volume选项,用于将主机文件系统中的目录(左侧路径)挂载到容器中的目录(右侧路径)。在你提供的例子中:

  • -v /codegen/mysql/log:/var/log/mysql

这表示将主机上的/codegen/mysql/log目录挂载到容器内部的/var/log/mysql目录。这样做的目的可能是为了将MySQL容器的日志文件存储在主机上的指定目录,以便在主机和容器之间共享这些日志文件。

具体解释:

  • 主机路径(左侧): /codegen/mysql/log
  • 容器路径(右侧): /var/log/mysql

这意味着容器内的/var/log/mysql路径实际上是主机上的/codegen/mysql/log路径的映射。当容器写入/var/log/mysql时,实际上是写入主机上的/codegen/mysql/log目录,这使得主机和容器之间可以共享数据。

这样的挂载通常用于将容器中的数据持久化到主机,以便在容器重启或删除后保留数据。在这个例子中,它可能用于存储MySQL容器的日志文件,使得主机管理员可以轻松地查看和维护这些日志。

声明

作者: liyao

版权:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.O许可协议。转载请注明!

最后更新于 2026-02-18 18:09 history