什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

构建镜像的方式

  1. 基于已有容器构建镜像

    主要是通过docker commit命令来构建新的镜像
    docker commit构建进行主要有三步:

    1. 运行容器
    2. 修改容器
    3. 将容器保存为新的镜像
      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 运行容器
      ># docker run -it centos
      #修改容器:在没有vim的centos安装vim
      ># vim
      ># bash: vim: command not found
      ># yum install vim -y
      #将容器保存为新的镜像
      ># docker ps -a
      ># docker commit 69f501e858a6 centos_vim
  1. Dockerfile构建文件
1
2
3
4
5
6
7
8
9
10
11
># vim Dockerfile
FROM centos:7.9.2009
RUN yum install -y vim
CMD ["/bin/bash"]
MAINTAINER aledk.com
:wq
># docker build -t mycentos:v1.0.1 .
># docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos v1.0.1 5783452ff7cf 2 minutes ago 441MB
centos 7.9.2009 eeb6ee3f44bd 11 months ago 204MB
  • FROM <image> - 指定基础镜像*
  • ENV - 设置环境变量,可在后面指令使用
  • RUN <command> - 执行Linux的shell命令,每一次RUN都会构建一层
  • WORKDIR - 为执行RUN, CMD, ENTRYPOINT, COPY, 和ADD指令设定工作目录
  • COPY <src> <dest> - 拷贝本地文件到镜像的指定目录
  • ADD - 添加文件,如果是压缩文件则会解压后复制
  • EXPOSE - 指定容器运行时监听的端口
  • CMD [“要运行的程序”,”参数1”,”参数2”] - 容器启动的命令,可以多个CMD指令,但是只有最后一个生效。CMD可以被docker run之后的参数替换,也可以作为ENTRYPOINT的参数
  • ENTRYPOINT [“要运行的程序”,”参数1”,”参数2”] - 镜像中的启动命令,容器运行时调用
  • VOLUME - 定义数据卷,如果没有定义则使用默认
  • USER - 指定后续执行的用户组和用户
  • ARG - 变量属性值,但不在容器内部起作用
  • MAINTAINER - 镜像维护者信息

Dockerfile注意事项

  1. Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以”#”号开头的注释。
  2. Dockerfile 中的每个指令都会创建一个新的镜像层;
  3. 第一行必须使用FROM指令指明所基于的镜像名称;
  4. 之后使用MAINTAINER指令说明维护该镜像的用户信息;
  5. 然后是镜像操作相关指令,如RUN指令。每运行一条指令,都会给基础镜像添加新的一层。
  6. 最后使用CMD指令指定启动容器时要运行的命令操作。

docker镜像保存

  1. 通过标准输出流保存一个或多个镜像为tar包
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    docker save [OPTIONS] IMAGE [IMAGE...]

    $ docker save busybox > busybox.tar
    $ ls -sh busybox.tar
    2.7M busybox.tar
    $ docker save --output busybox.tar busybox
    $ ls -sh busybox.tar
    2.7M busybox.tar
    $ docker save -o fedora-all.tar fedora
    $ docker save -o fedora-latest.tar fedora:latest

    --output, -o 写入到文件,代替STDOUT
  2. 使用gzip保存镜像文件
    1
    $ docker save myimage:latest | gzip > myimage_latest.tar.gz

docker镜像加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE

$ docker load < busybox.tar.gz
Loaded image: busybox:latest

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 769b9341d937 7 weeks ago 2.489 MB

$ docker load --input fedora.tar
Loaded image: fedora:rawhide
Loaded image: fedora:20

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 769b9341d937 7 weeks ago 2.489 MB
fedora rawhide 0d20aec6529d 7 weeks ago 387 MB
fedora 20 58394af37342 7 weeks ago 385.5 MB
fedora heisenbug 58394af37342 7 weeks ago 385.5 MB
fedora latest 58394af37342 7 weeks ago 385.5 MB


--input, -i 从tar文件读入
--quiet, -q 安静的读入,不输出导入的信息

参考:

Best practices for writing Dockerfiles

docker save

docker load