>  기사  >  Java  >  dockerfile을 사용하여 springboot 프로젝트를 배포하는 방법

dockerfile을 사용하여 springboot 프로젝트를 배포하는 방법

PHPz
PHPz앞으로
2023-05-15 23:55:133913검색

1. dockerfile 개요

Dockerfile은 Docker 이미지를 빌드하는 데 사용되는 텍스트 파일입니다. 이미지를 빌드하는 데 필요한 지침과 매개변수로 구성된 스크립트입니다.

1. Dockerfile 기본

1: 각 예약어 명령은 대문자여야 하며 뒤에는 하나 이상의 매개변수가 와야 합니다.必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交

2、Docker执行Dockerfile的大致流程

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

dockerfile을 사용하여 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: 명령은 위에서 아래로 순서대로 실행됩니다.

3 :# 주석을 나타냅니다.

4: 각 명령은 새 이미지 레이어를 생성하고 이미지를 제출합니다.

2. Docker가 Dockerfile을 실행하는 일반적인 프로세스

(1) docker는 기본 이미지에서 컨테이너를 실행합니다. 🎜 (2) 명령을 실행합니다. 그리고 컨테이너를 수정합니다. 🎜 (3) docker commit과 유사한 작업을 수행하여 새 이미지 레이어를 제출합니다. 🎜 (4) 그런 다음 Docker는 방금 제출한 이미지를 기반으로 새 컨테이너를 실행합니다. 🎜 (5) dockerfile에서 다음 명령을 실행합니다. 모든 지침이 완료될 때까지 실행이 완료됩니다🎜🎜dockerfile을 사용하여 springboot 프로젝트를 배포하는 방법🎜🎜3. 미러, 컨테이너 및 dockerfile 관계 🎜🎜응용 소프트웨어의 관점에서 Dockerfile, Docker 이미지 및 Docker 컨테이너는 각각 소프트웨어의 세 가지 단계를 나타냅니다. 🎜
    🎜Dockerfile 소프트웨어의 원료입니다🎜
  • 🎜Docker 이미지는 소프트웨어의 결과물입니다🎜
  • 🎜Docker 컨테이너는 소프트웨어 이미지의 실행 상태로 간주될 수 있습니다. 즉, 이미지에 따라 실행되는 컨테이너 인스턴스🎜 Dockerfile은 개발을 지향하고 Docker 이미지는 전달 표준이 되며 Docker 컨테이너에는 배포와 운영 및 유지 관리가 포함되며 이 세 가지는 모두 Docker의 초석 역할을 합니다. 체계. 🎜
🎜1 Dockerfile은 Dockerfile을 정의해야 합니다. Dockerfile은 프로세스에 필요한 모든 것을 정의합니다. Dockerfile에 포함된 콘텐츠에는 실행 코드 또는 파일, 환경 변수, 종속 패키지, 런타임 환경, 동적 링크 라이브러리, 운영 체제 배포, 서비스 프로세스 및 커널 프로세스(응용 프로그램 프로세스가 시스템 서비스 및 커널 프로세스를 처리해야 하는 경우)가 포함됩니다. 네임스페이스 권한 제어) 등을 설계하는 방법을 고려해야 합니다. 🎜2 Docker 이미지는 Dockerfile로 파일을 정의한 후 docker 빌드 중에 Docker 이미지가 생성되고 Docker 이미지가 실행되면 실제로 제공되기 시작합니다. services; 🎜3 Docker 컨테이너, 컨테이너가 직접 서비스를 제공합니다. 🎜🎜기본 구성 단계: (1) Dockerfile 파일 작성 (2) 이미지를 빌드하는 docker build 명령 (3) 이미지에 따라 컨테이너 인스턴스를 실행하는 docker run 🎜🎜 2. dockerfile의 공통 예약어 🎜🎜1, FROM 🎜🎜기본 이미지, 현재 새로운 이미지는 어떤 이미지를 기반으로 하나요? 기존 이미지를 템플릿으로 지정하세요. 첫 번째 명령은 FROM🎜
# 命令格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
🎜2, MAINTAINER 및 LABEL🎜🎜이미지 관리자의 이름과 이메일 주소🎜
FROM ubuntu
ENTRYPOINT ["top", "-b"] # 定参
CMD ["-c"] # 变参
# 最终执行top -c,而如果使用命令行指定 -H,会替换CMD的-c
여야 합니다. 🎜이 명령은 더 이상 사용되지 않습니다. LABEL을 사용하는 것이 좋습니다. 필요한 메타데이터를 설정할 수 있습니다. 🎜
# 注意大写字母D
vi Dockerfile
🎜3. RUN🎜🎜컨테이너 빌드 시 실행해야 하는 명령 RUN은 docker 빌드 중에 실행됩니다.🎜🎜 (1) 쉘 형식(일반적으로 사용됨) 🎜
# 指定基础镜像,需要保证本地有这个镜像
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) 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🎜🎜현재 컨테이너🎜
docker run -it 4dbff0755585 /bin/bash

