【docker】Dockerfile 与 spring项目整合dockerfile

1. Dockerfile概述

​ dockerfile是一个用于构建镜像的文本文件。docker通过读取Dockerfile中的指令自动生成镜像。

相当于将镜像与命令、维护信息整合的脚本

2. Dockerfile结构

​ Dockerfile 一般分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

注意:docker是以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。

可以在Dockerfile中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

3. 快速入门

3.1 创建dockerfile文件, 编辑内容

FROM redis
MAINTAINER OHB

3.2 运行Dockerfile

docker build -t 镜像名称:版本(tag) -f 文件名称 .
# 注意命令结尾处:[空格]+. -t:定义拉取的镜像名称和版本 -f:指定构建的文件名称 .:表示当前路径

4. Dockerfile文件常用指令

FROM

​ FROM指令初始化一个新的构建阶段,并为后续指令设置基础镜像。因此,有效的 Dockerfile 必须以 FROM 指令开头

FROM类似于Java中extends关键字继承于基础镜像,即FROM之后的内容都依赖于此基础镜像。

格式:
  FROM 镜像名称
  FROM 镜像名称:<tag>
  FROM 镜像名称@<digest>
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

示例:

FROM mysql:5.6

MAINTAINER

​ MAINTAINER指令用于指定维护者的信息,用于为Dockerfile署名。

格式:

MAINTAINER 名字

示例:

MAINTAINER Krio

注意: 新版docker 使用 LABEL来指明

LABEL

可以指定镜像元数据,如:镜像作者等

格式:

LABEL = = = …

一个Dockerfile种可以有多个LABEL,如下:

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.”

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号

LABEL multi.label1=“value1”
multi.label2=“value2”
other=“value3”

docker inspect 命令可以查看LABEL

ADD

该命令可认为是增强版的COPY,不仅支持COPY,还支持解缩。可以将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)。

格式:

ADD 源文件路径 目标文件在容器中的路径
ADD [“src”,“dest”] 用于支持包含空格的路径 #从src目录复制文件到容器的dest。

示例:

ADD target/springboot-dockerfile-1.0-SNAPSHOT.jar /app.jar
# 将本机 target/springboot-dockerfile-1.0-SNAPSHOT.jar文件 (此处是一个项目相对路径)拷贝到容器内/app.jar (拷贝到容器根目录下重命名为app.jar)

COPY

复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的目标路径

格式:

COPY [“src”,“dest”]
#src:源文件或源目录
#dest:容器内指定的路径,若所指定的路径不存在,则会自动创建好。

ENTRYPOINT

指定容器启动时运行的启动命令

格式:

ENTRYPOINT [“executable”, “param1”, “param2”] (可执行文件, 参数1,参数2)
ENTRYPOINT command param1 param2 (shell内部命令)

注意:

ENTRYPOINT功能类似于CMD,配置容器启动后执行的命令及参数,并且不可被 docker run 提供的参数覆盖,而是追加。

如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数;如果docker run后面没有额外参数,但是dockerfile中的CMD里有(即下面CMD的第三种用法),那么CMD的全部内容会作为ENTRYPOINT的参数

可以通过docker run –entrypoint 参数在运行时替换

使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

示例:

ENTRYPOINT ["java","-jar","/app.jar"]
-----
FROM ubuntu:18.04
RUN apt update \
&& apt -y install  curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s","https://ip.cn"]

[root@centos8 ubuntu]#podman run -it --rm f68e006 
{"ip": "111.199.187.36", "country": "北京市", "city": "联通"}

#追加-i参数
[root@centos8 ubuntu]#podman run -it --rm f68e006  -i
HTTP/2 200 
date: Sun, 23 Feb 2020 08:05:19 GMT
content-type: application/json; charset=UTF-8
set-cookie: __cfduid=d4a22496ea6f3b2861763354f8ca600711582445119; expires=Tue, 24-Mar-20 08:05:19 GMT; path=/; domain=.ip.cn; HttpOnly; SameSite=Lax
cf-cache-status: DYNAMIC
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
alt-svc: h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
server: cloudflare
cf-ray: 5697b1ac1862eb41-LAX

{"ip": "111.199.187.36", "country": "北京市", "city": "联通"}

CMD

指定容器在启动后要进行的操作。CMD和RUN一样,也同样支持 shell 和 exec 格式。

格式:

CMD <shell命令>
#shell格式

CMD [“可执行文件”,“参数1”,“参数2”]
#exec格式

CMD [“参数1”,“参数2”,“参数3”…]

#参数列表格式

后面两种其实都是可执行文件加上参数的形式

示例:

CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]

RUN

格式:

RUN <command> #shell命令格式

RUN [“executable”, “param1”, “param2”]

示例:

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN ["/bin/bash", "-c", "echo hello world"]

注意:RUN与CMD的区别

RUN是构建容器时就运行的命令以及提交运行结果;
CMD是容器启动时执行的命令,在构建时并不运行, 构建时仅仅指定了这个命令到底是个什么样子

EXPOSE

指定向容器外开放的端口。

