請參考上篇博客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 .