文章目录
- 一、简介
- 二、DockerFile基础
- 1. DockerFile的作用和特点
- 2. DockerFile语法介绍
- 3. 基本指令:FROM、RUN、COPY、ADD等
- 三、编写具体项目使用DockerFile
- 四、构建镜像
- 1.项目构建
- 默认命令dockerfile文件
- 非默认命令dockerfile文件
- 小知识
- 2. 使用ENTRYPOINT和CMD指定容器启动命令
- 3. 容器与宿主机的文件共享和挂载
- 五、总结
一、简介
现在项目部署都不在是简单的打包推送了,而是容器化管理这样也便于扩充服务动态运维。很是优雅,所以呢对于现在经常使用的docker打包项目进行部署就写一篇详解,这里呢是我们项目很早就用上docker了,所以我就以一个简单的demo进行说明。
二、DockerFile基础
1. DockerFile的作用和特点
DockerFile是一种用于定义Docker镜像构建过程的文件。它的作用是描述镜像的组成部分和构建过程,包括从基础镜像开始,逐步添加软件包、依赖项和配置,最终生成一个新的、可用的镜像。DockerFile具有以下特点:
-
可追溯性:DockerFile中的每一条指令都可以追溯到具体的操作步骤,使得整个构建过程可被重新创建或修改。
-
可重复性:通过编写DockerFile,可以确保在不同的环境中反复构建出相同的镜像。这样可以减少因环境差异导致的构建错误和依赖问题。
-
版本控制:DockerFile可以与代码存储在同一个版本控制系统中,方便进行版本管理和团队协作。
-
自动化构建:通过DockerFile,可以实现镜像的自动构建,减少手动操作的繁琐性,并提高构建效率。
2. DockerFile语法介绍
DockerFile使用一系列指令来定义构建步骤,每个指令占据一行并以大写字母开头。
3. 基本指令:FROM、RUN、COPY、ADD等
在DockerFile中,可以使用多个指令来定义镜像的构建过程。下面是一些常用的指令及其说明:
-
FROM
:指定基础镜像。例如:FROM ubuntu:latest
表示以最新版的Ubuntu镜像为基础构建。 -
RUN
:在镜像中执行命令。例如:RUN apt-get update && apt-get install -y python3
表示在镜像中执行更新并安装Python3的命令。 -
COPY
:复制本地文件到镜像中。例如:COPY . /app
表示将当前目录中的所有文件复制到镜像中的/app目录下。 -
ADD
:类似于COPY指令,但还可以自动解压缩文件。例如:ADD app.tar.gz /
表示将压缩包解压并复制到镜像根目录下。 -
WORKDIR
:设置工作目录。例如:WORKDIR /app
表示将/app目录设置为工作目录。 -
EXPOSE
:声明容器运行时要监听的端口。例如:EXPOSE 80
表示声明容器要监听的端口号为80。 -
CMD
:指定容器启动时要执行的命令。该指令只能在DockerFile中出现一次。例如:CMD ["python", "app.py"]
表示容器启动时执行Python脚本app.py。 -
ENTRYPOINT
:类似于CMD指令,但它提供了固定的执行命令,并可以与CMD指令结合使用。例如:ENTRYPOINT ["nginx"]
表示容器启动时将执行nginx命令。 -
ENV
:设置环境变量。例如:ENV API_KEY=123456
表示在镜像中设置一个名为API_KEY的环境变量,并赋值为123456。 -
ARG
:定义构建参数。例如:ARG ENVIRONMENT=production
表示定义一个名为ENVIRONMENT的构建参数,默认值为production。
这些是DockerFile中常用的一些指令,每个指令都有特定的功能和语法。通过组合和使用这些指令,可以编写出具有特定功能和要求的Docker镜像构建过程。
三、编写具体项目使用DockerFile
#使用jdk11作为基础镜像
FROM openjdk:11
#
# 将jar包添加到容器中,并命名为 demo.jar
ADD testDemo.jar /home/admin/Demo.jar
# 指定Java的运行大小内存,也是设置变量,这个变量值是可以通过启动容器的时候重新指定的。
ENV JAVA_OPTS="-Xmx128m -Xms128m"
ENTRYPOINT java -jar /home/admin/Demo.jar
# SpringBoot项目配置的端口号为8090,需要将8090暴露出去
EXPOSE 8090
# 指示在容器启动时运行java -jar /home/admin/Demo.jar命令
ENTRYPOINT java -jar /home/admin/Demo.jar
四、构建镜像
1.项目构建
默认命令dockerfile文件
docker build --tag test1:v1.0 .
这条命令使用了 docker build
命令来构建一个 Docker 镜像,并给该镜像设置了名称和标签。
--tag myapp:v1.0
指定了镜像的名称和标签为myapp:v1.0
。可以根据自己的需要更改名称和标签来唯一标识该镜像,以便后续使用和管理。.
表示当前目录,它是docker build
命令的PATH
参数。这意味着当前目录中必须存在 Dockerfile 文件,因为 Docker 将在该文件中查找构建指令和配置信息来生成镜像。
当执行该命令时,Docker会读取当前目录中的 Dockerfile 文件,并遵循其中的指令进行镜像构建。构建过程涉及到依赖项的安装、环境配置、复制文件等操作,具体动作由 Dockerfile 中的指令定义。
最终,构建成功后的镜像将被打上指定的名称和标签(myapp:v1.0
),可以通过该名称和标签来引用和部署镜像。
非默认命令dockerfile文件
另一种dockerfile文件的名字不叫Dokcerfile并且Dockerfile和要被构建的jar不在一个目录下使用这中
docker build --tag myapp:v1.0 -f /dockerTest/DockerfileS /dockerTest
这条命令是使用 Docker 构建镜像的命令,并且使用了自定义的 Dockerfile 文件。
docker build
是构建镜像的命令。--tag myapp:v1.0
指定了镜像的名称和标签为myapp:v1.0
。可以根据需要修改名称和标签来唯一标识该镜像。-f /dockerTest/DockerfileS
使用了-f
参数来指定了自定义的 Dockerfile 文件的路径。这里的路径是/dockerTest/DockerfileS
,请注意大小写以及文件名的准确性。/dockerTest
是构建上下文的路径,指定了构建过程中 Docker 将查找文件和目录的位置。在该命令中,Docker 将在/dockerTest
目录中查找构建所需的文件和目录,包括指定的 Dockerfile 文件。
执行该命令后,Docker 将读取指定路径下的 Dockerfile 文件,并遵循其中的构建指令和配置信息来生成镜像。镜像将会被打上指定的名称和标签(myapp:v1.0
)。
小知识
可以看到我构建的这个镜像过程程序打印出来一共5个步骤,是不是在正好对应了我上面自定义的dockefile文件中的5条命令,这是因为docker根据这dockerfile文件命令构建镜像时一个命令执行就是一次镜像的生成,而后面的命令执行实在上一次命令打好的镜像基础上执行的,可以理解为套娃
2. 使用ENTRYPOINT和CMD指定容器启动命令
ENTRYPOINT指定容器启动时要执行的命令,CMD指定默认参数。
在 Dockerfile 中,ENTRYPOINT
和 CMD
都是用来指定容器启动时要执行的命令。但它们之间有一些关键的差异:
-
ENTRYPOINT
指令用于设置容器的入口点,即容器启动时要执行的命令或可执行文件。ENTRYPOINT
可以接受参数,并且这些参数将被视为要运行的命令的参数。在一个 Dockerfile 中只能使用一条ENTRYPOINT
指令,如果有多个ENTRYPOINT
指令,则只有最后一条生效。 -
CMD
指令用于设置容器启动时默认执行的命令。与ENTRYPOINT
不同的是,CMD
可以被docker run
命令行中指定的参数覆盖。在一个 Dockerfile 中可以使用多个CMD
指令,但只有最后一个生效。
在你的例子中,使用了 ENTRYPOINT
指令将 java -jar /home/admin/Demo.jar
作为容器的入口点。这表示每次启动容器时,都会执行该命令并运行 Demo.jar
。
如果你想添加一个默认参数,可以在 ENTRYPOINT
后面使用 CMD
来指定:
ENTRYPOINT java -jar /home/admin/Demo.jar
CMD ["--some-option"]
这样,在运行容器时如果没有显示指定参数,就会默认使用 --some-option
参数。
总的来说,ENTRYPOINT
和 CMD
的区别在于命令参数是否可以被覆盖。ENTRYPOINT
是容器的入口点,不会被覆盖,而 CMD
是默认执行的命令,可以被 docker run
命令行指定的参数覆盖。
3. 容器与宿主机的文件共享和挂载
使用VOLUME指令或docker run命令的-v参数,实现容器与宿主机之间的文件共享和挂载。
现在我们看一在服务器下的/home/admin/dockerTest/应该有一个名字叫 demo.jar 的jar包
五、总结
Docker和Dockerfile是现代化软件开发和部署的重要工具。通过使用Docker,可以实现快速、可靠和可移植的应用部署。而通过制作高质量的Dockerfile,可以确保镜像的可靠性和可维护性。掌握Docker和Dockerfile的使用和最佳实践,将极大地提高开发和部署效率。