Dockerfile使用,示例


1.dockerfile介紹

鏡像分類:

  1. 基礎鏡像:例如centosUbuntualpine
  2. 環境鏡像:例如Javaphpgo
  3. 項目鏡像:將項目與環境鏡像打包一起

2.Dockerfile常用指令

指令                                                          描述

FROM                               構建新鏡像是基於哪個鏡像

LABEL                               標簽

RUN                                  構建鏡像時運行的shell命令

COPY                                拷貝文件或目錄到鏡像中

ADD                                   解壓壓縮包並拷貝

ENV                                   設置環境變量

USER                                RUNCMDENTRYPOINT執行命令指定運行用戶

EXPOSE                           聲明容器運行的服務端口

WORKDIR                        RUNCMDENTRYPOINTCOPYADD設置工作面目錄

 

CMD                                 運行容器時默認執行,如果有多個CMD指令,最后一個生效

 

ENTRYPOINT                  如果與CMD一起用,CMD將作為ENTRYPOINT的默認參數

 

                如果有多個ENTRYPOINT指令,最后一個生效

3.docker build構建鏡像

 #docker bulid -t 鏡像名 -f 指定Dockerfile文件位置

 #docker build -t test .

 #docker build -t 鏡像名稱 -f /path/Dockerfile/path

 #docker build -t 鏡像名稱 http://www.example.com/Dockerfile

 

#mkdir chao

#cd chao/

#touch a.txt

#cp /root/ansible-2.4.2.0-2.el7.noarch.rpm .

 

#vim Dockerfile

FROM centos:7

RUN yum -y install wget curl

COPY a.txt /opt

ADD ansible-2.4.2.0-2.el7.noarch.rpm /opt

ENV ABC=123

EXPOSE 80

WORKDIR /usr/local

CMD ["sleep","36000"]

 

#docker build -t test .  構建

 

  1. CMDENTRYPOINT區別

CMD用法:

CMD [“executable”,”參數1”,”參數2”]: exec形式(首選)   executable可執行路徑,

CMD [“param1(參數1”,”param2”]: 作為ENTRYPOINT的默認參數

CMD command param1 param2 : Shell形式

 

ENTRYPOINT用法

ENTRYPOINT [“executable”,”param1”,”param2”]

ENTRYPOINT command param1 param2

 

小結:

  1. CMDENTRYPOINT指令都可以用來定義運行容器時使用的默認命令
  2. Dockerfile至少指定一個CMDENTRYPOINT
  3. CMD可以用作ENTRYPOINT默認參數,或者用作容器的默認命令
  4. docker run指定<command>時,將會覆蓋CMD
  5. 如果是可執行文件,希望運行時傳參,應該使用ENTRYPOINT

 

 5.前端項目鏡像構建與部署:nginx

FROM centos:7

RUN yum -y install wget curl gcc gcc-c++ make openssl-devel pcre-devel gd-devel \

          iproute net-tools telnet && \

         yum clean all && \

         rm -rf /var/cache/yum/*

ADD nginx-1.15.5.tar.gz /

RUN cd nginx-1.15.5 && \      

    ./configure --prefix=/usr/local/nginx \

    --with-http_ssl_module \

    --with-http_stub_status_module && \

    make -j 4 && make install && \

    mkdir /usr/local/nginx/conf/vhost && \

    cd / && rm -rf nginx* && \

   ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    

ENV PATH $PATH:/usr/local/nginx/sbin

COPY nginx.conf /usr/local/nginx/conf/nginx.conf

WORKDIR /usr/local/nginx

EXPOSE 80

CMD ["nginx","-g","daemon off;"]

6.php項目鏡像構建

FROM centos:7

RUN yum -y install epel-release && \

          yum -y install 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/*

ADD php-5.6.36.tar.gz /

RUN cd php-5.6.36 && \

         ./configure --prefix=/usr/local/php \

          --with-config-file-path=/usr/local/php/etc \

          --enable-fpm --enable-opcache \

          --with-mysql --with-mysqli --with-pdo-mysql \

         --with-openssl --with-zlib --with-curl --with-gd \

         --with-jpeg-dir --with-png-dir --with-freetype-dir \

         --enable-mbstring --with-mcrypt --enable-hash && \

         make -j 4 && make install && 、

         cp php.ini-production /usr/local/php/etc/php.ini && \

         cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \

         sed -i “90a \daemonize = no” /usr/local/php/etc/php-fpm.conf && \

         mkdir /usr/local/php/log && \

          cd / && rm -rf php* && \

        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV   PATH $PATH:/usr/local/php/sbin

COPY php.ini /usr/local/php/etc/

COPY php-fpm.conf /usr/local/php/etc/

WORKDIR /usr/local/php

EXPOSE 9000

CMD ["php-fpm"]

7.java項目鏡像構建tomcat

FROM centos:7

ENV VERSION=8.5.43

RUN yum -y install java-1.8.0-openjdk wget curl unzip iproute net-tools && \

         yum clean all && \

         rm -rf /var/cache/yum/*

ADD apache-tomcat-${VERSION}.tar.gz /usr/local/

RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \

          sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"'

         /usr/local/tomcat/bin/catalina.sh && \

          ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080

CMD ["catalina.sh","run"]

 

編寫Dockerfile最佳實踐

減少鏡像層:一次RUN指令形成新得一層,盡量Shell命令都寫在一行,減少鏡像層

優化鏡像大小:一個RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會帶到下一層,所以要在每一層清理對應的殘留數據,減少鏡像大小

減少網絡傳輸時間:例如軟件包、mvn倉庫等

多階段構建:代碼編譯、部署在一個dockerfile完成,只會保留部署階段產生的數據

選擇最小的基礎鏡像:例如alpine  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM