0%

Dockerfile入门篇

什么是Dockerfile?

正如《Docker入门篇》一文中所说,容器技术包括容器镜像和容器运行时。其中容器镜像是一个软件集装箱,包含软件运行需要的所有文件。
那么,怎样制作一个容器镜像呢?两个方法:第一个方法是修改容器运行时,然后提交修改变成新容器镜像。第二个方法就是使用Dockerfile。

Dockerfile是一个文本文档,其中包含一些指令(类似于shell命令)。Docker可以通过阅读Dockerfile中的指令,来自动构建镜像。

更多内容,参考Dockerfile reference菜鸟Docker DockerfileDockerfile 使用介绍

本文,我们就来学习一下Dockerfile的编写和使用。

helloworld

1、创建一个Dockerfile文件,内容为

1
2
3
4
FROM busybox:1.25

ENTRYPOINT ["echo"]
CMD ["helloworld"]

2、打包新镜像
docker build -t busybox-echo:1.25 .

3、运行新镜像
docker run busybox-echo:1.25
可以看到输出了helloworld,至此,入门仪式完成。

Dockerfile简析

Dockerfile可以分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作命令
  • 容器启动命令

其中必要的是基础镜像信息,其他都可以不要。只不过这种情况下,构建时就相当于拷贝了一个镜像。

以一个完整的例子说明Dockerfile的四个部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This dockerfile is a demo.

# 基础镜像信息
FROM ubuntu:16.04

# 维护者信息
MAINTAINER voidking voidking@qq.com

# 镜像操作命令
ENV TZ="Asia/Shanghai"
RUN apt update && apt install -y tzdata jq

# 容器启动命令
CMD ["/bin/bash","-c","echo $(date) && echo '{\"name\":\"voidking\"}' | jq ."]

FROM:定制的镜像都是基于 FROM 的镜像,这里的 ubuntu:16.04 就是需要的基础镜像。
MAINTAINER:维护者信息。
ENV:设置环境变量,设置docker容器的时区为Shanghai。
RUN:用于执行后面跟着的命令行命令。
CMD:容器启动时默认执行的命令。

此外,常用的镜像命令还有COPY和ADD。
COPY命令格式:COPY 源路径 目标路径
源路径如果是文件,COPY命令拷贝文件到目标路径下。
源路径如果是目录,COPY命令拷贝目录下所有文件到目标路径下,目标路径不存在则自动创建。

ADD指令是COPY命令的加强版(addition):拷贝压缩文件会自动解压,支持从url中拷贝文件。

PS:构建并运行镜像

1
2
docker build -t ubuntu-jq:16.04 .
docker run ubuntu-jq:16.04

从镜像还原Dockerfile

1
2
DockerImage="busybox-echo:1.25"
docker history --format {{.CreatedBy}} --no-trunc=true $DockerImage |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac