Heim  >  Artikel  >  Java  >  So verwenden Sie Dockerfile zum Bereitstellen eines Springboot-Projekts

So verwenden Sie Dockerfile zum Bereitstellen eines Springboot-Projekts

PHPz
PHPznach vorne
2023-05-15 23:55:133912Durchsuche

1. Übersicht über Dockerfile

Dockerfile ist eine Textdatei, die zum Erstellen eines Docker-Images verwendet wird. Es handelt sich um ein Skript, das aus Anweisungen und Parametern besteht, die zum Erstellen des Images erforderlich sind.

1. Dockerfile-Grundlagen

1: Jede reservierte Wortanweisung muss in Großbuchstaben erfolgen und muss von mindestens einem Parameter gefolgt werden必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交

2、Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成

So verwenden Sie Dockerfile zum Bereitstellen eines Springboot-Projekts

3、镜像、容器、dockerfile的关系

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料

  • Docker镜像是软件的交付品

  • Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。

基本构建步骤:(1)编写Dockerfile文件(2)docker build命令构建镜像(3)docker run依镜像运行容器实例

二、dockerfile常用保留字

1、FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条命令必须是FROM

# 命令格式
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
# 实例:
FROM centos:7.0

2、MAINTAINER与LABEL

镜像维护者的姓名和邮箱地址

# 命令格式
MAINTAINER <name>

该命令已经废弃了。推荐使用LABEL,它可以设置您需要的任何元数据。

# 命令格式
LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

3、RUN

容器构建时需要运行的命令,RUN是在 docker build时运行

(1)shell格式(常用)

# <命令行命令> 等同于,在终端操作的shell命令
RUN <命令行命令>

(2)exec格式

# 录入:RUN ["./test.php", "dev", "offline"] 等价于RUN ./test.php dev offline
RUN ["可执行文件", "param1", "param2"]

4、EXPOSE

当前容器对外暴露出的端口

EXPOSE 80
EXPOSE 80/tcp
EXPOSE 80/udp

5、WORKDIR

指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

WORKDIR /path/to/workdir

6、USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

# 命令格式
USER <user>[:<group>]
USER <UID>[:<GID>]

# 实例
USER cxf

7、ENV

用来在构建镜像过程中设置环境变量

# 命令格式
ENV <key>=<value> ...

# 实例
ENV MY_PATH /usr/mytest
#这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,
#比如:WORKDIR $MY_PATH

8、ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

ADD a.tar.gz /mydir/

9、COPY

类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 的文件/目录复制到新的一层的镜像内的 位置

COPY src dest
COPY ["src", "dest"]
<src源路径>:源文件或者源目录
<dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

10、VOLUME

容器数据卷,用于数据保存和持久化工作

11、CMD

指定容器启动后的要干的事情

注意!Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

# 覆盖默认的CMD,不会启动tomcat
docker exec -it comcat /bin/bash

CMD是在docker run 时运行。RUN是在 docker build时运行。

12、ENTRYPOINT

也是用来指定一个容器启动时要运行的命令。

类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序2: Die Anweisungen werden in der Reihenfolge von oben nach unten ausgeführt

3 :# Zeigt Kommentare an

4: Jede Anweisung erstellt eine neue Bildebene und sendet das Bild

2 Der allgemeine Prozess der Docker-Ausführung durch Docker

(1) Docker führt einen Container aus dem Basisbild aus 🎜 (2) Führen Sie eine Anweisung aus und Nehmen Sie Änderungen am Container vor 🎜 (3) Führen Sie einen Vorgang ähnlich dem Docker-Commit aus, um eine neue Bildebene zu übermitteln 🎜 (4) Docker führt dann einen neuen Container basierend auf dem soeben übermittelten Bild aus 🎜 (5) Führen Sie die nächste Anweisung in der Docker-Datei aus bis alle Anweisungen abgeschlossen sind🎜🎜So verwenden Sie Dockerfile, um ein Springboot-Projekt bereitzustellen🎜🎜3. Spiegel-, Container- und Dockerfile-Beziehung 🎜🎜Aus der Perspektive der Anwendungssoftware stellen Dockerfile, Docker-Image und Docker-Container jeweils drei verschiedene Phasen der Software dar, 🎜
    🎜Dockerfile Es ist das Rohmaterial der Software🎜
  • 🎜Das Docker-Image ist das Ergebnis der Software🎜
  • 🎜Der Docker-Container kann als der laufende Zustand des Software-Images betrachtet werden. Das heißt, die Containerinstanz, die gemäß der Image-Docker-Datei ausgeführt wird, ist auf die Entwicklung ausgerichtet, das Docker-Image wird zum Bereitstellungsstandard und der Docker-Container umfasst die Bereitstellung sowie den Betrieb und die Wartung. Diese drei sind unverzichtbar und bilden zusammen den Eckpfeiler von Docker System. 🎜
