Docker(三)构建Nginx镜像并优化

镜像的优化

  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物
  • 注意优化网络请求
  • 尽量去用构建缓存
  • 使用多阶段构建镜像

具体操作:

第一次构建:(正常构建)

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 

在这里插入图片描述
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 .

Docker(三)构建Nginx镜像并优化_第1张图片
3.运行容器,查看运行的容器以及镜像结构

[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

Docker(三)构建Nginx镜像并优化_第2张图片
4.在浏览器中访问宿主机的IP可以看到Nginx的默认发布页
Docker(三)构建Nginx镜像并优化_第3张图片
5.查看容器的具体挂载信息

[root@server1 docker]# docker inspect nginx

Docker(三)构建Nginx镜像并优化_第4张图片
(1)切换到上图中的路径,可以看到默认发布文件

[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,也就是刚刚编辑的测试文件
Docker(三)构建Nginx镜像并优化_第5张图片
什么是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

Docker(三)构建Nginx镜像并优化_第6张图片
第二次构建:(将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 .

Docker(三)构建Nginx镜像并优化_第7张图片
3.查看镜像,运行容器,可以看到对比第一次的镜像只缩小了3M

[root@server1 docker]# docker images
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v2

Docker(三)构建Nginx镜像并优化_第8张图片
删除容器

[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 

Docker(三)构建Nginx镜像并优化_第9张图片
可以看到这次的镜像明显缩小了只有141M
Docker(三)构建Nginx镜像并优化_第10张图片
3.创建容器

[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 镜像

  • distroless镜像只包含应用程序及其运行时依赖。不包含包管理器、Shell以及其他标准Linux发行版中能找到的其他程序,因为没有Shell,如果黑客入侵了我们的应用程序并获取了容器的访问权限,他也无法造成太大的损害。也就是说,程序越少则尺寸越小也越安全

不过,代价是调试更麻烦。

[root@server1 ~]# docker load -i distroless.tar 
[root@server1 ~]# docker images

Docker(三)构建Nginx镜像并优化_第11张图片

[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

Docker(三)构建Nginx镜像并优化_第12张图片

1.编辑dockerfile,选择最精简的镜像,新的镜像只有23M

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# docker build -t nginx:v4 .
[root@server1 docker]# docker images

Docker(三)构建Nginx镜像并优化_第13张图片
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;"]

Docker(三)构建Nginx镜像并优化_第14张图片
运行容器,访问容器的ip,可以访问到说明构建成功

[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

在这里插入图片描述
Docker(三)构建Nginx镜像并优化_第15张图片

补充:

  1. 查看容器ip
    在这里插入图片描述
    Docker(三)构建Nginx镜像并优化_第16张图片
  2. ldd查看系统调用,也就是查看二进制文件执行时调用的库

你可能感兴趣的:(企业部分)