这里写目录标题
- 1. Dockerfile常见指令
- 1.1 DockerFile例子
- 2. 一些其他命令
1. Dockerfile常见指令
简单的dockerFile文件
FROM openjdk:17
LABEL author=leifengyang
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
# 使用JDK 8的官方Java运行环境镜像
FROM openjdk:8-jre-slim
WORKDIR /app
# 将本地的jar文件复制到容器中
COPY ./path/to/your/app.jar /app/app.jar
# 暴露需要的端口,假设你的应用使用8080端口
EXPOSE 8080
# 设置容器启动时执行的命令
CMD ["java", "-jar", "app.jar"]
之后需要构建Docker镜像
docker build -t your-app-name .
命令 docker build -t your-app-name .
用于根据当前目录下的 Dockerfile 和上下文环境来创建 Docker 镜像。
-
docker build
:这是用来构建 Docker 镜像的命令。它读取 Dockerfile 并执行其中的指令来组装镜像。 -
-t your-app-name
:这个选项用于为新创建的镜像添加一个标签(在此例中为 your-app-name)。标签是一种给 Docker 镜像命名的方式,可以包括仓库名、镜像名和标签,格式通常是 repository/name:tag,其中标签是可选的。这有助于后续组织和检索镜像。 -
.
:这表示构建的上下文。点号 . 表示当前目录,意味着 Docker 将在当前目录查找 Dockerfile。上下文包括指定目录中的所有文件和子目录。在构建过程中,Dockerfile 可以访问这些文件。
最后运行容器,将容器的8080端口映射到本地的8989端口:
docker run -p 8989:8080 your-app-name
1.1 DockerFile例子
[fanzhen@localhost resource]$ cat Dockerfile
FROM frolvlad/alpine-java:jdk8-slim
ADD . /root/why
WORKDIR /root/why
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 12019
CMD ["sh","start.sh"]
这个 Dockerfile 定义了一个用来构建 Docker 镜像的过程,主要用于创建一个基于 Java 的环境。下面我逐行解释一下这个 Dockerfile 中的每条指令:
FROM frolvlad/alpine-java:jdk8-slim
- 这一行指定了镜像的基础来源,即使用一个预构建的镜像 frolvlad/alpine-java:jdk8-slim。这个基础镜像基于 Alpine Linux,并且预装了 Java JDK 8 的精简版。
ADD . /root/why
- 这一条指令将构建上下文的当前目录(Dockerfile 所在的目录)中的所有文件和目录添加到容器的 /root/why 目录。
WORKDIR /root/why
- 设置工作目录为 /root/why。之后的指令(比如 RUN、CMD 等)都会在这个目录下执行。
ENV TZ=Asia/Shanghai
- 设置环境变量 TZ(时区)为 Asia/Shanghai,以确保容器内的时间与上海时间同步。
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
- 这条 RUN 指令通过创建符号链接,将系统的时区设置为环境变量 TZ 所指定的时区(此处为上海)。同时,它将时区值写入到 /etc/timezone 文件,这样容器内的应用程序可以正确地识别时区配置。
EXPOSE 12019
- 指明容器在运行时会监听端口 12019。这不会自动映射端口到宿主机,但是为运行时提供了元数据说明容器服务预期会使用哪个端口。
CMD ["sh","start.sh"]
- 定义容器启动后执行的默认命令。这里使用 sh 命令执行 start.sh 脚本。如果 start.sh 是一个启动脚本,这条指令会启动应用程序。
这个 Dockerfile 的主要用途是设置一个适合 Java 应用的环境,具体到设置工作目录、调整时区和准备启动命令。
[fanzhen@localhost resource]$ cat start.sh
nohup java -jar ict-graph-search-api-0.0.1-SNAPSHOT.jar > /root/why/logs/log.out 2>&1
该命令用于在 Linux 系统中启动一个 Java 应用程序,并使其在后台运行,即使终端会话结束后也不会被终止。下面是对命令的详细解释:
-
nohup: 这是一个命令,用于运行另一个命令,使得即使终端会话结束,该命令也会继续运行。nohup 的名字来源于 “no hang up” 的缩写,意思是不挂断运行。
-
java -jar ict-graph-search-api-0.0.1-SNAPSHOT.jar
: 这部分是实际被 nohup 运行的命令。这里使用 Java 运行时来启动一个 jar 包(Java ARchive),这是一个包含 Java 应用程序及其依赖项的压缩文件。ict-graph-search-api-0.0.1-SNAPSHOT.jar
是 jar 文件的名称,通常 -SNAPSHOT 表示这是一个开发中的版本。 -
>:
这是重定向操作符,用于将命令的标准输出(stdout)重定向到指定的文件中。 -
/root/why/logs/log.out:
这是输出文件的路径,即上述 Java 应用的标准输出和标准错误将被写入这个文件。这通常用于日志记录,便于后续查看应用程序的运行情况。 -
2>&1:
这是另一个重定向操作符,用于将标准错误(stderr)重定向到标准输出(stdout)。这里,它意味着错误信息也会被写入到 log.out 文件中,与标准输出合并。
整体上,这条命令的作用是在后台无中断地启动 Java 应用,并将其运行输出(包括错误信息)记录到一个日志文件中,这对于生产环境中的长时间运行和问题追踪非常有用。
[fanzhen@localhost ict-graph-search-api]$ cat graph-docker-run.sh
# 文件挂载目录
FILE_MOUNT_DIRECTORY=$(pwd)/resource
docker run -p 19999:8989 --name ict-graph-search-api \
--restart=always \
-v $FILE_MOUNT_DIRECTORY/config:/root/why/config \
-v $FILE_MOUNT_DIRECTORY/ict-graph-search-api-0.0.1-SNAPSHOT.jar:/root/why/ict-graph-search-api-0.0.1-SNAPSHOT.jar \
-v $FILE_MOUNT_DIRECTORY/logs:/root/why/logs \
-d ict-graph-search-api
这个脚本 graph-docker-run.sh
用于启动一个 Docker 容器,并通过挂载一些本地目录到容器内部来配置一个 Java 应用。下面是对这个脚本中每个部分的解释:
- 定义文件挂载目录:
FILE_MOUNT_DIRECTORY=$(pwd)/resource
- 这一行定义了一个变量 FILE_MOUNT_DIRECTORY,它的值设置为当前工作目录下的 resource 子目录的绝对路径。
- 启动 Docker 容器的命令:
docker run -p 19999:8989 --name ict-graph-search-api --restart=always -v $FILE_MOUNT_DIRECTORY/config:/root/why/config -v $FILE_MOUNT_DIRECTORY/ict-graph-search-api-0.0.1-SNAPSHOT.jar:/root/why/ict-graph-search-api-0.0.1-SNAPSHOT.jar -v $FILE_MOUNT_DIRECTORY/logs:/root/why/logs -d ict-graph-search-api
- docker run: 运行一个新的 Docker 容器。
-p 19999:8989
: 映射宿主机的端口 19999 到容器的端口 8989。这通常是应用监听的端口。--name ict-graph-search-api
: 设置容器的名称为 ict-graph-search-api。--restart=always
: 设置重启策略为始终重新启动容器,确保在退出或失败时容器可以自动重启。-v $FILE_MOUNT_DIRECTORY/config:/root/why/config
: 将宿主机上的 config 目录挂载到容器内的 /root/why/config 目录。这样容器内的应用可以使用这些配置文件。-v $FILE_MOUNT_DIRECTORY/ict-graph-search-api-0.0.1-SNAPSHOT.jar:/root/why/ict-graph-search-api-0.0.1-SNAPSHOT.jar
: 将应用的 jar 文件从宿主机挂载到容器内。-v $FILE_MOUNT_DIRECTORY/logs:/root/why/logs
: 将宿主机的 logs 目录挂载到容器内的 /root/why/logs 目录,用于存储日志文件。-d ict-graph-search-api
: 以 detached 模式运行容器,并指定使用 ict-graph-search-api 镜像。
2. 一些其他命令
删除其他容器
删除全部的卷