Dockerfile文件用法

Dockerfile文件使用方法

场景:根据业务需求以及个人使用习惯,大部分运行的容器使用的镜像,均需要自己去编译镜像。

1. Dockerfile中的各个参数使用方法如下:

FROM          基础镜像
MAINTAINER    维护者的记录信息
RUN           执行shell命令,尽量运行在同一镜像层,减少构建镜像层数
ADD           复制文件指令。它有两个参数<src>和<dest>。该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
        注意:  
            1)如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。
            2)<src>路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。
            3)如果<src>是一个url且<dest>不是以”/“结尾,则会下载文件并重命名为<dest>。
            4)如果<src>是一个url且<dest>以“/”结尾,则会下载文件到<dest>/<filename>,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工作的。
            5)如果<src>是一个本地的压缩包且<dest>是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果<dest>有同名文件则覆盖,但<src>是一个url时不会执行解压缩。
COPY         略
             复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。当使用本地目录为源目录时,推荐使用 COPY。COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能
CMD         -------->      语法: 1)CMD ["executable", "param1", "param2"]            #将会调用exec执行,首选方式                   
              |_____>      语法: 2)CMD ["param1", "param2"]                          #当使用ENTRYPOINT指令时,为该指令传递默认参数
              |_____>      语法: 3)CMD <command> [ <param1>|<param2> ]               #将会调用/bin/sh -c执行

           指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
 
EXPOSE       指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息
ENTRYPOINT   -------->      语法:1)ENTRYPOINT ["executable", "param1", "param2"]       #将会调用exec执行,首选方式
               |_____>      语法:2)ENTRYPOINT command param1 param2                    #将会调用/bin/sh -c执行

         指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run
         <images> -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当通过docker run <image>启动容器时该容器会运行ls -a
         /etc命令,当使用docker run <image> -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。
WORKDIR      -------->      语法:WORKDIR /path/to/workdir

           指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
ENV          -------->       语法:ENV <key> <value>
           ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env <key>=<value>参数来修改。

        注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

USER        -------->        语法:USER [username|uid]

       USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令
VOLUME      -------->        语法: VOLUME ["samepath"]

VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。

2. 构建镜像

方法1: 通过已存在的镜像或容器,创建新的镜像。

             语法: docker    commit     <container_ID | container_name>       <new_image_name>:<tag>

              将安装好的容器打包成镜像,保存container 的当前状态到image后,生成对应的image      

              注:无论容器什么状态执行打包均可,然后可以根据这个容器镜像,接着进行启动一个新的容器(虽然没有影响,不过推荐关闭容器进行创建镜像)

docker commit   264117d8cf64    centos_nginx:v1       通过容器ID进行创建新镜像
docker commit   centos-nginx    centos_nginx:v2        通过容器名称进行创建新镜像

方法2: docker build           

             案例1:  docker build    使用dockerfile 文件自动化制作image(简单源码安装nginx)

             创建dockerfile如下:

//cat   dockerfile
FROM          centos:6.8
MAINTAINER    yangjw 2018.03.13
RUN           yum install -y wget gcc gcc-c++ make openssl-devel  pcre*  \
         &&   useradd  nginx   \
         &&   wget  http://nginx.org/download/nginx-1.8.1.tar.gz
ADD           nginx-1.8.1.tar.gz /usr/local/src 
WORKDIR       /usr/local/src/nginx-1.8.1 
RUN           ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module \
              && make         \
              && make install \
              && echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf 
ENV           PATH /usr/local/nginx/sbin:$PATH 
EXPOSE        80 
CMD           ["nginx"]

        创建新的容器镜像文件   在dockerfile文件所在同级目录下执行如下命令

docker  build   -t  centos/nginx:v1  .
docker  images

        启动容器//把宿主机90端口映射到容器内的80端口

docker  run  -d  --name  NGINX  -p 90:80  centos/nginx-1.8.1:v1

 

posted @ 2020-11-10 17:57  淡淡定定  阅读(267)  评论(0编辑  收藏  举报