镜像的优化
1.选择最精简的基础镜像
2.减少镜像的层数
3.清理镜像构建的中间产物
4.注意优化网络请求
5.尽量去用构建缓存
6.使用多阶段构建镜像
1.基础镜像构建
[root@node2 docker]#mkdir docker
[root@node2 docker]#cd docker
[root@node2 docker]#vim Dockerfile #编辑
FROM rhel7
EXPOSE 80
MAINTAINER sunlele
COPY hh.repo /etc/yum.repos.d/
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@node2 docker]# ls # 下载nginx-1.16.0.tar.gz
Dockerfile hh.repo nginx-1.16.0.tar.gz
[root@node2 docker]# cat hh.repo #编辑hh.repo
[rhel7.5]
name=rhel7.5
baseurl=http://172.25.7.250/rhel7.5
gpgcheck=0
下载rhel7镜像并导入:
看大小
2.清理中间产物
[root@node2 docker]# vim Dockerfile
[root@node2 docker]# cat Dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER sunlele
COPY hh.repo /etc/yum.repos.d/
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel && yum clean all
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install && rm -rf /mnt/nginx-1.16.0
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
3.减少层数&&清理中间产物
[root@node2 docker]# cat Dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER sunlele
COPY hh.repo /etc/yum.repos.d/
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.16.0
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
4.多阶段构建
[root@node2 docker]# vim Dockerfile
[root@node2 docker]# cat Dockerfile
FROM rhel7 as build
EXPOSE 80
MAINTAINER sunlele
COPY hh.repo /etc/yum.repos.d/
ADD nginx-1.16.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.16.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.16.0
FROM rhel7
EXPOSE 80
MAINTAINER sunlele
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
5 选择更小的镜像构建
程序在运行的时候除了二进制文件外,还会调系统函数,如何查看,用ldd命令。
编写Dockerfile:
[root@node2 distroless]# vim Dockerfile
[root@node2 distroless]# cat Dockerfile
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai
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 /usr/sbin/nginx-debug /opt && \
cp -a --parents /lib/x86_64-linux-gnu/ld-* /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* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /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
ENTRYPOINT ["nginx", "-g", "daemon off;"]
[root@node2 distroless]#
构建镜像
用新构建的镜像创建容器:
查看容器的虚拟ip
测试一下nginx是否能用: