Linux运维之docker(三)镜像的优化
- 在docker中创建nginx
1.下载nginx的镜像并且导入到本地
[root@server1 ~]# ls
anaconda-ks.cfg docker nginx-1.15.8.tar.gz rhel7.tar
busybox.tar game2048.tar nginx.tar ubuntu.tar
[root@server1 ~]# docker load -i nginx.tar
2.下载nignx的安装包到本地,因为实验中需要用到,并且编写dockfile文件
//在/tmp/docker中添加已经下载的nginx的安装包
[root@server1 ~]# mv nginx-1.15.8.tar.gz /tmp/docker/
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# ls
Dockerfile dvd.repo index.html nginx-1.15.8.tar.gz website
//编写Dockfile文件
[root@server1 docker]# vim Dockerfile
文件编辑内容如下:
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
EXPOSE 80 端口
VOLUME ["/usr/local/nginx/html"] 挂载点
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
//以dockerfile生成新的镜像
[root@server1 docker]# ls
Dockerfile dvd.repo(yum源文件之前已经写好) index.html nginx-1.15.8.tar.gz(nginx安装包)
[root@server1 docker]# docker build -t nginx:v1 .
//查看生成的镜像
//使用新生成的镜像运行容器
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v1 -d表示打入后台,-f表示添加端口映射
查看生成的镜像及其内存大小为276MB:
- 镜像的优化
1.减少镜像层数
//编辑dockerfile
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# vim Dockerfile
文件编写的内容如下:
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
//运行新的镜像v2并且查看大小,发现比v1少了20MB
[root@server1 docker]# docker build -t nginx:v2 .
[root@server1 docker]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 57c313c825dd 22 seconds ago 250MB
nginx v1 0f28d8eb67fe 20 minutes ago 276MB
2.清理镜像构建的中间产物并且使用多阶段构建镜像
//编辑dockerfile
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
文件
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && 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 -rf /mnt/nginx-1.15.8
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;"]
重新以dockerfile创建新的镜像并且查看大小发现变为144MB
3.终极优化从底层优化
//下载distroless镜像并且进行本地导入
[root@server1 docker]# docker load -i distroless.tar
//编写dockerfile
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
文件编辑内容如下:
FROM nginx 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 /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
ENTRYPOINT ["nginx", "-g", "daemon off;"]
//生成新的镜像
[root@server1 docker]# docker build -t busybox:v5 .
查看发现优化后变为20多MB