🎜1 Dockerfile, Sie müssen ein Dockerfile definieren, das alles definiert, was der Prozess benötigt. Der an Dockerfile beteiligte Inhalt umfasst das Ausführen von Code oder Dateien, Umgebungsvariablen, abhängigen Paketen, Laufzeitumgebungen, dynamischen Linkbibliotheken, Betriebssystemverteilungen, Dienstprozessen und Kernelprozessen (wenn der Anwendungsprozess mit Systemdiensten und Kernelprozessen umgehen muss, sind dies Sie). (Sie müssen überlegen, wie Sie die Namespace-Berechtigungssteuerung entwerfen) usw.; 🎜2 Docker-Image: Nach dem Definieren einer Datei mit Dockerfile wird während der Docker-Erstellung ein Docker-Image generiert, und wenn das Docker-Image ausgeführt wird, wird es tatsächlich bereitgestellt Dienste; 🎜3 Docker-Container, der Container stellt Dienste direkt bereit. 🎜🎜Grundlegende Konstruktionsschritte: (1) Dockerfile-Datei schreiben (2) Docker-Build-Befehl zum Erstellen des Images (3) Docker-Ausführung, um die Containerinstanz entsprechend dem Image auszuführen 🎜🎜 2. Gemeinsame reservierte Wörter in Dockerfile 🎜🎜1, FROM 🎜🎜Grundlegendes Bild, derzeit neu. Auf welchem ​​Bild basiert das Bild? Geben Sie ein vorhandenes Bild als Vorlage an. Der erste Befehl muss FROM🎜
# 命令格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
🎜2, MAINTAINER und LABEL🎜🎜Der Name und die E-Mail-Adresse des Bildbetreuers sein 🎜Dieser Befehl ist veraltet. LABEL wird empfohlen, es kann alle benötigten Metadaten festlegen. 🎜
FROM ubuntu
ENTRYPOINT ["top", "-b"] # 定参
CMD ["-c"] # 变参
# 最终执行top -c,而如果使用命令行指定 -H,会替换CMD的-c
🎜3. Der Befehl, der beim Erstellen des Containers ausgeführt werden muss, wird während des Docker-Builds ausgeführt. 🎜
# 注意大写字母D
vi Dockerfile
🎜 (2) Exec-Format. EXPOSE🎜🎜aktuell Der vom Container bereitgestellte Port🎜
# 指定基础镜像,需要保证本地有这个镜像
FROM centos
# 指定作者邮箱
MAINTAINER cxf
# 工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 准备工作
RUN cd /etc/yum.repos.d/
RUN sed -i &#39;s/mirrorlist/#mirrorlist/g&#39; /etc/yum.repos.d/CentOS-*
RUN sed -i &#39;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&#39; /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN cd /usr/local
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_351
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
🎜5, WORKDIR🎜🎜gibt das Arbeitsverzeichnis an, in dem sich das Terminal standardmäßig anmeldet, nachdem der Container erstellt wurde, ein Standbein🎜
# 构建新镜像命令格式 。注意,上面TAG后面有个空格,有个点
docker build -t 新镜像名字:TAG .
# 构建我们的镜像,等一会就会构建成功
docker build -t centosjava8:1.0 .

