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故障.
- dockerfile书写问题.
- 根据错误提示的步骤大概定位是哪个步骤出了问题.
- 如果是RUN,拆分.2个RUN,为了定位哪个命令问题.
- 如果其他指令看错误提示即可.
2)第2类问题:运行docker run故障.
- 查看提示docker ps -a --no-trunc 查看详细入口命令与错误提示.
- docker run 然后看日志 (后台)docker logs 查看.
- dockerun -it + /bin/bash 前台运行,进入容器,手动启动服务. 观察错误提示
- 进入容器,执行检查类命令 nginx -t & php-fpm -t r
3)第3类问题:手动检查配置文件