格式:

EXPOSE <port> [<port>…]

示例:

EXPOSE 9090 # 开放9090端口

VOLUME

使用指令使容器中的一个目录具有持久化存储的功能,相当于运行容器时的 -v,该目录可被容器本身使用,也可以共享给其它容器。

格式:

VOLUME 文件路径

示例:

VOLUME /tmp

5. Linux中配置远程访问docker

5.1 打开Linux配置文件

vim /lib/systemd/system/docker.service

image-20231010103124076

于第13行后添加以下代码:

# 表示可以从任意ip地址到Linux的2375端口进行连接其中的docker
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

image-20231010103246048

5.2 重启docker服务

[root@localhost df]# systemctl daemon-reload  #重启docker中的守护线程
[root@localhost df]# systemctl restart docker.service

5.3 开放2375端口

[root@localhost df]# firewall-cmd --add-port=2375/tcp --permanent 
success
[root@localhost df]# firewall-cmd --reload
success
[root@localhost df]# firewall-cmd --list-ports 
3306/tcp 2375/tcp

5.4 测试2375端口是否有效

[root@localhost df]# netstat -nplt|grep 2375
tcp6       0      0 :::2375                 :::*                    LISTEN      110686/dockerd      
[root@localhost df]# 

5.5 curl指令 测试服务是否启动

curl http:// Linux的ip地址:2375/info

image-20231010103921202

6. idea安装配置docker插件

6.1 安装插件

image-20231010202954733

image-20231010104702112`

6.2 docker插件连接Linux

image-20231010104849791

image-20231010105023159

7. 【补充】Linux系统安装JDK

建立文件夹

mkdir -p /usr/local/software/jdk

上传jdk文件到Linux虚拟机

image-20231010140654436

解压tar压缩包

tar -zxvf   jdk-8u341-linux-x64.tar.gz

配置环境变量

JAVA_HOME、PATH,、CLASS_PATH

1. 编辑/etc/profile文件

vim /etc/profile

# 添加环境变量设置
JAVA_HOME=/usr/local/software/jdk/jdk1.8.0_341
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
# 展示三个变量设置
export JAVA_HOME CLASSPATH PATH
2. 持久化配置
source /etc/profile
3. 测试jdk
java -version

image-20231010141730786

4. 上传项目jar
5. 开启项目tomcat指定的端口
[root@localhost jdk1.8.0_341]# firewall-cmd --add-port=9090/tcp --permanent 
success
[root@localhost jdk1.8.0_341]# firewall-cmd --reload 
6. 运行
 java -jar hello-docker-1.0-SNAPSHOT.jar

window与linux环境变量配置区别

序列符号WindowsLinux
1分隔符;:
2文件夹分割\/
3取值符号%变量%$变量

8. springboot项目整合Dockerfile

8.1 在项目下创建Dockerfile

# java环境镜像
FROM anapsix/alpine-java
MAINTAINER Krio
# EXPOSE 指定容器开放的端口
EXPOSE 9090
# 在容器中添加项目jar包并重定向到/app.jar
ADD target/springboot-docker-1.0-SNAPSHOT.jar /app.jar
# Dockerfile启动指令
ENTRYPOINT ["java","-jar","/app.jar"]

8.2 创建容器

image-20231010151706524

新版idea可能是左键点击

image-20231010151853938

image-20231010214631924

image-20231010214648262

以上设置过程就是使用idea中的docker插件模拟Linux中的shell命令执行过程(docker build、docker run)进行dokerfile文件构建镜像和容器。

8.3 验证

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile是一种用于定义Docker镜像的文本文件,它包含了一系列的指令和配置,用于指导Docker在构建镜像时的操作步骤和配置参数。Dockerfile通常包括FROM、RUN、COPY、CMD等指令来定义基础镜像、执行命令、复制文件和设置容器启动时的默认命令等。 Dockerfile中的指令可以按照一定的顺序进行排列,从而实现构建镜像的自动化过程。通过使用Dockerfile,我们可以定义和管理自己的镜像,实现镜像的重复部署和快速扩展。同时,Dockerfile也提供了一种简洁的方式来描述和共享Docker镜像的构建过程。 在使用Dockerfile时,我们可以通过docker build命令来构建镜像。首先,我们需要在Dockerfile所在的目录下执行docker build命令,并指定-Dockerfile参数来指定使用的Dockerfile文件。然后,Docker会根据Dockerfile中的指令和配置来构建镜像。 在构建镜像时,往往需要执行一系列的命令来完成一些特定的操作,比如安装软件、配置环境变量等。我们可以使用RUN指令来执行这些命令。而CMD指令则用于在容器启动时执行默认的命令。 总之,Dockerfile是一种用于定义Docker镜像的文本文件,通过其中的指令和配置来实现镜像的构建和配置。它提供了一种简洁和可重复的方式来管理和共享Docker镜像的构建过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Docker以及dockerfile](https://blog.csdn.net/qq_44942083/article/details/120946861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [07-DockerFile](https://blog.csdn.net/xixihaha_coder/article/details/121888008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值