[root@localhost myfile]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED          SIZE
centosjava8                   1.0       4dbff0755585   34 seconds ago   747MB
centos                        latest    5d0da3dc9764   19 months ago    231MB
🎜6, USER🎜🎜gibt an, um welche Art von Benutzer es sich handelt Das Image wird ausgeführt als. Wenn keines von beiden angegeben ist, ist der Standardwert root🎜
docker run -it 4dbff0755585 /bin/bash

#我们发现,新的镜像携带着vim、ifconfig和java环境了!
🎜7, ENV🎜🎜 wird zum Festlegen von Umgebungsvariablen während des Image-Erstellungsprozesses verwendet🎜
FROM centos
CMD echo &#39;action is success&#39;
🎜8, ADD🎜🎜 zum Kopieren der Dateien in das Hostverzeichnis in das Bild einfügen und automatisch die URL verarbeiten und das TAR-Archiv entpacken🎜
docker build .
🎜9, KOPIEREN🎜🎜Ähnlich wie HINZUFÜGEN, kopieren Sie Dateien und Verzeichnisse in das Bild. 🎜Kopieren Sie die Dateien/Verzeichnisse vom im Build-Kontextverzeichnis zum 🎜🎜11. CMD🎜🎜Geben Sie an, was nach dem Start des Containers zu tun ist🎜🎜Achtung! Die Docker-Datei kann mehrere CMD-Anweisungen enthalten, aber nur die letzte wird wirksam und CMD wird nach der Docker-Ausführung durch die Parameter ersetzt🎜
[root@localhost xu]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED          SIZE
centosjava8                   1.0       4dbff0755585   31 minutes ago   747MB
<none>                        <none>    9818ccf3738e   19 months ago    231MB
centos                        latest    5d0da3dc9764   19 months ago    231MB

