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命令。
- CMD [“命令”,“参数1”,“参数2”,…]
-
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指令的网络模式