Docker 学习笔记-08:Dockerfile

DockerFile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
在这里插入图片描述

TIPS:https://docs.docker.com/engine/reference/builder/

DockerFile 构建

内容基础

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交

构建流程

  • 编写Dockerfile文件
  • docker build命令构建镜像
  • docker run 根据镜像运行容器实例
    在这里插入图片描述

常用保留字指令

常用指令说明举例
FROM基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板FROM :
MAINTAINER镜像维护者的姓名和邮箱地址MAINTAINER xxxxxx@xxx.com
WORKDIR指定在创建容器后,默认目录
USER指定该镜像以什么样的用户去执行,默认root
ENV为镜像创建出来的容器声明环境变量,还可以被dockerfile后面的指令使用ENV <key> <value>
ENV <key=value>
COPY复制文件或目录添加到新镜像中
可以有多个,但必须是上下文根目录的相对路径,可以使用通配符
可以是文件或目录(/结尾),但必须是目标镜像中的绝对路径或者相对于WORKDIR的相对路径
COPY <src> <dest>
ADDCOPY一致
可以指向网络地址URL
可以指向本地压缩归档文件,复制到容器中会被自动解压提取
ADD <src> <dest>
VOLUME容器数据卷,用于数据保存和持久化工作
EXPOSE容器对外暴露出的端口EXPOSE 8080
RUN【构建时】在前一条命令创建的镜像基础上创建一个容器,并在容器中运行命令,命令结束后commit容器为新镜像,该镜像被Dockerfile中的下一条指令使用RUN <command> (shell格式)
RUN [“executable”,“param1”,“param2”] (exec格式,推荐)
CMD【运行时】提供容器运行时的默认值,默认值可以是一条指令,可以是一些参数
一个Dockerfile中可以有多条CMD指令,但只有最后一条有效,会被 docker run 之后的参数命令覆盖
CMD <command> (shell格式)
CMD [“executable”,“param1”,“param2”] (exec格式,推荐)
CMD [“param1”,“param2”] (为ENTRYPOINT指令提供参数)
ENTRYPOINT【运行时】和CMD一致,提供容器运行时的默认值
一个Dockerfile中可以有多条ENTRYPOINT指令,但只有最后一条有效,不会被 docker run 之后的参数命令覆盖
ENTRYPOINT <command> (shell格式)
ENTRYPOINT [“executable”,“param1”,“param2”] (exec格式,推荐)

测试

准备一个SpringBoot的简易程序jar包,进行Dockerfile构建镜像及运行容器测试
制作镜像:docker build -t <image>:<tag> dir
详细说明可参照下方链接官方文档:https://docs.docker.com/engine/reference/commandline/build/#options

FROM openjdk:11
MAINTAINER abc <abc@126.com>
WORKDIR /data/server
RUN mkdir -p /data/server
ADD ./jar/demo-0.0.1-SNAPSHOT.jar /data/server/demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+08", "/data/server/demo.jar"]
[root@localhost jiangyanfei]# ls -ll
总用量 4
-rw-r--r--. 1 root root 259 6月   1 11:35 Dockerfile
drwxr-xr-x. 2 root root  37 6月   1 11:47 jar
#################### 制作镜像 ############################
[root@localhost jiangyanfei]# docker build -t demo:1.0 .
Sending build context to Docker daemon  17.61MB
Step 1/7 : FROM openjdk:11
 ---> 5505a9a39df1
Step 2/7 : MAINTAINER jiangyf5 <jiangyf5@lenovo.com>
 ---> Running in 7acb7186e9cf
Removing intermediate container 7acb7186e9cf
 ---> 8e5c4e538ffa
Step 3/7 : WORKDIR /data/server
 ---> Running in 741dedb2a302
Removing intermediate container 741dedb2a302
 ---> 9febb9cdffcf
Step 4/7 : RUN mkdir -p /data/server
 ---> Running in ae72ec8168e0
Removing intermediate container ae72ec8168e0
 ---> b987ca3b943c
Step 5/7 : ADD ./jar/demo-0.0.1-SNAPSHOT.jar /data/server/demo.jar
 ---> 9327045e7723
Step 6/7 : EXPOSE 8080
 ---> Running in bd1fae590795
Removing intermediate container bd1fae590795
 ---> f0689a6cb772
Step 7/7 : ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+08", "/data/server/demo.jar"]
 ---> Running in e2d5e3bb083c
Removing intermediate container e2d5e3bb083c
 ---> 740191a10d8b
Successfully built 740191a10d8b
Successfully tagged demo:1.0
#################### 查看制作镜像 ############################
[root@localhost jiangyanfei]# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED         SIZE
demo                            1.5       ebd1f3d97dd4   6 seconds ago    677MB
demo                            1.0       740191a10d8b   4 seconds ago   677MB
#################### 启动容器 ############################
[root@localhost jiangyanfei]# docker run -it -d -p 7777:8080 ebd1f3d97dd4
1df16198d19e8a36c465aa6b632a35c8fc87906cb11eeca9b4cf81a99e8de100
[root@localhost jiangyanfei]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                      NAMES
1df16198d19e   ebd1f3d97dd4   "java -jar -Duser.ti…"   2 seconds ago   Up 1 second    0.0.0.0:7777->8080/tcp, :::7777->8080/tcp                                  agitated_franklin
#################### 访问容器 ############################
[root@localhost jiangyanfei]# curl 192.168.2.99:7777/test
{"name":"liming","age":18}
[root@localhost jiangyanfei]# docker exec -it 1df16198d19e bash
root@1df16198d19e:/data/server# ls
demo.jar

虚悬镜像

在构建和运行过程中,仓库名、标签名均为none的镜像,此类镜像称为虚悬镜像
一般来说,虚悬镜像失去了存在和使用价值,因此可以直接删除处理

[root@localhost jiangyanfei]# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED         SIZE
<none>                          <none>    f0689a6cb772   4 hours ago     677MB
<none>                          <none>    9327045e7723   4 hours ago     677MB
<none>                          <none>    9febb9cdffcf   4 hours ago     659MB

常用操作

  • 查看虚悬镜像:docker images ls -f dangling=true
  • 删除虚悬镜像:docker image prune
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小透明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值