• Day04-Dockerfile与案例


    5)案例22:使用变量

    • ENV指令
    #######################
    #1. pull ubuntu image##
    #######################
    FROM ubuntu:20.04
    LABEL maintainer="Tengine docker admin "  author="oldboylidao996"
    #######################
    ####ENV vars###########
    #######################
    ENV  Web_User="nginx"
    ENV  Web_Server="tengine"
    ENV  Web_Version="2.3.2"
    ENV  Server_Dir="/app/tools/tengine-2.3.2"
    ENV  Server_Dir_Soft="/app/tools/tengine"
    #######################
    #2. ge zhong run ######
    #######################
    RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list \
        && apt-get update \
        && apt-get install -y wget libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
        && wget -P /tmp/http://tengine.taobao.org/download/${Web_Server}-${Web_Version}.tar.gz \
        && cd /tmp \
        && tar xf ${Web_Server}-${Web_Version}.tar.gz \
        && cd ${Web_Server}-${Web_Version} \
        && ./configure --prefix=${Server_Dir} \
             --user=${Web_User} \
             --group=${Web_User} \
             --with-http_ssl_module \
             --with-http_v2_module \
             --with-http_realip_module \
             --with-http_stub_status_module \
             --with-http_mp4_module \
             --with-stream \
             --with-stream_ssl_module \
             --with-stream_realip_module \
             --add-module=modules/ngx_http_upstream_check_module/ \
             --add-module=modules/ngx_http_upstream_session_sticky_module \
        && make \
        && make install \
        && groupadd ${Web_User} \
        && useradd -g ${Web_User} ${Web_User} \
        && ln -s ${Server_Dir} ${Server_Dir_Soft} \
        && ln -s ${Server_Dir_Soft}/sbin/nginx /sbin/
    #######################
    ##3. clean ############
    #######################
    RUN rm -fr /tmp/* \
        && rm -fr /var/cache/*
    #######################
    ##4. copy index.html###
    #######################
    COPY index.html ${Server_Dir_Soft}/html/index.html
    #######################
    ##5. PORT 80###########
    #######################
    EXPOSE 80 443
    #######################
    ##6. CMD###############
    #######################
    CMD ["nginx","-g","daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    7)案例23:多服务镜像nginx+php

    • 流程:

      • 基础镜像:centos:7
      • 配置yum源.
      • 安装Nginx
      • 安装php软件包
      • 站点目录,传输代码.修改所有者
      • 写CMD入口脚本(给权限,注意格式)
    • Dockerfile

    FROM centos:7
    
    #1.vars
    ENV WEB_USER=nginx
    
    #2.传输软件包nginx+php
    ADD ngx-php.tar.gz /tmp/
    COPY entrypoint.sh /
    
    #3.安装软件包
    RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
        && curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo \
        && sed -i 's#keepcache=0#keepcache=l#g' /etc/yum.conf \
        && yum localinstall -y /tmp/*.rpm \
        && sed -i "s#apache#${WEB USER}#g" /etc/php-fpm.d/www.conf
    
    #4.端口
    EXPOSE 80 9000
    #5.入口命令
    CMD ["/entrypoint.sh"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 入口脚本
    cat entrypoint.sh
    #!/bin/bash
    php-fpm
    nginx -g "daemon off;"
    
    • 1
    • 2
    • 3
    • 4
    • 打包
    docker build -t web:nginx_php_v3 .
    
    • 1

    案例25:多阶段提交

    • 目前使用多节点提交实现:

      • 编译安装一些软件的时候,一般是先安装各种依赖,然后开始编译安装,编译安装一般会生成新的命令
      • 1个镜像负责编译安装,生成命令(临时)
      • 1个镜像上一个镜像的命令复制过来+服务必要的配置
      • 最终使用最后的这个镜像
    • 在1个dockerfile中使用多个FROM,以减小最终镜像大小

    • tengine+type项目多阶段提交

      • 创建镜像的时候起个别名 FROM xxx AS temp
      • 对中间镜像进行操作,下载依赖,下载软件包,编译… ᲼
      • 创建镜像 FROM ubuntu:20.04
      • 把中间镜像的命令,配置文件/目录复制到最终镜像中
      • 复制代码…
      • EXPOSE 80, 设置入口指令CMD…
    [root@docker01 07-multi-image-tengine]# cat Dockerfile 
    #1. 基本信息
    FROM ubuntu:20.04 AS TEMP
    LABEL author="lidao996" \
          url="www.oldboyedu.com"
    #2. vars 
    ENV WEB_SERVER=tengine-2.3.3
    ENV INSTALL_DIR=/app/tools/${WEB_SERVER}
    ENV NGX_USER=nginx
    ENV CPU_CORES=1
    #2. 传输软件包
    ADD tengine-2.3.3.tar.gz /tmp/
    #3. 环境准备
    RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
    RUN apt update
    RUN apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev 
    RUN cd /tmp/tengine-2.3.3/ \
    &&  ./configure --prefix=${INSTALL_DIR} \     
    --user=${NGX_USER} \
    --group=${NGX_USER} \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_mp4_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-stream_realip_module \
    --add-module=modules/ngx_http_upstream_check_module/ \
    --add-module=modules/ngx_http_upstream_session_sticky_module \
    && make -j ${CPU_CORES} \
    && make install
    #编译安装结束生成命令 源码目录/tmp/tengine-2.3.3/objs/nginx
    # 下面待整理, 创建软连接,添加用户
    # 到此为止第1个镜像的任务已经完成了. 
    #
    FROM ubuntu:20.04 
    ENV NGX_USER=nginx
    COPY --from=TEMP /app/ /app/
    
    RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
    RUN apt update
    RUN apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev
    RUN ln -s /app/tools/tengine-2.3.3/  /app/tools/tengine
    RUN ln -s /app/tools/tengine/sbin/nginx  /sbin/nginx
    RUN useradd -s /sbin/nologin \${NGX_USER}
    RUN rm -fr /tmp/* /var/cache/*
    
    EXPOSE 80
    
    CMD [ "nginx","-g","daemon off;" ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 多阶段提交(FROM)小结

    • 应用场景

      • 压缩镜像的大小
      • 镜像分层次架构,适用于编译安装/构建场合,先通过中间镜像进行编译,编程结果存放到新的镜像中

    FROM ubuntu:20.04 AS base

    FROM ubuntu:20.04

    • ADD --from

    • COPY --from

    案例26:CMD与ENTRYPOINT的理解

    CMD与ENTRYPOINT,目前大部分使用CMD即可

    在这里插入图片描述

    dockerfile2个指令CMDENTRYPOINT
    共同点用于设置容器入口命令
    容器启动后默认运行什么指令什么参数
    用于设置容器入口命令
    容器启动后默认运行什么指令什么参数
    共同点CMD [“命令”,“参数1”,“参数2”]ENTRYPOINT [“命令”,“参数1”,“参数2”]
    区别(非同时时间)用户通过docker run/exec启动进入容
    器的时候,指定了命令.
    这个命令会替代CMD命令和参数
    用户通过docker run/exec启动进入容器的时候,指定了命令.
    指定的命令,选项会成为ENTRYPOINT命令的选项
    区别(一起使用学完SHELL)CMD写的入口命令和命令的选项.(可以被
    替换)
    入口的指令不可替换. 一般指定脚本,脚本用于判断用户docker
    run/exec的时候是否输入了命令.
    如果没加 docker run -d nginx:1.20.2,直接运行CMD
    如果加了,则运行对应的命令和选项

    9) dockerfile小结

    • 熟练掌握dockerfile格式及书写. docker总结传送门
    • dockerfile常用的指令
    • 尽量多阅读官方或gitee/github上面的代码中的dockerfile.
    生产环境应用建议说明
    尽量保证每个镜像功能单一尽量避免多个服务运行在同一个镜像中
    选择合适的基础镜像不一定都要从头做(系统,ngx,tengine,tomcat,jdk…)
    注释与说明添加一定的注释和镜像属性信息(LABEL)
    指定版本号使用镜像的时候指定版本,nginx:latest php:latest nginx:1.20.2-alpine
    减少镜像层数/步骤尽可能合并RUN,ADD,COPY
    记得收尾清理垃圾,记得清理缓存,临时文件,压缩包…
    合理使用.dockerignore构建的忽略的文件(了解),少传输些文件

    10)docker镜像层次架构

    未来应用的时候,镜像做好后存放在镜像仓库中。
    在这里插入图片描述

    3.3 容器互联 --link

    –link是用于容器连接其他容器的选项,其他容器要运行中才行

    案例27:分离式 nginx+php

    • docker镜像架构分层次
    • 基础:系统
    • 服务:nginx,php,tomcat,jdk,…
    • 业务:kodexp
    nginx:1.22.1-alpine
    php:7-fpm  #php:7-fpm-alpine /usr/local/etc/php-fpm.d/www.conf
    修改配置,挂载配置
    挂载代码
    
    • 1
    • 2
    • 3
    • 4
    1. 代码与配置文件目录
    mkdir -p kodexp/{conf,code,data}
    2. 
    /app/docker/kodexp
    ─ app
    │   ├── ChangeLog.md
    │   ├── config
    │   ├── data
    │   ├── index.php
    │   ├── plugins
    │   ├── README.MD
    │   └── static
    3. 下载nginx和php镜像
    nginx:1.20.2-alpine
    php:7-fpm
    
    5. 启动php
    www.conf
    [www]
    user = www-data
    group = www-data
    listen = 0.0.0.0:9000
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    
    docker run -d --name "kodexp_php" \
    -v `pwd` /conf/www.conf:/usr/local/etc/php-fpm.d/www.conf \
    -v `pwd`/code:/app/code/kodexp \
    php:7-fpm-alpine
    nginx与php,代码目录一致.php解析代码的时候也要找这个代码目录,如果不指定/var/www/html/目录.(php工作目录)
    
    4. 启动nginx
    docker run -d --name "kodexp_nginx" -p 10086:80 \
    Վʔlink kodexp_php:php \
    -v `pwd`/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v `pwd`/conf/kodexp.conf:/etc/nginx/conf.d/kodexp.conf \
    -v `pwd`/code:/app/code/kodexp/ \
    nginx:1.22.1-alpine
    #--link 容器名字:别名
    5. 修改代码权限
    chmod -R 777 code
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    php环境缺少依赖 gd

    #debian系统
    FROM php:7.4-fpm
    RUN apt-get update ՎҐ apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    && docker-php-ext-configure gd Վʔwith-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    小结:link用于容器之间连接nginx–>php , php–>db

  • 相关阅读:
    一文弄懂CNN中的BatchNorm
    电商新趋势:阿里巴巴1688.item_password API引领智能分享新风尚
    基于阿里云GPU云服务器的AIACC助力UC搜索业务性能提效380%,每年节省数千万成本
    web渗透测试----5、暴力破解漏洞--(2)SNMP密码破解
    模型选择、过拟合与欠拟合(多层感知机)
    小问题--电脑开机一连上网就总是会安装各种软件的问题及解决
    这些仪表板常用的数据分析模型,你都见过吗?
    每日三题 7.26
    央视纪录:全球首创 “佛脸识别技术”,探索文物虚拟修复
    猿创征文|一位.Net开发工程师的客户端技术栈的学习路线
  • 原文地址:https://blog.csdn.net/dws123654/article/details/138163166