跳转至

使用 Dockerfile 创建镜像


2016-03-15 by dongnan

开始之前

使用一个 Java项目的示例,介绍下如何使用 Dockerfile 创建一个自定义Java镜像,以及在 Dockerfile 中常用的一些指令。

环境描述

容器镜像: openjdk:8-jre
容器系统: debian 8 (jessie)
Docker主机: Ubuntu Server 16.04
CI工具: Jenkins & Maven
项目程序: 编译好的 bms.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

Dockerfile 常用指令

Dockerfile 中每一个指令都会建立一层,上面的示例创建了9层镜像。

  • FROM 指令用于指定基础镜像,一个有效的 Dockerfile 必须使用 FROM做第一个指令。
  • MAINTAINER 指令用于设置作者信息。
  • RUN 指令是用来执行命令的,并将结果提交到当前镜像层。
  • ENV 指令设置环境变量,无论是后面的其它指令,还是运行时的容器,都可以直接使用这个环境变量。
  • COPY 指令将从构建上下文目录中 <源> 文件/目录复制到新的一层的镜像内的 <目标> 位置。
  • ADD 指令和 COPY 指令功能基本一致。但是在 COPY 基础上增加了一些功能,例如 ADD会做自动解压工作。
  • WORKDIR 指令用来指定工作目录(当前目录),如该目录不存在则会帮你建立目录。
  • EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明就会开启这个端口。
  • CMD 指令用于指定默认容器主进程的启动命令(容器就是进程,在启动容器的时候需要指定所运行的程序及参数)。

帮助

docker build --help

Usage:    docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string          Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                Do not use cache when building the image
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful build (default true)
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

参考

内容参考自 Docker — 从入门到实践

强烈推荐作为 Docker入门技术书籍。

回到页面顶部