Docker 容器与 swarm 集群实战——镜像的构建、优化

请参考上篇博客https://mp.csdn.net/mdeditor/90251584#

镜像的构建三部曲:

  • 运行容器
  • 修改容器
  • 将容器保存为新的镜像

一、镜像的构建

1.创建一个Dockerfile(Dockfile必须在一个空目录下)

[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# ls
index.html
[root@server1 docker]# rm -rf index.html 
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN echo westos > /testfile

运行容器
Docker 容器与 swarm 集群实战——镜像的构建、优化_第1张图片
修改文件内容,会使用cache

[root@server1 docker]# vim Dockerfile
FROM busybox
RUN echo westos > /testfile
RUN echo redhat >> /testfile

Docker 容器与 swarm 集群实战——镜像的构建、优化_第2张图片
Rmi:
删除镜像(当有占用的时候底层的不允许被删除)
Docker 容器与 swarm 集群实战——镜像的构建、优化_第3张图片

  • 镜像的构建Dockerfile常用指令
    Docker 容器与 swarm 集群实战——镜像的构建、优化_第4张图片
    a.shell 格式和 exec 格式的比较

shell格式举例:
修改内容:

[root@server1 docker]# vim Dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello, $name"

Docker 容器与 swarm 集群实战——镜像的构建、优化_第5张图片
注意:–rm表示运行后删除

exec格式举例:

[root@server1 docker]# vim Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo","hello, $name"]

Docker 容器与 swarm 集群实战——镜像的构建、优化_第6张图片
注意:build封装
此时不能正确引用变量

对格式进行修改:

[root@server1 docker]# vim Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/sh", "-c", "echo hello, $name"]

Docker 容器与 swarm 集群实战——镜像的构建、优化_第7张图片
b.CMD 和 ENTRYPOINT
Cmd:可以被覆盖

[root@server1 docker]# vim Dockerfile
FROM busybox
ENTRYPOINT ["/bin/echo", "hello"]
CMD ["world"]

Docker 容器与 swarm 集群实战——镜像的构建、优化_第8张图片

二、镜像的优化

1.httpd的封装

Docker 容器与 swarm 集群实战——镜像的构建、优化_第9张图片
用Dockerfile 搭建httpd

[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dev.repo
RUN rpmdb --rebuilddb && yum install -y httpd
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim dvd.repo
[dvd]
name=rhel7
baseurl=http://172.25.254.73/westos			#此处因为7.3的镜像挂载点在westos下
gpgcheck=0

开始封装镜像
[root@server1 docker]# docker build -t rhel7:v2 .
Docker 容器与 swarm 集群实战——镜像的构建、优化_第10张图片

[root@server1 docker]# docker run --name vm1 -d rhel7:v2
83b62d46299aeaa6062223621deb0e2ba49e9999a2d9f99278e825eaec4e947a

此时可以访问httpd的默认发布页
Docker 容器与 swarm 集群实战——镜像的构建、优化_第11张图片
Docker 容器与 swarm 集群实战——镜像的构建、优化_第12张图片
Volume的作用:
Docker 容器与 swarm 集群实战——镜像的构建、优化_第13张图片

如果将vm1删除卷仍然在,但未被利用
Docker 容器与 swarm 集群实战——镜像的构建、优化_第14张图片

2.nginx 的封装

[root@server1 docker]# ls
Dockerfile  dvd.repo  index.html  nginx-1.15.8.tar.gz
[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dev.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 ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

封装镜像,运行

[root@server1 docker]# docker build -t mynginx:v1 .
[root@server1 docker]# docker run --name vm1 -d mynginx:v1

Docker 容器与 swarm 集群实战——镜像的构建、优化_第15张图片

访问可以看到nginx的默认发布页面
Docker 容器与 swarm 集群实战——镜像的构建、优化_第16张图片

此时nginx是打开的,大小为289
Docker 容器与 swarm 集群实战——镜像的构建、优化_第17张图片

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

1.减少层数

[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dev.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 && ./configure --prefix=/usr/local/nginx && make && make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t mynginx:v2 .
Docker 容器与 swarm 集群实战——镜像的构建、优化_第18张图片

注意:此时层数被减少了;但是大小并没变

2.清理镜像构建的中间产物

[root@server1 docker]# vim Dockerfile 
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dev.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 && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.8
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t mynginx:v3 .
Docker 容器与 swarm 集群实战——镜像的构建、优化_第19张图片
关闭debug调式日志

[root@server1 docker]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dev.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
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

Docker 容器与 swarm 集群实战——镜像的构建、优化_第20张图片
[root@server1 docker]# docker build -t mynginx:v4 .

Docker 容器与 swarm 集群实战——镜像的构建、优化_第21张图片

3.多阶段构建镜像

[root@server1 docker]# vim Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dev.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
EXPOSE 80
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t mynginx:v5 .
Docker 容器与 swarm 集群实战——镜像的构建、优化_第22张图片

此时的nginx只有1M,但是基础镜像是140M
Docker 容器与 swarm 集群实战——镜像的构建、优化_第23张图片

4.基础镜像优化
服务在启动时实际上是读取一些动态库文件
以httpd为例(ldd查看服务启动需要的动态库文件)
Docker 容器与 swarm 集群实战——镜像的构建、优化_第24张图片

[root@server1 docker]# vim Dockerfile

Docker 容器与 swarm 集群实战——镜像的构建、优化_第25张图片

[root@server1 images]# docker load -i distroless.tar
[root@server1 docker]# docker build -t mynginx:v6 .

Docker 容器与 swarm 集群实战——镜像的构建、优化_第26张图片

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