Docker 入门教程(3)——Dockerfile

Dockerfile

Dockerfile是一个文本文件,用来定制镜像。

镜像是分层存储的,前一层会是下一层的基础。而镜像的定制就是定制每一层镜像在上一层做了什么改变。

Dockerfile其内包含一条条指令,每条指令构建一层,定义对上一层做了什么改变。

以定制spring cloud的eureka注册中心为例:

工程结构为idea默认生成的eureka工程,使用maven package 生成jar包:

1644340-20190715112650105-84208893.png

Dockerfile如下:

#以java8为父镜像
FROM java:8

#将maven打包的jar包复制到/register.jar
ADD ./target/register-0.0.1-SNAPSHOT.jar /register.jar

#暴露容器的8761端口
EXPOSE 8761

#执行java -jar /register.jar命令
CMD ["java", "-jar", "/register.jar"]

在当前目录执行docker build -t register .

1644340-20190715120057765-919500811.png

可以看到每一条指令都生成了一个镜像,我们可以使用docker images -a查看所有的镜像。

但我们再次执行docker build -t register .时会发现每一条指令都显示Using cache,这就是镜像分层存储的意义——构建缓存。

1644340-20190715142803399-1543672674.png

常用指令

  1. FROM 指定基础镜像
  2. RUN 执行命令
    1. RUN ,如:RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    2. RUN ["可执行文件", "参数1", "参数2"]
  3. COPY 复制文件
    1. COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
    2. 源路径可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则
  4. ADD 更高级的复制文件
    1. ADDCOPY基本一致,区别在ADD源路径可以是url,且如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
    2. 在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。
  5. CMD 容器启动命令
  6. ENTRYPOINT 入口点
    1. ENTRYPOINTCMD的目的一样,都是指定容器启动程序与参数。
    2. 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
  7. ENV 设置环境变量
  8. ARG 构建参数
  9. VOLUME 定义匿名卷
  10. EXPOSE 暴露端口

详细介绍,可以查看Docker——从入门到实践

镜像构建上下文

上面我们构建镜像时使用docker build -t register ..就是在指定构建的上下文,其作用在于执行docker build 命令时会将该目录下的内容打包交给 Docker 引擎,以便后续的ADD/COPY找到需要复制的文件。

下图红线标记可以看出发送了43mb的文件给Docker引擎。

1644340-20190715150312128-1106324383.png

ps:只会打包构建上下文下的文件和文件夹,不会打包父目录,所以使用ADD ../register.jar会报找不到文件。

参考资料

Docker——从入门到实践

Docker,一个傲娇的男人

转载于:https://www.cnblogs.com/wuweishuo/p/11189002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值