当前位置:   article > 正文

Day04-Dockerfile与案例

Day04-Dockerfile与案例

5)案例22:使用变量

  • ENV指令
#######################
#1. pull ubuntu image##
#######################
FROM ubuntu:20.04
LABEL maintainer="Tengine docker admin <youjiu_linux@qq.com>"  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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/501563
推荐阅读
  

闽ICP备14008679号