使用Dockerfile构建docker镜像

使用Dockerfile可以在基础镜像之上构建与定制新的镜像。

开发流程

  1. 在本地编写与调试Dockerfile
  2. 提交Dockerfile至dockerhub
  3. 在生产环境中拉取dockerhub中的镜像并运行

Dockerhub

dockerhub与github类似,是我们托管容器的场所。

Dockerfile指令

  • FROM
    FROM指令用来指定dockerfile构建的镜像的基础镜像。dockerfile的第一条指令必须是FROM指令。当然也可以在dockerfile中使用多个FROM来构建相对复杂的镜像。
    如果不需要从任何镜像继承,那么我们可以使用FROM scratch。就如hello-world镜像一样。
1
2
3
FROM scratch
COPY hello /
CMD ["/hello"]
  • MAINTAINER
    指定维护者信息。

  • RUN
    执行shell命令。

  • EXPOSE
    暴露容器中的端口。

  • CMD
    用来指定容器启动后默认执行的命令。如果docker run在启动时指定了其它命令,那么CMD命令会被忽略。一个dockerfile只能有一个CMD指令,如果有多条则只会执行最后一个。

  • ENTRYPOINT
    用来设置容器启动时运行的命令,使容器以应用程序或服务的形式运行。通常会编写一个shell脚本作为entrypoint。

  • VOLUME
    用来指定一个本地或其它容器的挂载点。使容器中的数据在容器被删除之后得以保留。

  • ENV
    设置容器运行时的环境变量。

  • ADD
    复制指定路径或URL下的文件至容器中。ADD指令支持压缩文件解压。

  • COPY
    与ADD类似,仅提供文件及文件夹的复制,其行为更加单纯。在使用者明确自己必须使用ADD的情况之外推荐使用COPY。

Dockerfile微实战

背景

家里的宽带在每次重启光猫之后会改变公网的ip。因此我写了一个python程序来获取公网ip,在ip发生改变时以邮件的形式通知我。

编写Dockerfile

通过使用Dockerfile可以轻松在Dockerhub中构建镜像。

1
2
3
4
5
6
7
8
9
10
FROM python
MAINTAINER grezbo <grezboo@gmail.com>
ENV EMAIL_ADDR ''
ENV EMAIL_PASSWD ''
ENV TO_EMAIL_ADDR ''
ENV SMTP_SERVER ''
ENV INTERVAL ''
COPY main.py /main.py
RUN chmod +x /main.py
ENTRYPOINT ["./main.py"]
  1. FROM python表示该镜像从python镜像继承,因此编写的python程序可以直接在容器中运行,不需要额外的环境配置。
  2. MAINTAINER指令中指明了维护者的信息。
  3. ENV指令指定了环境变量。通过配置容器的环境变量,我们可以针对自己的运行环境进行个性化的配置。
  4. COPY指令将目录中的main.py文件拷贝到镜像中/main.py去。
  5. 通过RUN指令来执行命令,为/main.py来添加可执行的权限。
  6. 使用ENTRYPOINT来运行python程序。

提交Dockerfile

首先将main.pyDockerfile两个文件提交至github的仓库中。再到dockerhub中创建一个automated build,关联之前提交代码的github仓库。如此便能够在dockerhub中通过Dockerfile来自动构建镜像了,而不是在本地构建好之后再将镜像上传至dockerhub。这样一来可以实现自动化构建,并且所有的源码都是公开的,不会让使用者担心有恶意代码的存在。