• 基于Dockerfile创建docker镜像
  • Dockerfile命令介绍
  • Dockerfile优化手段
    1. Dockerfile使用总结
    2. AuthorLiNing

    Docker镜像采用的是分层存储的概念,制作镜像,实际上就是定制每一层所添加的配置、文件等。使用“docker commit”命令可以实现Docker镜像的制作,但是有很多不足,比如commit对镜像操作都是黑箱操作,除了制作镜像的人,其他人很难获知制作镜像的流程,而且每次操作都会在镜像当前层增加一层,并不能删除上一层的东西,这使得每次修改都会使镜像的体积越来越大。

    Dockerfile解决了这些问题,它要求我们把每一层构建的命令都写入脚本,从而利用这个脚本来制作镜像。

    image

    基于Dockerfile创建docker镜像

    创建空目录,在空目录下创建Dockerfile:

    1. mkdir mydockerbuild
    2. cd mydockerbuild
    3. vim Dockerfile

    Build操作,会自动读取当前路径下Dockerfile文件:

    1. docker build -t new_image .

    Dockerfile命令介绍

    FROM

    1. FROM <image>
    2. FROM <image>:<tag>
    3. FROM <image>@<digest>
    4. Dockerfile中非注释行的第一个指令
    5. FROM ubuntu:14.04

    MAINTAINER

    1. MAINTAINER LiNing <lining0806@gmail.com>

    RUN 推荐使用数组形式

    1. RUN ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数)
    2. RUN command param1 param2 (shell form 作为"/bin/sh -c"的参数)
    3. RUN apt-get update && apt-get install -y \
    4. curl \
    5. nginx \
    6. && rm -rf /var/lib/apt/lists/*
    7. RUN只是在构建镜像build的时候执行

    CMD 推荐使用数组形式

    1. CMD ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数)
    2. CMD command param1 param2 (shell form 作为"/bin/sh -c"的参数)
    3. CMD ["param1", "param2"] (as default parameters to ENTRYPOINT)
    4. CMD ["/bin/echo", "this is a echo test"]
    5. docker run -it new_image
    6. CMD会在启动容器run时执行,构建镜像build时不执行
    7. 如果用户启动容器run时指定了运行的命令,则会覆盖掉CMD指定的命令
    8. CMD只有最后一个有效

    ENTRYPOINT 推荐使用数组形式

    1. ENTRYPOINT ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数)
    2. ENTRYPOINT command param1 param2 (shell form 作为"/bin/sh -c"的参数)
    3. ENTRYPOINT ["/bin/echo"]
    4. CMD ["this is a echo test"] # 如果docker run期间如果没有参数的传递,会默认CMD指定的参数
    5. docker run -it new_image "this is a test"
    6. ENTRYPOINT会在启动容器run时执行,构建镜像build时不执行
    7. 如果用户启动容器run时指定了运行的命令,则不会覆盖掉ENTRYPOINT指定的命令,可以使用docker run --entrypoint覆盖Dockerfile中的ENTRYPOINT
    8. ENTRYPOINT只有最后一个有效

    EXPOSE

    1. EXPOSE <port> [<port>...]
    2. Docker服务端容器对外映射的本地端口,需要在启动容器run时使用-p或者-P选项生效

    LABEL

    1. LABEL <key>=<value> <key>=<value> <key>=<value> ...

    ENV

    1. ENV <key> <value> # 只能设置一个变量
    2. ENV <key>=<value> ... # 允许一次设置多个变量

    VOLUME

    1. VOLUME ["<path1>", "<path2>", ...]
    2. VOLUME <path>
    3. 将本地主机目录挂载到目标容器中,将其他容器挂载的挂载点挂载到目标容器中

    ADD

    1. ADD <src>... <dest>,源可以是URL
    2. ADD local_tar_file /temp 复制当前目录下文件到容器/temp目录,如果是压缩文件则自动解压缩复制

    COPY

    1. COPY <src>... <dest>,源不可以是URL
    2. COPY local_files /temp 复制当前目录下文件到容器/temp目录

    USER

    1. USER <user>
    2. 指定运行容器时的用户名或UID,后续的RUNCMDENTRYPOINT也会使用指定用户

    WORKDIR

    1. WORKDIR <path>
    2. 进入容器的默认路径,相当于cd,后续的RUNCMDENTRYPOINT也会使用指定路径

    ONBUILD

    1. ONBUILD [instruction]
    2. 使用该dockerfile生成的镜像A,并不执行ONBUILD中命令,如再来个dockerfile基础镜像为镜像A时,生成的镜像B时就会执行ONBUILD中的命令

    Dockerfile优化手段

    • 容器能快速迭代
    • 使用.dockerignore文件
    • 不要安装不必要的程序包
    • 单一容器只运行单一进程
    • 最小化镜像层数
    • 对多行参数进行排序
    • 构建镜像使用缓存