镜像的优化
具体操作:
第一次构建:(正常构建)
1.编辑dockerfile(当前目录/tmp/docker)
[root@server1 docker]# cp /root/nginx-1.15.8.tar.gz .
[root@server1 docker]# ls
Dockerfile nginx-1.15.8.tar.gz website yum.repo
[root@server1 docker]# vim Dockerfile
FROM rhel7
COPY yum.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 ##去掉debug日志
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;"] ##命令的运行方式
2.构建镜像
[root@server1 docker]# docker build -t nginx:v1 .
[root@server1 docker]# docker rm -f apache
apache
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v1
7b4b65124b8ba2fb6003ed800c89e81548996b1d5b4b9e4bfa8f0ce149de9e64
[root@server1 docker]# docker ps
[root@server1 docker]# docker history nginx:v1
4.在浏览器中访问宿主机的IP可以看到Nginx的默认发布页
5.查看容器的具体挂载信息
[root@server1 docker]# docker inspect nginx
[root@server1 docker]# cd /var/lib/docker/volumes/a479c650640081a1c541f978703aa7b61534b150c0d4daebeefd1110d1533f0b/_data
[root@server1 _data]# ls
50x.html index.html
(2)验证这就是默认发布目录,在当前目录下编辑一个测试页,在浏览器中访问到
[root@server1 _data]# vim test.html
[root@server1 _data]# cat test.html
test.example.com
[root@server1 _data]# cd
在浏览器中访问172.25.19.1/test.html,也就是刚刚编辑的测试文件
什么是volume?
volume就是docker容器使用的数据卷,这个数据卷的名字是系统随机生成的,但他是可以自定义路径的,下面主要介绍数据卷的删除,具体的其他方面后面再去讲解
1.查看正在使用的数据卷,可以看到一个是nginx的,另一个是之前运行的容器apache的
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local a479c650640081a1c541f978703aa7b61534b150c0d4daebeefd1110d1533f0b
local website
2.使用prune命令删除没有被占用的卷注意:只能删除掉没有被占用的
[root@server1 ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
website
Total reclaimed space: 24B
[root@server1 ~]# docker volume ls
[root@server1 ~]# docker container prune
第二次构建:(将run命令写在一起——减少镜像的层数,指定挂载的卷)
1.重新编辑dockerfile(将run命令写在一起——减少镜像的层数,指定挂载的卷)
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# ls
Dockerfile nginx-1.15.8.tar.gz website yum.repo
[root@server1 docker]# vim Dockerfile
dockerfile内容:
FROM rhel7
COPY yum.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;"]
2.构建镜像
[root@server1 docker]# docker build -t nginx:v2 .
3.查看镜像,运行容器,可以看到对比第一次的镜像只缩小了3M
[root@server1 docker]# docker images
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v2
[root@server1 docker]# docker ps -a
[root@server1 docker]# docker rm -f nginx
nginx
第三次构建:(使用多阶段构建)
1.编辑dockerfile,清理中间产物
[root@server1 docker]# vim Dockerfile
dockerfile内容:
FROM rhel7 as build
COPY yum.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 -fr /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;"]
2.构建镜像,查看这次优化的版本
[root@server1 docker]# docker build -t nginx:v3 .
[root@server1 docker]# docker images
[root@server1 docker]# docker rmi -f 9d4dd5d769df ##删除镜像时也可以通过镜像ID来删除。这里删除没有用的镜像
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v3
[root@server1 docker]# docker ps -a
[root@server1 docker]# docker inspect nginx
[root@server1 docker]# docker rm -f nginx
nginx
第四次构建:(从底层优化)
准备工作:导入最精简的镜像和distroless.tar 镜像
不过,代价是调试更麻烦。
[root@server1 ~]# docker load -i distroless.tar
[root@server1 ~]# docker images
[root@server1 docker]# ls
Dockerfile nginx-1.15.8.tar.gz website yum.repo
[root@server1 docker]# cd
[root@server1 ~]# ls
[root@server1 ~]# docker load -i nginx
1.编辑dockerfile,选择最精简的镜像,新的镜像只有23M
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# docker build -t nginx:v4 .
[root@server1 docker]# docker images
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 run -d --name nginx -p 80:80 nginx:v4
[root@server1 docker]# docker ps -a
[root@server1 docker]# curl 172.17.0.2
补充: