如何使用Dockerfile自定义镜像?-创新互联
开始之前
之前在隔壁专题(公众号出门左转 Nginx专题) 推送过一篇文章 Nginx 缓存服务器(番外)定制Docker镜像 我们将 ngx_cache_purge
模块添加到自定义的 Nginx镜像中,避免每次创建容器后再次安装 ngx_cache_purge
模块这个繁琐的步骤。
今天使用一个 Java项目的示例,介绍下如何使用 Dockerfile
创建一个自定义Java镜像,以及在 Dockerfile
中常用的一些指令。
环境描述
容器镜像: openjdk:8-jre
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04
CI工具: Jenkins & Maven
项目程序: 编译好的可执行jar包
操作步骤
- 准备 Dockerfile 文件
cat bms/Dockerfile
# bms
FROM openjdk:8-jre
MAINTAINER dongnan
# apt
COPY conf/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
wkhtmltopdf xvfb \
&& apt-get clean && rm -r /var/lib/apt/lists/*
# env
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8
# package
COPY src/bms.jar /root/bms.jar
# workdir
WORKDIR /root/
# statement Port
EXPOSE 8080
# cmd
CMD ["java","-jar","/root/bms.jar"]
- 构建镜像
守护进程读取Dockerfile
文件然后按照文件中的指令顺序执行。构建镜像时会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
docker build -t bms:0.0.1 .
Sending build context to Docker daemon 2.048 mb
# 省略....
Successfully built cd34135ed904
注意: docker build
命令最后有一个.
表示当前目录,而 Dockerfile
就在当前目录,是在指定上下文路径。
- 验证镜像
尝试使用这个镜像创建一个容器,如果容器正常运行说明构建成功。
docker run --name test -tid bms:0.0.1
镜像使用的是分层存储容器也是如此,每个容器运行时是以镜像为基础层,在其上创建一个当前容器的存储层。
容器运行后修改了容器内的文件,也就是改动了容器的存储层,通过 docker diff
命令看到具体的改动。
docker container diff test
C /root # C 改变
A /root/logs # A 添加
A /root/logs/bms.log
C /tmp
A /tmp/tomcat-docbase.1383372449962167136.9290
- 命令帮助
docker build --help
Dockerfile 常用指令
Dockerfile 中每一个指令都会建立一层,上面的示例创建了9
层镜像。
FROM: 用于指定基础镜像,一个有效的 Dockerfile 必须使用 FROM做第一个指令。
MAINTAINER: 用于设置作者信息。
RUN: 是用来执行命令的,并将结果提交到当前镜像层。
ENV: 设置环境变量,无论是后面的其它指令,还是运行时的容器,都可以直接使用这个环境变量。
COPY: 将从构建上下文目录中 <源> 文件/目录复制到新的一层的镜像内的 <目标> 位置。
ADD: 与 `COPY` 指令功能基本一致。但是在 COPY 基础上增加了一些功能,例如 ADD会做自动解压工作。
WORKDIR: 用来指定工作目录(**当前目录**),如该目录不存在则会帮你建立目录。
EXPOSE: 是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明就会开启这个端口。
CMD: 用于指定默认容器主进程的启动命令(容器就是进程,在启动容器的时候需要指定所运行的程序及参数)。
Dockerfile 最佳实践
部分摘选
在 Docker 官方的
Dockerfile
最佳实践文档中要求尽可能的使用COPY
,因为COPY
的语义很明确,就是复制文件而已,而ADD
最适合使用的场景就是需要自动解压缩的场景。另外需要注意的是
ADD
指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。CMD 指令用于执行目标镜像中包含的软件可以包含参数,CMD 大多数情况下都应该以
CMD ["executable", "param1", "param2"...]
的形式使用,例如CMD ["nginx", "-g", "daemon off;"]
- RUN 与 CMD 的区别,RUN 在构建镜像时执行,CMD则是在镜像构建成功后在容器中执行。
更多内容请参考2号文。
参考文章
doker&k8s Qun [703906133]
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:如何使用Dockerfile自定义镜像?-创新互联
文章链接:http://scjbc.cn/article/ehjoh.html