# 查看所有虚悬镜像
[root@localhost xu]# docker image ls -f dangling=true
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
<none>       <none>    9818ccf3738e   19 months ago   231MB
🎜CMD wird ausgeführt, wenn Docker ausgeführt wird. RUN wird während des Docker-Builds ausgeführt. 🎜🎜12. ENTRYPOINT🎜🎜 wird auch verwendet, um den Befehl anzugeben, der beim Start eines Containers ausgeführt werden soll. 🎜🎜Ähnlich dem CMD-Befehl, aber ENTRYPOINT wird nicht durch Befehle nach der Docker-Ausführung überschrieben und diese Befehlszeilenparameter werden als Parameter für das durch den ENTRYPOINT-Befehl angegebene Programm verwendet Code> 🎜<pre class="brush:bash;"># 删除虚悬镜像 docker image prune</pre>🎜ENTRYPOINT kann zusammen mit CMD verwendet werden. Im Allgemeinen wird CMD zum Ändern von Parametern verwendet, was der Übergabe von Parametern an ENTRYPOINT entspricht. 🎜Wenn ENTRYPOINT angegeben wird, ändert sich die Bedeutung von CMD, anstatt seinen Befehl direkt auszuführen. Die Kombination aus beiden wird zu: „🎜<pre class="brush:java;">@RestController @RequestMapping public class TestController { @GetMapping(&quot;/test&quot;) public String test(){ return &quot;启动成功 ===================test&quot;; } }</pre>🎜Beim Ausführen von Docker Run können Sie die für den ENTRYPOINT-Vorgang erforderlichen Parameter angeben. Wenn die Docker-Datei mehrere ENTRYPOINT-Anweisungen enthält, wird nur die letzte wirksam. 🎜<h3>三、使用dockerfile构建一个自带jdk的centos</h3> <h4>1、下载jdk并上传至linux</h4> <h4>2、编写Dockerfile</h4><pre class="brush:bash;"># 注意大写字母D vi Dockerfile</pre><pre class="brush:bash;"># 指定基础镜像,需要保证本地有这个镜像 FROM centos # 指定作者邮箱 MAINTAINER cxf # 工作目录 ENV MYPATH /usr/local WORKDIR $MYPATH # 准备工作 RUN cd /etc/yum.repos.d/ RUN sed -i &amp;#39;s/mirrorlist/#mirrorlist/g&amp;#39; /etc/yum.repos.d/CentOS-* RUN sed -i &amp;#39;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&amp;#39; /etc/yum.repos.d/CentOS-* RUN yum makecache RUN cd /usr/local #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u351-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_351 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATH CMD echo &quot;success--------------ok&quot; CMD /bin/bash</pre><h4>3、构建Dockerfile</h4> <p>注意!本目录下只有一个Dockerfile并且包含jdk安装包</p> <p><img src="https://img.php.cn/upload/article/000/000/164/168416611791162.png" alt="So verwenden Sie Dockerfile zum Bereitstellen eines Springboot-Projekts"></p><pre class="brush:bash;"># 构建新镜像命令格式 。注意,上面TAG后面有个空格,有个点 docker build -t 新镜像名字:TAG . # 构建我们的镜像,等一会就会构建成功 docker build -t centosjava8:1.0 . [root@localhost myfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centosjava8 1.0 4dbff0755585 34 seconds ago 747MB centos latest 5d0da3dc9764 19 months ago 231MB</pre><h4>4、运行一下试试</h4><pre class="brush:bash;">docker run -it 4dbff0755585 /bin/bash #我们发现,新的镜像携带着vim、ifconfig和java环境了!</pre><h3>四、虚悬镜像</h3> <p>仓库名、标签都是<none>的镜像,俗称dangling image</none></p> <h4>1、制造一个虚悬镜像</h4> <p>(1)创建Dockerfile</p><pre class="brush:bash;">FROM centos CMD echo &amp;#39;action is success&amp;#39;</pre><p>(2)构建</p><pre class="brush:bash;">docker build .</pre><p>(3)查看</p><pre class="brush:bash;">[root@localhost xu]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centosjava8 1.0 4dbff0755585 31 minutes ago 747MB &lt;none&gt; &lt;none&gt; 9818ccf3738e 19 months ago 231MB centos latest 5d0da3dc9764 19 months ago 231MB # 查看所有虚悬镜像 [root@localhost xu]# docker image ls -f dangling=true REPOSITORY TAG IMAGE ID CREATED SIZE &lt;none&gt; &lt;none&gt; 9818ccf3738e 19 months ago 231MB</pre><p>(4)删除</p><pre class="brush:bash;"># 删除虚悬镜像 docker image prune</pre><p>虚悬镜像已经失去存在价值,可以删除</p> <h3>五、docker运行springboot项目</h3> <h4>1、准备一个springboot项目</h4> <p>编写一个测试Controller,以供测试。</p><pre class="brush:java;">@RestController @RequestMapping public class TestController { @GetMapping(&quot;/test&quot;) public String test(){ return &quot;启动成功 ===================test&quot;; } }</pre><h4>2、手动构建jar包</h4> <p>我们使用maven package命令手动打包并上传到服务器上。</p><pre class="brush:bash;">[root@localhost ~]# cd mydocker/ [root@localhost mydocker]# ll total 17084 -rw-r--r--. 1 root root 17491177 Apr 9 14:18 demo-0.0.1-SNAPSHOT.jar</pre><p>注!通常来说这一步可以使用jenkins自动构建。</p> <h4>3、编写Dockerfile</h4><pre class="brush:bash;"># 基础镜像使用java FROM centosjava8:1.0 # 作者 MAINTAINER cxf # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为cxf_docker.jar ADD demo-0.0.1-SNAPSHOT.jar /cxf_docker.jar # 运行jar包 RUN bash -c &amp;#39;touch /cxf_docker.jar&amp;#39; ENTRYPOINT [&quot;java&quot;,&quot;-jar&quot;,&quot;/cxf_docker.jar&quot;] #暴露6001端口作为微服务 EXPOSE 8088</pre><h4>4、构建镜像</h4><pre class="brush:bash;">docker build -t mydemo:1.0 . [root@localhost mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mydemo 1.0 7124eca083ad 26 seconds ago 764MB centosjava8 1.0 4dbff0755585 7 hours ago 747MB</pre><h4>5、运行容器</h4><pre class="brush:bash;">docker run -d -p 8088:8088 7124eca083ad</pre><h4>6、访问测试</h4> <p>访问服务器我们的接口,发现测试成功!</p>

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Dockerfile zum Bereitstellen eines Springboot-Projekts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen