思考:问什么要优化镜像?
镜像的优化的手段
l ) 选择'最精简'的基础镜像-->核心
2 ) 减少镜像的'层数' --> 最多128层
3 ) 清理镜像构建的'中间产物'-->无用的中间产品'删除'
4 ) 注意'优化网络'请求
5 ) 尽量去用'构建缓存'-->重要(自身帮我们做的)-->看到下载的和实际的不匹配!
6 ) 使用'多阶段'构建镜像-->杀手锏
base image:必须的命令,以及命令(脚本)所需要的对应的动态链接库(ldd)!
案例演示
# (1)一级构建-->临时缓存
FROM rhel7 as build
ADD nginx-1.15.8.tar.gz /mnt
COPY dvd.repo /etc/yum.repos.d/dvd.repo
WORKDIR /mnt/nginx-1.15.8
# 重构rpm数据库,通过&&减少层数,rm-->清理镜像构建的中间产物!
# 取消debug模式!
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.8
# (2)二级构建
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
说明:上面的方式尽管进行了优化,但是因为底层的bash占的空间太大了,bash环境内有很多东西都是搭建nginx服务用不到的,这样就导致资源的浪费了,所以优化base镜像!
说明:基础镜像的优化--->类库的优化
优化基础镜像-->多层构建
FROM nginx as base # 不指定版本就是nginx:latest
# 补充:如果本地镜像仓库没有,则从远程下载-->前提是做好docker login
# 时区
ARG Asia/Shanghai
# ldd /usr/sbin/httpd --->参照httpd来理解nginx所需要的动态连接库
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
# 多个&&-->层压缩!
FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
VOLUME ["/usr/share/nginx/html"] # nginx默认的资源目录
ENTRYPOINT ["nginx", "-g", "daemon off;"]
docker build -t rhel7:v6 .
docker run -d --name vm5 -p 80:80 rhel7:v6
docker history rhel7:v6
# 说明:启动之后(d参数即可)-->看volume --->找到对应的目录-->看到有50.xml和index.html才对!
出错
docker search rhel
Error response from daemon: Get https://index.docker.io/v1/search?
原因
sysctl -a|grep ip_forward
# DNS问题-->网络基础的问题
# 镜像加速器没配好,就试着重新配置镜像加速器,本身的网络问题!