Maison  >  Article  >  Java  >  Comment utiliser Dockerfile pour déployer le projet Springboot

Comment utiliser Dockerfile pour déployer le projet Springboot

PHPz
PHPzavant
2023-05-15 23:55:133835parcourir

1. Présentation de dockerfile

Dockerfile est un fichier texte utilisé pour créer une image Docker. Il s'agit d'un script composé d'instructions et de paramètres requis pour créer l'image.

1. Les bases du Dockerfile

1 : Chaque instruction de mot réservé doit être en lettres majuscules et doit être suivie d'au moins un paramètre必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交

2、Docker执行Dockerfile的大致流程

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

Comment utiliser Dockerfile pour déployer le projet Springboot

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 : Les instructions sont exécutées dans l'ordre de haut en bas

3. :# Indique des commentaires

4 : Chaque instruction créera un nouveau calque d'image et soumettra l'image

2 Le processus général de Docker exécutant Dockerfile

(1) Docker exécute un conteneur à partir de l'image de base 🎜 (2) Exécuter une instruction. et Apportez des modifications au conteneur 🎜 (3) Effectuez une opération similaire à docker commit pour soumettre une nouvelle couche d'image 🎜 (4) Docker exécute ensuite un nouveau conteneur basé sur l'image qui vient d'être soumise 🎜 (5) Exécutez l'instruction suivante dans le fichier docker jusqu'à ce que toutes les instructions soient exécutées🎜🎜Comment utiliser Dockerfile pour déployer le projet Springboot🎜🎜3. Relation miroir, conteneur et dockerfile 🎜🎜Du point de vue du logiciel d'application, Dockerfile, Docker image et Docker conteneur représentent respectivement trois étapes différentes du logiciel, 🎜
    🎜Dockerfile C'est la matière première du logiciel🎜
  • 🎜L'image Docker est le livrable du logiciel🎜
  • 🎜Le conteneur Docker peut être considéré comme l'état d'exécution de l'image logicielle, c'est-à-dire que l'instance de conteneur exécutée selon l'image🎜 Dockerfile est orientée vers le développement, l'image Docker devient la norme de livraison et le conteneur Docker implique le déploiement, l'exploitation et la maintenance. Les trois sont indispensables et, ensemble, ils servent de pierre angulaire de Docker. système. 🎜
🎜1 Dockerfile, vous devez définir un Dockerfile qui définit tout ce dont le processus a besoin. Le contenu impliqué dans Dockerfile comprend l'exécution de code ou de fichiers, les variables d'environnement, les packages dépendants, l'environnement d'exécution, la bibliothèque de liens dynamiques, la distribution du système d'exploitation, le processus de service et le processus du noyau (lorsque le processus d'application doit gérer les services système et les processus du noyau, cela Vous (vous devez réfléchir à la façon de concevoir le contrôle des autorisations de l'espace de noms), etc. ; 🎜2 Image Docker, après avoir défini un fichier avec Dockerfile, une image Docker sera générée lors de la construction de Docker, et lorsque l'image Docker sera exécutée, elle commencera en fait à fournir services ; 🎜3 Conteneur Docker , le conteneur fournit directement des services. 🎜🎜Étapes de construction de base : (1) Écrire le fichier Dockerfile (2) Commande docker build pour construire l'image (3) Docker run pour exécuter l'instance de conteneur selon l'image 🎜🎜 2. Mots réservés couramment utilisés dans le fichier docker 🎜🎜1, FROM 🎜🎜Image de base, actuellement nouvelle Sur quelle image l'image est-elle basée ? Spécifiez une image existante comme modèle. La première commande doit être FROM🎜
# 命令格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
🎜2, MAINTAINER et LABEL🎜🎜Le nom et l'adresse e-mail du responsable de l'image🎜.
FROM ubuntu
ENTRYPOINT ["top", "-b"] # 定参
CMD ["-c"] # 变参
# 最终执行top -c,而如果使用命令行指定 -H,会替换CMD的-c
🎜Cette commande est obsolète. LABEL est recommandé, il peut définir toutes les métadonnées dont vous avez besoin. 🎜
# 注意大写字母D
vi Dockerfile
🎜3. RUN🎜🎜La commande qui doit être exécutée lors de la construction du conteneur. RUN est exécutée pendant la construction du docker🎜🎜 (1) format shell (couramment utilisé) 🎜
# 指定基础镜像,需要保证本地有这个镜像
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
🎜 (2) format exec🎜
# 构建新镜像命令格式 。注意,上面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
🎜4. EXPOSE🎜🎜actuellement Le port exposé par le conteneur🎜
docker run -it 4dbff0755585 /bin/bash

#我们发现,新的镜像携带着vim、ifconfig和java环境了!
🎜5, WORKDIR🎜🎜spécifie le répertoire de travail où le terminal se connecte par défaut après la création du conteneur, un pied🎜
FROM centos
CMD echo &#39;action is success&#39;
🎜6, USER🎜🎜spécifie quel type d'utilisateur l'image sera exécutée comme. Si aucun des deux n'est spécifié, la valeur par défaut est root🎜
docker build .
🎜7, ENV🎜🎜 utilisé pour définir les variables d'environnement pendant le processus de création de l'image🎜
[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
🎜8, ADD🎜🎜 pour copier les fichiers dans le répertoire hôte. dans l'image et traite automatiquement l'URL et décompressez l'archive tar🎜
# 删除虚悬镜像
docker image prune
🎜9, COPIER🎜🎜Similaire à AJOUTER, copiez les fichiers et les répertoires dans l'image. 🎜Copiez les fichiers/répertoires du dans le répertoire de contexte de construction vers l'emplacement dans la nouvelle couche de l'image🎜
@RestController
@RequestMapping
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "启动成功 ===================test";
    }
}
🎜10, VOLUME🎜🎜volume de données du conteneur pour le stockage des données et le travail de persistance. 🎜🎜11. CMD🎜🎜Spécifiez quoi faire après le démarrage du conteneur🎜🎜Attention ! Il peut y avoir plusieurs instructions CMD dans le Dockerfile, mais seule la dernière prend effet, et CMD sera remplacé par les paramètres après l'exécution du docker🎜
[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
🎜CMD est exécuté lors de l'exécution du docker. RUN est exécuté pendant la construction du docker. 🎜🎜12. ENTRYPOINT🎜🎜 est également utilisé pour spécifier la commande à exécuter au démarrage d'un conteneur. 🎜🎜Similaire à la commande CMD, mais ENTRYPOINT ne sera pas écrasé par la commande après l'exécution de Docker, et ces paramètres de ligne de commande seront utilisés comme paramètres du programme spécifié par la commande ENTRYPOINT 🎜<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>🎜ENTRYPOINT peut être utilisé avec CMD. Généralement, CMD est utilisé pour modifier les paramètres. CMD équivaut ici à passer des paramètres à ENTRYPOINT. 🎜Lorsque ENTRYPOINT est spécifié, la signification de CMD change. Au lieu d'exécuter sa commande directement, le contenu de CMD est passé en paramètre à l'instruction ENTRYPOINT. La combinaison des deux deviendra : <entrypoint> ”🎜<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>🎜Lors de l'exécution de Docker Run, vous pouvez spécifier les paramètres requis pour le fonctionnement d'ENTRYPOINT. S'il y a plusieurs instructions ENTRYPOINT dans le Dockerfile, seule la dernière prendra effet. 🎜<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="Comment utiliser Dockerfile pour déployer le projet Springboot"></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></entrypoint>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer