天天看点

docker Dockerfile创建镜像

Dockerfile官方介绍

Dockerfile官方demo镜像使用和文档

一 Dockerfile 结构

  • 继承的基础镜像

    命令:FROM

  • 维护者信息

    命令:MAINTAINER

  • 镜像操作指令

    命令:RUN、COPY、ENV、ADD、WORKDIR、ONBUILD、USER、VOLUME、EXPOSE

  • 容器启动指令

    命令:CMD、ENTRYPOINT

下面是一个简单的Dockerfile文档

#注释符号#

#继承openjdk:7镜像,注:FROM命令必须放在最前面
FROM openjdk:7

#将当期目录内容复制到容器/usr/src/myapp
COPY . /usr/src/myapp

#设置容器工作目录/usr/src/myapp
WORKDIR /usr/src/myapp

#工作目录下执行命令javac Main.java 编译java文件(这个目录下要有文件Main.java哦!)
RUN javac Main.java

#容器启动后执行命令 java Main
CMD ["java", "Main"]
           

二 Dockerfile 命令

Dockerfile各个命令解释

  • FROM

    格式:FROM image[:tag] 指定要创建的镜像的基础镜像

    第一条指令必须是FROM,Dockerfile可以创建多个镜像,所以可以有多个FROM,每个镜像的第一条指令保证是FROM

  • MAINTAINER

    格式:MAINTAINER author_name

    指定维护者信息,也就是作者

  • RUN

    格式:RUN command 或 RUN [“executable” , “param1” ,“param2” , …]

    如:

    RUN javac Main.java 或RUN [“javac” , “Main.java”]

    长命令可以用 \ 换行

  • COPY

    格式:COPY src dest

    将本机src文件或目录复制到容器中的位置dest,自动创建不存在的路径

    注意:

    src 既可以是文件也可以是目录

    dest必须是绝对路径

    COPY 是纯粹的复制不做其他操作,如解压,下载。这也是和ADD命令的区别

  • ENV

    格式:ENV key value

    创建一个容器中的环境变量,整个容器运行中都能使用。

    可以有多个ENV指令创建多个容器环境变量

    $key 获取环境变量key的值

  • ADD

    格式:ADD src dest

    ADD 和 COPY一样能够复制本机文件或目录到容器中,除了和COPY一样的功能外,还多了一些功能:src 可以是一个URL,如果src是一个压缩文件tar会自动解压

    ADD 可以认为是更高级的COPY

    注:尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。

    另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

    因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD

  • WORKDIR

    格式:WORKDIR path

    设定容器中的工作目录path,可以多次设置容器工作目录,第一次设置需要是绝对路径,后面设置可用是相对路径,相对于上一次设置的工作路径。

    后面的命令 RUN 、CMD 、ENTRYPOINT都是在工作目录中执行的

  • ONBUILD

    格式:ONBUILD 指令

    当ONBUILD 所在镜像被其他镜像当做基础镜像时所执行的命令。只有在被继承时才生效。

    注:建议docker build创建镜像时标签中加上onbuild 字符串 提醒这个镜像里面有onbuild操作

  • USER

    格式:USER 用户

    指定容器执行用户

  • VOLUME

    格式:VOLUME 本机目录 容器目录

    创建容器的数据卷,类似linux的挂载,将 本地目录 挂载到 容器目录,往指定的容器目录中写的内容实际写入到指定的本地目录中。

    数据库数据 一般不存在容器中

  • EXPOSE

    格式:EXPOSE port [port2,port3,…]

    暴露容器端口,在启动容器时需要用-P指定本地端口映射到容器暴露出的端口上,如果没有指定本地端口,会随机分配本地端口。

#EXPOSE 可以有多个,如下:
	EXPOSE 8081 8082
	EXPOSE 8083
	...
           
  • CMD

    3种格式:

    • CMD [“命令”,“参数1”,“参数2”,…]

      使用exec 执行命令

    • CMD 命令 参数1 参数2 …

      在shell中执行命令

    • CMD 参数1 参数2 …

      作为ENTRYPOINT的参数,因为当同时存在CMD和ENTRYPOINT时,CMD会作为ENTRYPOINT的参数

    CMD可以有多个,但是只有最后一个会生效。启动容器指定的容器运行命令会覆盖Dockerfile里面CMD命令。
  • ENTRYPOINT

    2种格式:

    • ENTRYPOINT [“命令”,“参数1”,“参数2”,…]

      使用exec 执行命令

    • ENTRYPOINT 命令 参数1 参数2 …

      在shell中执行命令

      ENTRYPOINT 和 CMD功能一样都是容器动执行的命令,当ENTRYPOINT 和 CMD 都存在时,CMD 会 作为 ENTRYPOINT 的参数。启动容器指定的CMD参数覆盖Dockerfile中的CMD,同样的,如果有ENTRYPOINT ,会被作为ENTRYPOINT 的参数。

      多个ENTRYPOINT 只有最后一个生效。

三 使用Dockerfile创建镜像

命令:

docker build [OPTIONS] 上下文路径

docker build [OPTIONS] URL

例:

docker build -t testimage .

参数-t指定了镜像名为testimage

注意最后有一个点 ‘.’ 指当前目录作为上下文 由于没有使用-f参数指定Dockerfile,所以使用上下文路径下名为Dockerfile的文件认为是构建镜像的Dockerfile。

执行docker build后,会首先将上下文目录的所有文件打包,然后传给Docker daemon,这样 Docker daemon收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

docker build 的 OPTIONS 参数说明:

--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式