自定义Dockerfile (1)

1.Dockerfile指令

1. Dockerfile头部部分
FROM  指定基本镜像类似与docker pull 下载镜像  #尽量少写ubuntu或Ubuntu:latest, 尽量精确具体版本
例:FROM ubuntu:22.04 

LABEL  用于指定容器的属性信息或个人联系方式,水印类似注释       #不推荐使用MAINTAINER
例:LABEL Nolen_H... 年。月。日 镜像网址

ENV 用于创建Dockerfile中使用的变量   #软件版本可以创建使用变量
例:ENV NGX_COF=/etc/nginx/nginx.conf 或者 NGX_COF /etc/nginx/nginx.conf #不加=用空格代替 


2.Dockerfile中部部分
RUN 制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。但不能出现阻塞当前终端的命令
例:RUN apt install -y ....

ADD 可以把指定文件或目录拷贝到容器中(指定目录),会解压压缩包,相对于当前目录
例:ADD china.tar.gz /usr/share/nginx/html/
    ADD default.conf /etc/nginx/conf.d/default.conf
COPY 可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压 相对于当前目录
例:COPY default.conf /etc/nginx/conf.d/default.conf

WORKDIR 指定容器的默认工作目录 #一般用于配合ADD	COPY需要书写容器中的路径指令
例: WORKDIR /app/code/xxxx/

VOLUME 挂载数据卷  创建随机数据挂在容器的目录 #推荐docker run的时候指定-v即可
例:VOLUME /usr/share/nginx/html  


3.Dockerfile尾部指令
EXPOSE  指定镜像对外暴露的端口 用于指定一个容器或多个容器的端口,未来这个端口可以被-p识别xxxx:80
例:EXPOSE 80 443

CMD 用于指定容器的入口命令,CMD入口命令可以在docker run 的时候替换 大部分都是用于阻塞容器
例:CMD ["nginx"."-g","daemon off;"]   #["命令","参数01","参数02;"]
ENTRYPOINT 用于指定容器的入口命令 ,ENTRYPOINT入口命令在docker run的时候被追加 #使用不多
例:ENTRYPOINT ["nginx"."-g","daemon off;"]
CMD和ENTRYPOINT同时使用时 CMD的命令会变为ENTRYPOINT的命令参数

HEALTHCHECK指令监控服务,业务是否正常
例:HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8080
build时生成自定义镜像时,编辑./dockerignore直接指定要排除的内容.
# cat .dockerignore
etc*.tar.gz

2.tengine自定义镜像-多阶段提交

2.1 原始tengine自定义镜像,但是镜像内存大

#1.pill ubuntu images#
FROM ubuntu:20.04
LABEL author="Nolen_H"
ENV Web_User "nginx"
ENV Web_Server "tengine"
ENV Web_Version "3.1.0"
ENV Server_Dir "/app/tools/tengine-3.1.0"
ENV Server_Dir_Soft "/app/tools/tengine"
#2. 编译安装 ######
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
    
RUN 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 

#编译
RUN  cd /tmp/ \
    && cd ${Web_Server}-${Web_Version} \
    && make -j `nproc` \
    && make install 

RUN  groupadd ${Web_User} \
     && useradd -g ${Web_User} ${Web_User} \
     &&  ln -s ${Server_Dir} ${Server_Dir_Soft} \
     &&  ln -s ${Server_Dir_Soft}/sbin/nginx  /sbin/ \
#清除软件包缓存  
     &&  rm -fr /var/cache/* /var/lib/apt/*  \
#可以用docker logs 看日志
     &&  ln -sf /dev/stdout  /app/tools/tengine/logs/access.log \
     &&  ln -sf /dev/stderr  /app/tools/tengine/logs/error.log 

EXPOSE 80 443

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

2.2 通过多阶段提交自定义tengine自定义镜像减小镜像内存

#
#1.pill ubuntu images#
FROM ubuntu:20.04 AS temp
LABEL author="Nolen_H"
ENV Web_User "nginx"
ENV Web_Server "tengine"
ENV Web_Version "3.1.0"
ENV Server_Dir "/app/tools/tengine-3.1.0"
ENV Server_Dir_Soft "/app/tools/tengine"
#2. 编译安装 ######
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
    
RUN 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 

#编译
RUN  cd /tmp/ \
    && cd ${Web_Server}-${Web_Version} \
    && make -j `nproc` \
    && make install 
#在创建一个镜像,存放上面编译安装结果,也是最终镜像
FROM ubuntu:20.04 
ENV Web_User "nginx"
ENV Web_Server "tengine"
ENV Web_Version "3.1.0"
ENV Server_Dir "/app/tools/tengine-3.1.0"
ENV Server_Dir_Soft "/app/tools/tengine"

#把中间镜像(临时镜像)内容(结果)复制到当前镜像
COPY --from=temp /app/  /app/

#安装依赖
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 libssl-dev pcre2-utils  libpcre3-dev zlib1g-dev

RUN  groupadd ${Web_User} \
     && useradd -g ${Web_User} ${Web_User} \
     &&  ln -s ${Server_Dir} ${Server_Dir_Soft} \
     &&  ln -s ${Server_Dir_Soft}/sbin/nginx  /sbin/ \
#清除软件包缓存  
     &&  rm -fr /var/cache/* /var/lib/apt/*  \
#可以用docker logs 看日志
     &&  ln -sf /dev/stdout  /app/tools/tengine/logs/access.log \
     &&  ln -sf /dev/stderr  /app/tools/tengine/logs/error.log 

EXPOSE 80 443

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

3.Dockerfile注意事项&排查流程

3.1 注意事项

1.尽量保证每个镜像功能单一  尽量避免多个服务运行在同一个镜像中
2.选择合适的基础镜像        不一定都要从头做(系统,ngx,tengine,tomcat,jdk...)
3.注释与说明               添加一定的注释和镜像属性信息(LABEL)
4.指定版本号               使用镜像的时候指定版本,nginx:latest   php:latest nginx:1.20.2-alpine
5.减少镜像层数/步骤         尽可能合并RUN,ADD,COPY
6.记得收尾(减少镜像大小)     清理垃圾,记得清理缓存,临时文件,压缩包...
7.合理使用.dockerignore     Dockerfile同一个目录,隐藏文件.构建的忽略的文件(了解),少传输些文件.

3.2 排查流程

1)第1类问题:运行docker build故障.

  1. dockerfile书写问题.
  2. 根据错误提示的步骤大概定位是哪个步骤出了问题.
  3. 如果是RUN,拆分.2个RUN,为了定位哪个命令问题.
  4. 如果其他指令看错误提示即可.

2)第2类问题:运行docker run故障.

  1. 查看提示docker ps -a --no-trunc 查看详细入口命令与错误提示.
  2. docker run 然后看日志 (后台)docker logs 查看.
  3. dockerun -it + /bin/bash 前台运行,进入容器,手动启动服务. 观察错误提示
  4. 进入容器,执行检查类命令 nginx -t & php-fpm -t r

3)第3类问题:手动检查配置文件

posted @ 2024-10-18 16:07  Nolen_H  阅读(124)  评论(0)    收藏  举报