首頁  >  文章  >  Java  >  怎麼使用dockerfile部署springboot項目

怎麼使用dockerfile部署springboot項目

PHPz
PHPz轉載
2023-05-15 23:55:133835瀏覽

一、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 指令指定的程式

# 命令格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINT可以和CMD一起用,一般是變參才會使用CMD ,這裡的CMD 等於是在給ENTRYPOINT 傳參。
當指定了ENTRYPOINT後,CMD的含義就發生了變化,不再是直接運行其命令而是將CMD的內容作為參數傳遞給ENTRYPOINT指令,他兩個組合會變成:

FROM ubuntu
ENTRYPOINT ["top", "-b"] # 定参
CMD ["-c"] # 变参
# 最终执行top -c,而如果使用命令行指定 -H,会替换CMD的-c

在執行docker run的時候可以指定ENTRYPOINT 運行所需的參數。如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。

三、使用dockerfile构建一个自带jdk的centos

1、下载jdk并上传至linux

2、编写Dockerfile

# 注意大写字母D
vi Dockerfile
# 指定基础镜像,需要保证本地有这个镜像
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

3、构建Dockerfile

注意!本目录下只有一个Dockerfile并且包含jdk安装包

怎麼使用dockerfile部署springboot項目

# 构建新镜像命令格式 。注意,上面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、运行一下试试

docker run -it 4dbff0755585 /bin/bash

#我们发现,新的镜像携带着vim、ifconfig和java环境了!

四、虚悬镜像

仓库名、标签都是的镜像,俗称dangling image

1、制造一个虚悬镜像

(1)创建Dockerfile

FROM centos
CMD echo &#39;action is success&#39;

(2)构建

docker build .

(3)查看

[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

(4)删除

# 删除虚悬镜像
docker image prune

虚悬镜像已经失去存在价值,可以删除

五、docker运行springboot项目

1、准备一个springboot项目

编写一个测试Controller,以供测试。

@RestController
@RequestMapping
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "启动成功 ===================test";
    }
}

2、手动构建jar包

我们使用maven package命令手动打包并上传到服务器上。

[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

注!通常来说这一步可以使用jenkins自动构建。

3、编写Dockerfile

# 基础镜像使用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 &#39;touch /cxf_docker.jar&#39;
ENTRYPOINT ["java","-jar","/cxf_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 8088

4、构建镜像

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

5、运行容器

docker run -d -p 8088:8088 7124eca083ad

6、访问测试

访问服务器我们的接口,发现测试成功!

以上是怎麼使用dockerfile部署springboot項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除