Docker(三)镜像的优化

思考:问什么要优化镜像?

镜像的优化的手段

l ) 选择最精简的基础镜像-->核心
2 ) 减少镜像的层数
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问题-->网络基础的问题

# 镜像加速器没配好,就试着重新配置镜像加速器,本身的网络问题!

 

你可能感兴趣的:(Docker)