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

運行容器
在這裏插入圖片描述
修改文件內容,會使用cache

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

在這裏插入圖片描述
Rmi:
刪除鏡像(當有佔用的時候底層的不允許被刪除)
在這裏插入圖片描述

  • 鏡像的構建Dockerfile常用指令
    在這裏插入圖片描述
    a.shell 格式和 exec 格式的比較

shell格式舉例:
修改內容:

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

在這裏插入圖片描述
注意:–rm表示運行後刪除

exec格式舉例:

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

在這裏插入圖片描述
注意:build封裝
此時不能正確引用變量

對格式進行修改:

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

在這裏插入圖片描述
b.CMD 和 ENTRYPOINT
Cmd:可以被覆蓋

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

在這裏插入圖片描述

二、鏡像的優化

1.httpd的封裝

在這裏插入圖片描述
用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 .
在這裏插入圖片描述

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

此時可以訪問httpd的默認發佈頁
在這裏插入圖片描述
在這裏插入圖片描述
Volume的作用:
在這裏插入圖片描述

如果將vm1刪除卷仍然在,但未被利用
在這裏插入圖片描述

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

在這裏插入圖片描述

訪問可以看到nginx的默認發佈頁面
在這裏插入圖片描述

此時nginx是打開的,大小爲289
在這裏插入圖片描述

鏡像的優化:
  • 選擇最精減的基礎鏡像
  • 減少鏡像的層數
  • 清理鏡像構建的中間產物
  • 注意優化網絡請求
  • 儘量去用構建緩存
  • 使用多階段構建鏡像

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 .
在這裏插入圖片描述

注意:此時層數被減少了;但是大小並沒變

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 .
在這裏插入圖片描述
關閉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;"]

在這裏插入圖片描述
[root@server1 docker]# docker build -t mynginx:v4 .

在這裏插入圖片描述

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 .
在這裏插入圖片描述

此時的nginx只有1M,但是基礎鏡像是140M
在這裏插入圖片描述

4.基礎鏡像優化
服務在啓動時實際上是讀取一些動態庫文件
以httpd爲例(ldd查看服務啓動需要的動態庫文件)
在這裏插入圖片描述

[root@server1 docker]# vim Dockerfile

在這裏插入圖片描述

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章