一、背景
如果仅限于使用dockerhub里面的镜像,是没办法满足我们实际的应用场景的,所以我们需要创建属于自己的docker镜像。
构建docker镜像需要编写dockerfile,却不知道语法怎么写。
下文为简介dockerfile参数,以及相应的作用。
二、dockerfile参数说明
-
FROM
指定基础镜像
-
MAINTAINER
维护者名称,自定义,可写可不写
-
RUN
镜像构建时运行的命令,可以写shell命令也可以写成exec样式
【shell样式】
RUN mkdir -p /test/a
【exec样式】
RUN [“mkdir”,“-p”,“/test/a”]
-
EXPOSE
用于指定容器默认映射的端口,端口可以写多个
。在docker run -P(大P)时
,会自动随机物理机的端口映射 EXPOSE 的端口。
可以使用docker run -p
命令指定其他端口。
【多个端口】
EXPOSE [port1,port2]
EXPOSE [80,8080]
-
CMD
通常用于启动服务,会在docker run时运行只执行一次,如果有多个CMD默认只会执行最后一个。
-
ENTRYPOINT
类似CMD,通常用于启动服务。指定容器启动后执行的命令,也是多个执行最后一个。
不可被docker run提供的参数覆盖。可以传参运行,docker run 时可以用-c指定变参
【例如】
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
指定了ENRTYPOINT,在docker run的时候就不要加/bin/bash,不然会运行出错
-
COPY
用于复制。本地源地址 > 容器内地址
可以指定属主: chown=user:group可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则
【例如】
COPY hom* /mydir/
COPY hom?.txt /mydir/
ADD
和COPY一样是复制,但是复制压缩文件时,会自动解压缩。
tar、gzip、bzip2、xz格式复制会自动解压到目标路径
没办法用于复制整个tar文件,要用copy
【用法】
ADD nginx.tar /etc/nginx/
-
VOLUME
数据卷
定义匿名数据卷,一般是启动时忘记挂载数据卷,并且会自动挂载到定义的匿名数据卷。
在容器创建过程中会在容器中创建该目录,在宿主机上的挂载目录名是随机生成的
,在这个目录下/var/lib/docker/volumes/
【用法】
volume ["/data"]
docker run -v 主机目录:容器目录:权限 -itd 镜像名
例如:
docker run --name nginx -v /data:/nginx:ro -itd nginx_images
修改挂载点,使用-v会安全点
权限可以为ro只读、rw读写
-
WORKDIR
用于指定工作目录,如果镜像中对应的路径不存在,会自动创建此目录WORKDIR 中需要指定绝对路径
【用法】
WORKDIR /workdir
-
ENV
设置镜像内的环境变量
【例如】
# 设置nginx =/usr/share/nginx/html/, 在后续的指令中可以通过$nginx引用:
ENV nginx /usr/share/nginx/html/
COPY index.html $nginx
-
USER
用于指定执行后续命令的用户和用户组用户和用户组必须提前已经存在
【用法】
USER user_name/uid
USER user:group
USER uid:gid
-
ONBUILD
配置当前所创建的镜像,后续被作为其它新创建镜像的基础镜像时,执行的命令。
创建的镜像A配置了这个命令,后续镜像A被作为基础镜像,创建镜像B时会执行。
【例如】
# 后续创建的目录会自动重新上传dockerfile目录里的index.html文件
ONBUILD COPY index.html /usr/share/nginx/html/
-
LABEL
用来给镜像添加一些元数据(metadata),可以指定多个可以使用docker inspect命令查看label
【例如】
LABEL image.version="1.0"
【多个LABLE方法1,用“\”换行写】
LABEL image.version="1.0" \
image.creator="wbh"
【多个LABLE方法2】
LABEL image.version="1.0" image.creator="wbh"
-
HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
【语法】
HEALTHCHECK [<options>] CMD <cmd>
--interval=<间隔>:两次健康检查的间隔,默认为 30 秒。
--timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒。
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
--start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒(从 V17.05 引入)。
在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 和 exec 格式。命令的返回值决定了该次健康检查的成功与否:
0:成功
1:失败
2:保留值,不要使用
-
ARG
用于构建参数,和ENV的作用差不多。但是ARG设置的是局部变量
,只在dockerfile里面生效.
在docker build的时候生效,构建镜像后此局部变量会不存在。
在docker build 时可以使用 --build-arg 定义变量的值。
不建议在构建时使用ARG传递密钥、用户凭证等信息,因为构建时的信息任何用户都可以通过docker history看到
三、nginx例子
nginx的dockerfile模板。文章来源:https://www.toymoban.com/news/detail-434525.html
需要有个基础的镜像,基于这个镜像创建自定义的镜像,可以使用官方的centos镜像
docker pull centos
注意:构建镜像的文件名必须为dockerfile,目录可以自定义文章来源地址https://www.toymoban.com/news/detail-434525.html
3.1 需要先创建个dockerfile目录
mkdir /nginx/
3.2 在dockerfile目录下创建dockerfile文件
vim /nginx/dockerfile
FROM centos
MAINTAINER daoxiang
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#创建index.html文件
vim /nginx/index.html
hello,world!!!
3.3 构建镜像的命令
docker build -t “images_name:tag” dockerfile_path
-t 用于命名镜像名和版本
-f 指定dockerfile目录的绝对路径
#制作镜像
docker build -t “wbh/nginx:v1” /nginx/
3.4 创建容器
#基于自己的镜像创建容器
docker run -itd -p 80 --name=nginx wbh/nginx:v1
3.5 测试nginx是否正常运行
#查看容器地址
docker inspect nginx
# curl 容器ip
curl 172.17.0.2
# 显示出hello,world! 就成功了
到了这里,关于dockerfile文件参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!