dockerfile文件参数

一、背景

如果仅限于使用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默认只会执行最后一个。

  • ENRTYPOINT
    类似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模板。

需要有个基础的镜像,基于这个镜像创建自定义的镜像,可以使用官方的centos镜像
docker pull centos

注意:构建镜像的文件名必须为dockerfile,目录可以自定义


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,docker,RUN,CMD,容器)