zoukankan      html  css  js  c++  java
  • Dockerfile

    Dockerfile

    格式:

    FROM centos:latest           #依赖的基础镜像

    MAINTAINER fage             #制作文件的人

    RUN yum install -y gcc       #安装的软件

    COPY run.sh /usr/bin         #执行指令

    EXPOSE 80                       #声明使用的端口

    CMD [ “run.sh”]                  #构建的时候执行的指令

    命令是顺序往下执行的

     

    Dockerfile指令:

    指令 描述
    FROM 指定镜像的基础镜像;
    MAINTAINER 指定维护者信息;
    RUN   运行命令;
    LABEL 指定生成镜像的元数据标签信息;
    EXPOSE 声明镜像内服务所监听的端口;
    ENV 指定环境变量;
    ADD 赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下
    COPY 赋值本地主机的路径下的内容到容器中的路径下;一般情况下推荐使用COPY而不是ADD;
    ENTRYPOINT 指定镜像的默认入口;
    VOLUME 创建数据挂载点;
    USER 指定运行容器时的用户名或UID;
    WORKDIR 配置工作目录;
    ARG 指定镜像内使用的参数(例如版本号信息等);
    ONBUILD 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令;
    STOPSIGNAL 容器退出的信号;
    HEALTHCHECK 如何进行健康检查;
    SHELL 指定使用SHELL时的默认SHELL类型;
    CMD 指定启动容器时默认执行的命令

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    编写 Dockerfile 案例

    Docker通过Dockerfile自动构建镜像的文本文件,由一条一条的指令组成。

    这里,提供了4点编写建议,可帮助你编写高效易用的Dockerfile。

    1.减少镜像层

    一次RUN指令形成新的一层,尽量shell命令都写在一起,减少镜像层。

    例如:

    FROM centos:7
    MAINTAIENR fengyuanfei
    RUN yum install -y gcc-c++ make 
    RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz
    RUN tar xf  php-5.6.36.tar.gz
    RUN cd php-5.6.36
    RUN ./configure --prefix=/usr/local/php
    RUN make -j 4
    RUN make install
    EXPOSE 9000
    CMD ["php-fpm"]

    应该写成

    FROM centos:7
    MAINTAINER www.ctnrs.com
    RUN yum install epel-release -y && 
        yum install -y gcc gcc-c++ make
    
    RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && 
        tar zxf php-5.6.36.tar.gz && 
        cd php-5.6.36 && 
        ./configure --prefix=/usr/local/php && 
        make -j 4 && make install
    EXPOSE 9000
    CMD ["php-fpm"]

    2.优化镜像大小:清理无用数据

    一次RUN形成的一层,如果没有在同一层删除,无论是否最后删除,都会带到清理对应的残留数据,减少镜像大小。

    FROM centos:7
    MAINTAINER www.ctnrs.com
    RUN yum install epel-release -y && 
        yum install -y gcc gcc-c++ make gd-devel libxml2-devel 
        libcurl-devel libjpeg-devel libpng-devel openssl-devel 
        libmcrypt-devel libxslt-devel libtidy-devel autoconf 
        iproute net-tools telnet wget curl && 
        yum clean all && 
        rm -rf /var/cache/yum/*
    
    RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && 
        tar zxf php-5.6.36.tar.gz && 
        cd php-5.6.36 && 
        ./configure --prefix=/usr/local/php 
        make -j 4 && make install && 
        cd / && rm -rf php*

    3.减少网络传输时间

    最好在内部有一个存放软件包的地方,类似于上述的PHP官方下载地址:http://docs.php.net/distrbutions/php-5.6.36.tar.gz,如果用到maven构建这样的操作,同时也更改为私有仓库,减少网络传输时间,提供镜像构建速度。

    4.多阶段进行镜像构建

    如果运行一个项目,根据咱们上面的做法,是直接把代码拷贝到基础镜像里,如果是一个需要预先代码编译的项目呢?例如JAVA语言,如何代码编译、部署在一起完成?

    上面做法需要事先在一个Dockerfile构建一个基础镜像,包括项目运行时环境及依赖库,再写一个Dockerfile将项目拷贝到运算环境中,有点略显复杂了。

    像JAVA这类语言如果代码编译是在Dockerfile里操作,还需要把资源代码构建进去,但实际运行时只需要构建出的包,这种把源代码放进去有一定安全风险,并且也增加了镜像体积。

    构建JAVA项目镜像:

    # git clone https://github.com/lizhenliang/tomcat-java-demo
    # cd tomcat-java-demo
    # vi Dockerfile
    FROM maven AS build
    ADD ./pom.xml pom.xml
    ADD ./src src/
    RUN mvn clean package
    
    FROM lizhenliang/tomcat
    RUN rm -rf /usr/local/tomcat/webapps/ROOT
    COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
    
    # docker build -t demo:v1 .
    # docker container run -d -v demo:v1

    首先,第一个FROM 后边多了个 AS 关键字,可以给这个阶段起个名字。
    然后,第二部分FROM用的我们上面构建的Tomcat镜像,COPY关键字增加了—from参数,用于拷贝某个阶段的文件到当前阶段。这样一个Dockerfile就都搞定了。

    小结:镜像小有很多好处,例如快速部署、快速回滚。减少服务中断时间,同时镜像仓库占用磁盘空间也少了。

  • 相关阅读:
    CPU高问题排查
    java lambda特性(持续学习+更新)
    零星小记
    redis分布式锁和lua脚本
    webservice之拦截器
    扫一扫
    qq登录
    banner的使用
    surfaceview+mediaplayer
    viewpager加fragment可滑动加radio跟随滑动
  • 原文地址:https://www.cnblogs.com/fengyuanfei/p/13798483.html
Copyright © 2011-2022 走看看