赞
踩
Dockerfile是用于构建Docker镜像的脚本文件,由一系列指令构成。通过docker build命令构建镜像时,Dockerfile中的指令会由上到下依次执行,每条指令都将会构建出一层镜像。这就是镜像的分层。因此,指令越多,层次就越多,效率就越低。所以在定义Dockerfile时,能在一个指令完成的动作就不要分为两个。该文件的默认名称就是“Dockerfile”。
docker build命令用于根据给定的Dockerfile和上下文以构建Docker镜像。
docker build [OPTIONS] <PATH/URL/->
例一:
在当前目录下创建镜像,Dockerfile也在当前目录下,并指定镜像的镜像名:tag
docker build -t centos:7.0 .
例二:
在当前目录下创建镜像,Dockerfile也在当前目录下,但是文件名为Dockerfile2,并指定镜像的镜像名:tag
docker build -f Dockerfile2 -t centos:8.0 .
FROM image
FROM image:tag
举例:
FROM scratch
MAINTAIBER 维护者信息
举例:
MAINTAIBER hsy
MAINTAIBER hhssyy@163.com
MAINTAIBER hsy hhssyy@163.com
LABEL <key>=<value> <key>=<value>...
举例:
LABEL name="hsy" version="1.0"
ENV <key>=<value> <key>=<value>...
举例:
ENV redis_version=7.0.5
WORKDIR path
就像我们从docker hub上下载的镜像生成的容器中,进入依赖centos镜像运行的容器发现工作目录是根目录 / ,进入redis容器工作目录是 /data:
说明:
1.设置后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
2.在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
语法一:
RUN command
举例:
RUN yum install vim
语法二:
RUN ["executable", "param1", "param2",..]
举例:
RUN ["/opt/file", "p1"]
语法一:
CMD ["executable","param1","param2", ...]
举例:
CMD ["/opt/hello","p1"]
说明:hello为可执行文件,p1为hello执行所需要的参数
语法二:
CMD command param1 param2, ...
举例:
CMD echo "docker docker docker!"
CMD /bin/bash
语法三:
CMD ["param1","param2", ...]
说明:
此命令用于提供给ENTERYPOINT,如果设置了ENTERYPOINT则把参数赋给ENTERYPOINT
说明:
1.通过语法一、语法二构建出的镜像会被docker run命令中的command覆盖。
2.通过语法一、语法二构建出的镜像都不支持docker run时给定的参数。
3.CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
小栗子:
1.创建一个输出本月日历镜像
2.docker run加上一个date命令,如下图发现docker run命令中的command会覆盖语法二CMD命令的(语法一CMD同样如此)
3.docker run加上一个-y参数,如下图发现它并未像我们预想的那样输出全年的日历,说明语法二CMD接收不到docker run时给定的参数(语法一CMD同样)
语法一:
ENTRYPOINT ["executable","param1","param2", ...]
语法二:
ENTRYPOINT command param1 param2, ...
说明:
1.ENTRYPOINT指定的要执行的可执行文件不会被docker run命令中的command覆盖,这是和CMD命令的不同点。
2.Dockerfile中只允许有一个ENTRYPOINT命令,有多个时会只执行最后的ENTRYPOINT命令。
小栗子:
1.创建一个输出hello docker的镜像
2.docker run后输出hello docker,说明语法三CMD中的参数赋给了ENTRYPOINT
3.docker run加一个参数ccc,得到输出ccc,说明docker run的command覆盖了CMD的
EXPOSE port
举例:
EXPOSE 80
说明:指定容器准备对外暴露的端口号,但在这里配置并不能起作用。若要起作用,则需要在执行docker run命令时使用-p来发布此端口号。不过,如果使用-P,由Docker自动分配一个端口号与指定的容器连接,此时会优先使用这里指定的端口号。
ARG <name>[=<default value>]
举例:
ARG name
ARG name=TOM
说明:该变量的值在执行docker build时通过-build-art覆盖。比如docker build -t 镜像名:tag name=Jerry . 。
ADD 宿主机文件路径 容器指定目录
ADD ["宿主机文件路径","容器指定目录"] //路径中存在空格时适用
举例:
ADD /opt/hello / //添加宿主机文件hello到容器根目录下
ADD ["/test/aaa.txt","/"] //添加宿主机文件aaa到容器根目录下
ONBUILD [operate]
举例:
ONBUILD RUN yum install vim
说明:该指令只对当前镜像的子镜像进行构建时有效。例如当前镜像为centosA,在其Dockerfile中添加此命令:ONBUILD RUN yum install vim,该命令不会在A镜像构建时执行,此时若有一个镜像centosB是基于centosA镜像构建的,那么此命令会在B镜像构建的时候被执行。
VOLUME ["dir1","dir2",..]
举例:
VOLUME ["/opt"]
VOLUME ["/var/aaa","/etc/bbb"]
说明:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1.卷可以在容器间共享和重用;
2.容器并不一定要和其他容器共享卷;
3.修改卷后会立即生效;
4.对卷的修改不会对镜像产生影响;
5.卷会一直存在,直到没有任何容器使用它。
一、准备一个简单的springboot项目并打包成jar包
二、在宿主机上创建一个目录,并把springboot项目的jar包传输进去
三、编写Dockerfile文件
四、docker build镜像
五、docker run
六、访问docker宿主机运行的项目
访问成功!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。