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
于第13行后添加以下代码:
# 表示可以从任意ip地址到Linux的2375端口进行连接其中的docker
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
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
6. idea安装配置docker插件
6.1 安装插件
`
6.2 docker插件连接Linux
7. 【补充】Linux系统安装JDK
建立文件夹
mkdir -p /usr/local/software/jdk
上传jdk文件到Linux虚拟机
解压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
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环境变量配置区别
序列 | 符号 | Windows | Linux |
---|---|---|---|
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 创建容器
新版idea可能是左键点击
以上设置过程就是使用idea中的docker插件模拟Linux中的shell命令执行过程(docker build、docker run)进行dokerfile文件构建镜像和容器。