欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker Dockerfile创建镜像

程序员文章站 2022-03-12 12:42:00
...

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指令的网络模式