使用Dockerfile可以在基础镜像之上构建与定制新的镜像。
开发流程
- 在本地编写与调试Dockerfile
- 提交Dockerfile至dockerhub
- 在生产环境中拉取dockerhub中的镜像并运行
Dockerhub
dockerhub与github类似,是我们托管容器的场所。
Dockerfile指令
- FROM
FROM指令用来指定dockerfile构建的镜像的基础镜像。dockerfile的第一条指令必须是FROM指令。当然也可以在dockerfile中使用多个FROM来构建相对复杂的镜像。
如果不需要从任何镜像继承,那么我们可以使用FROM scratch
。就如hello-world镜像一样。
1 | FROM scratch |
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 | FROM python |
FROM python
表示该镜像从python镜像继承,因此编写的python程序可以直接在容器中运行,不需要额外的环境配置。MAINTAINER
指令中指明了维护者的信息。ENV
指令指定了环境变量。通过配置容器的环境变量,我们可以针对自己的运行环境进行个性化的配置。COPY
指令将目录中的main.py文件拷贝到镜像中/main.py去。- 通过
RUN
指令来执行命令,为/main.py
来添加可执行的权限。 - 使用
ENTRYPOINT
来运行python程序。
提交Dockerfile
首先将main.py
和Dockerfile
两个文件提交至github的仓库中。再到dockerhub中创建一个automated build
,关联之前提交代码的github仓库。如此便能够在dockerhub中通过Dockerfile来自动构建镜像了,而不是在本地构建好之后再将镜像上传至dockerhub。这样一来可以实现自动化构建,并且所有的源码都是公开的,不会让使用者担心有恶意代码的存在。