dockerfile构建docker镜像详细说明,主要是springboot的jar包构建镜像样例
1.镜像构建命令:docker build
图解
<font color=#999AAA >启动命令:<font color=red>(注意最后面有一个点,不要忘记)
docker build -t 自定义镜像名:tag .
<font color=#999AAA >执行docker build时,docker server会先把上下文的所有文件都装着起来,然后根据dockerfile文件内容来一条条执行指令来构建镜像
<font color=red>警告:
不要用你的根目录下当上下文目录,
/
作为PATH
因为它会导致生成到您的硬盘驱动器的全部内容传输到docker 守护进程。导致服务器宕机
2.初次体验:我的第一个简单样例dockerfile构建docker镜像
1)拉取一个centos镜像
docker pull centos:7
2)创建文件
touch test.txt
3)编写dockerfile文件,内容如下
FROM centos:7
COPY test.txt /
4)构建镜像
docker build -t mycentos1 .
<font color=#999AAA >运行结果:(Successfully)
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos:7
---> b5b4d78bc90c
Step 2/2 : COPY test.txt /
---> 0336262a3ff6
Successfully built 0336262a3ff6
Successfully tagged mycentos1:latest
5)查看构建好的镜像:docker images
6)运行镜像:docker run -it mycentos1
<font color=#999AAA >镜像的已经存在test.txt,证明COPY test.txt /
已经复制到镜像里了
7)完成第一个构建镜像
3.dockerfile文件的指令关键字说明(就是命令)
<font color=#999AAA >指令说明都是来自官网
指令 | 参数形式 | 描述 |
---|---|---|
FROM | FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] |
FROM 指令初始化一个新的构建阶段,并为后续指令设置 基本映像。<font style="color: #f70404">(重点)因此,有效的 Dockerfile 必须从FROM 指令开始。</font>(推荐)最好从公共存储库中拉出图像开始构建。 |
MAINTINER | MAINTAINER <name> |
MAINTAINER 指令设置生成图像的作者字段<font style="color: #f70404">(官网已经不建议使用,改成:LABEL)</font> |
LABEL | LABEL <key>=<value> <key>=<value> <key>=<value> ... |
标签:LABEL 指令将元数据添加到图像。ALABEL 是键值对。要在LABEL 值中包含空格,请像在命令行分析中一样使用引号和反斜杠。 |
RUN | (1)RUN <command> (shell形式,命令在shell中运行,默认情况下/bin/sh -c 在Linux或cmd /S /C Windows上运行)(2) RUN ["executable", "param1", "param2"] (执行表格) |
执行shell命令、Linux命令、安装命令等 |
COPY |
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
|
copy和add功能很像,都有把上下文目录资源复制到镜像的功能 copy是对上下文的资源直接复制 add还可以是url,对tar还会自动解压 |
ADD |
ADD [--chown=<user>:< group >] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
|
|
ENV | ENV <key>=<value> ... |
ENV 指令将环境变量<key> 设置为value <value> 。此值将在构建阶段的所有后续指令所在的环境中使用,并且在许多情况下也可以内联替换例如:docker run --env key=value就会替换dockerFile原来定义的环境变量,达到动态设置的功能 |
EXPOSE |
EXPOSE <port> [<port>/<protocol>...] 例如:EXPOSE 80/udp |
EXPOSE 指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。就是把容器的端口爆露出来,不然容器将不给访问, -p 标记ondocker run 发布和映射一个或多个端口,或者使用-P 标记发布所有公开的端口并将它们映射到高阶端口。 |
VOLUME | VOLUME ["/data"] |
挂载卷:VOLUME 指令创建具有指定名称的安装点,并将其标记为保存来自本机主机或其他容器的外部安装的卷。就是把容器的目录能挂载到本地主机上,达到数据保护的作用 例如:docker run -v 本地目录:容器目录,就是把容器目录挂载到本地主机了,然后就可以相互通数据,双向绑定,那边修改都会同步更新,前提就是要dockerfile构建的要先定义好,不然不会生效 |
WORKDIR | WORKDIR /path/to/workdir |
是对容器进行交互模式时,第一次进来容器的目录落脚点,还有对copy,add也有作用,细看官网说明 |
ENTRYPOINT | (1)ENTRYPOINT ["executable", "param1", "param2"] (2) ENTRYPOINT command param1 param2
|
入口点:ENTRYPOINT 允许您配置将作为可执行文件运行的容器。一般可以和CMD集合使用 |
CMD | (1) CMD ["executable","param1","param2"] (exec形式,这是首选形式)(2) CMD ["param1","param2"] (作为ENTRYPOINT的默认参数) (3) CMD command param1 param2 (外壳形式) |
CMD 指令中只能有一条指令Dockerfile 。如果您列出多个,CMD 则只有最后一个CMD 才会生效。如果用户指定的参数, docker run 则它们将覆盖中指定的默认参数CMD 。 |
4.构建springboot的jar镜像
1)前提条件
<font color=#999AAA >已经有一个可以运行的springboot的jar包
2)编写dockerfile
# 基于jdk8环境
FROM openjdk:8
# 镜像描述
LABEL version="1.0" \
author="binggoling" \
memo="我的构建第一个springboot的jar,dockerfile文件"
#拷贝jar包到镜像里
COPY springbootdemo-0.0.1-SNAPSHOT.jar app.jar
#创建文件
RUN bash -c "touch /app.jar"
#设置环境变量
ENV xms=128m
ENV xmx=512m
# 挂载目录。这个是我的日志生产的目录
VOLUME /testlog
# 工作目录
WORKDIR /
#暴露端口
EXPOSE 8080
#容器启动时的运行命令
CMD java -Xms$xms -Xmx$xmx -jar /app.jar --server.port=8080
3)构建镜像
docker build -t myjar .
<font color=#999AAA >构建结果:
Sending build context to Docker daemon 48.31MB
Step 1/10 : FROM openjdk:8
---> 3d06e674f731
Step 2/10 : LABEL version="1.0" author="binggoling" memo="我的构建第一个springboot的jar,dockerfile文件"
---> Using cache
---> f080ad273539
Step 3/10 : COPY springbootdemo-0.0.1-SNAPSHOT.jar app.jar
---> Using cache
---> f2e7909f5ac4
Step 4/10 : RUN bash -c "touch /app.jar"
---> Using cache
---> 6233753d2e9c
Step 5/10 : ENV xms=128m
---> Using cache
---> f0c98951d24e
Step 6/10 : ENV xmx=512m
---> Using cache
---> 00f882ae0119
Step 7/10 : VOLUME /testlog
---> Using cache
---> 895097ffbabb
Step 8/10 : WORKDIR /
---> Using cache
---> 928fad7a73a7
Step 9/10 : EXPOSE 8080
---> Using cache
---> 2f608ba6e225
Step 10/10 : CMD java -Xms$xms -Xmx$xmx -jar /app.jar --server.port=8080
---> Using cache
---> 09e6c2b3a96e
Successfully built 09e6c2b3a96e
Successfully tagged myjar:latest
<font color=#999AAA >查看镜像:docker images
4)启动容器
docker run --name myjar -v /usr/local/docker/make/log:/testlog -p 8085:8080 -d myjar