#我们发现,新的镜像携带着vim、ifconfig和java环境了!
🎜5에서 노출되는 포트 WORKDIR🎜🎜는 컨테이너 생성 후 터미널이 기본적으로 로그인하는 작업 디렉터리를 지정하고, foothold🎜
FROM centos
CMD echo &#39;action is success&#39;
🎜6, USER🎜🎜는 어떤 종류의 사용자를 지정하는지 지정합니다. 둘 다 지정되지 않은 경우 기본값은 root🎜
docker build .
🎜7, ENV🎜🎜이며 이미지 빌드 프로세스 중 환경 변수를 설정하는 데 사용됩니다🎜
[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🎜🎜는 호스트 디렉터리에 파일을 복사합니다. 이미지에 자동으로 URL을 처리하고 tar 아카이브의 압축을 푼다🎜
# 删除虚悬镜像
docker image prune
🎜9, COPY🎜🎜 ADD와 유사하게 파일과 디렉터리를 이미지에 복사합니다. 🎜빌드 컨텍스트 디렉터리의 에서 이미지의 새 레이어에 있는 위치로 파일/디렉터리를 복사합니다. 🎜
@RestController
@RequestMapping
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "启动成功 ===================test";
    }
}
🎜10, VOLUME🎜🎜데이터 저장을 위한 컨테이너 데이터 볼륨 및 지속성 작업 🎜🎜11. CMD🎜🎜컨테이너가 시작된 후 수행할 작업을 지정하세요🎜🎜주의하세요! Dockerfile에는 여러 개의 CMD 명령이 있을 수 있지만 마지막 명령만 적용되며 docker run 후 CMD는 매개변수로 대체됩니다.🎜
[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는 docker run 시 실행됩니다. RUN은 docker 빌드 중에 실행됩니다. 🎜🎜12. ENTRYPOINT🎜🎜는 컨테이너가 시작될 때 실행할 명령을 지정하는 데에도 사용됩니다. 🎜🎜CMD 명령과 유사하지만 Docker 실행 후 명령으로 ENTRYPOINT를 덮어쓰지 않으며 이러한 명령줄 매개변수는 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는 CMD와 함께 사용할 수 있습니다. 일반적으로 CMD는 매개변수를 변경하는 데 사용됩니다. 여기서 CMD는 매개변수를 ENTRYPOINT에 전달하는 것과 같습니다. 🎜ENTRYPOINT가 지정되면 CMD의 의미가 변경됩니다. 명령을 직접 실행하는 대신 CMD의 내용이 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>🎜docker run을 실행할 때 ENTRYPOINT 작업에 필요한 매개변수를 지정할 수 있습니다. Dockerfile에 ENTRYPOINT 명령어가 여러 개 있는 경우 마지막 명령어만 적용됩니다. 🎜<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="dockerfile을 사용하여 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>

위 내용은 dockerfile을 사용하여 springboot 프로젝트를 배포하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제