镜像的优化
原则:
- 选择最经简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去构建缓存
- 使用多阶段构建镜像
- 前提:保证镜像存在于本地
[root@server3 docker]# docker load -i rhel7.tar
[root@server3 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3556258649b2 2 weeks ago 64.2 MB
busybox latest db8ee88ad75f 3 weeks ago 1.22 MB
game2048 latest 19299002fdbe 2 years ago 55.5 MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140 MB
- 构建一个nginx镜像,查看大小为295MB
[root@server3 docker]# docker build -t nginx:v1 .
[root@server3 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 6baf2165c143 30 seconds ago 295 MB
ubuntu latest 3556258649b2 2 weeks ago 64.2 MB
busybox latest db8ee88ad75f 3 weeks ago 1.22 MB
game2048 latest 19299002fdbe 2 years ago 55.5 MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140 MB
实例:部署Nginx
- 第一次搭建
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
启动镜像
# 通过exec的方式
# nginx的启动方式
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
- 给镜像"瘦身":减少中间产物
[root@server3 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 d21df066fe46 5 seconds ago 272 MB
nginx v1 6baf2165c143 5 minutes ago 295 MB
ubuntu latest 3556258649b2 2 weeks ago 64.2 MB
busybox latest db8ee88ad75f 3 weeks ago 1.22 MB
game2048 latest 19299002fdbe 2 years ago 55.5 MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140 MB
[root@server3 docker]# cat dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel && yum clean all #清理yum缓存
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
RUN rm -rf /mnt/nginx-1.15.9 #删除原始编译路径
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
- 注意:一但改动 缓存就不能用了
- 给镜像"瘦身":减少镜像层数 #合并多个RUN
- 注意:修改了指令 哪怕是一个空格 缓存就不能用了 使用缓存可以加快镜像构建速度
[root@server3 docker]# docker build -t nginx:v3 .
[root@server3 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v3 49349f668909 33 seconds ago 253 MB
nginx v2 d21df066fe46 5 minutes ago 272 MB
nginx v1 6baf2165c143 11 minutes ago 295 MB
ubuntu latest 3556258649b2 2 weeks ago 64.2 MB
busybox latest db8ee88ad75f 3 weeks ago 1.22 MB
game2048 latest 19299002fdbe 2 years ago 55.5 MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140 MB
[root@server3 docker]# cat dockerfile
FROM rhel7
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.9
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
- 层数对比
[root@server3 docker]# docker history nginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
6baf2165c143 11 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/... 0 B
a0c55fb15186 11 minutes ago /bin/sh -c make install 3.86 MB
c2818114b626 11 minutes ago /bin/sh -c make 12.3 MB
42cfafda467f 12 minutes ago /bin/sh -c ./configure --prefix=/usr/local... 71.6 kB
b53295c86125 12 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0 B
3d39ff802d4d 12 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd... 6.2 MB
e45257d6ece4 12 minutes ago /bin/sh -c yum install -y gcc make pcre-de... 126 MB
3a812a20583c 12 minutes ago /bin/sh -c rpmdb --rebuilddb 6.64 MB
ca37225041bb 14 minutes ago /bin/sh -c #(nop) COPY file:45a94bb87479f6... 81 B
8c63445a8161 14 minutes ago /bin/sh -c #(nop) MAINTAINER dd@westos.org 0 B
0544c1ca4b61 14 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
0a3eb3fde7fd 5 years ago
[root@server3 docker]# docker history nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
d21df066fe46 6 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/... 0 B
84cef4bc300b 6 minutes ago /bin/sh -c rm -rf /mnt/nginx-1.15.9 0 B
9fd5173e4d04 6 minutes ago /bin/sh -c make install 3.86 MB
d8a1f114e45e 6 minutes ago /bin/sh -c make 12.3 MB
64d1ab9f3fef 6 minutes ago /bin/sh -c ./configure --prefix=/usr/local... 71.6 kB
b6380cfd1f52 6 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0 B
b1e894d7b421 6 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd... 6.2 MB
5a77bfb745f5 6 minutes ago /bin/sh -c yum install -y gcc make pcre-de... 102 MB
3a812a20583c 12 minutes ago /bin/sh -c rpmdb --rebuilddb 6.64 MB
ca37225041bb 14 minutes ago /bin/sh -c #(nop) COPY file:45a94bb87479f6... 81 B
8c63445a8161 14 minutes ago /bin/sh -c #(nop) MAINTAINER dd@westos.org 0 B
0544c1ca4b61 14 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
0a3eb3fde7fd 5 years ago
[root@server3 docker]# docker history nginx:v3
IMAGE CREATED CREATED BY SIZE COMMENT
49349f668909 About a minute ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/... 0 B
a181a5f0e37e About a minute ago /bin/sh -c rpmdb --rebuilddb && yum instal... 106 MB
89980b82160c About a minute ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0 B
2e72df71ca13 About a minute ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd... 6.2 MB
ca37225041bb 14 minutes ago /bin/sh -c #(nop) COPY file:45a94bb87479f6... 81 B
8c63445a8161 14 minutes ago /bin/sh -c #(nop) MAINTAINER dd@westos.org 0 B
0544c1ca4b61 14 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
0a3eb3fde7fd 5 years ago
多阶段构建镜像
比较优秀的方式(杀手锏)细看dockerfile 我们其实只需要编译好的nginx的二进制文件
[root@server3 docker]# docker build -t nginx:v4 . #很快:安装包完全使用缓存
[root@server3 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v4 b218a266197d 5 minutes ago 144MB
nginx v3 49349f668909 About an hour ago 253MB
nginx v2 d21df066fe46 About an hour ago 272MB
nginx v1 6baf2165c143 2 hours ago 295MB
ubuntu latest 3556258649b2 2 weeks ago 64.2MB
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
game2048 latest 19299002fdbe 2 years ago 55.5MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140MB
[root@server3 docker]# cat dockerfile
FROM rhel7:latest as build
EXPOSE 80
MAINTAINER dd@westos.org
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.9
- 以上只是一个桥梁
FROM rhel7:latest #基于rhel7的基础镜像
EXPOSE 80
MAINTAINER dd@westos.org
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx #从上一层的构建中拷贝
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
那我们有没有办法去减小基础镜像,谷歌为我们提供了非常精简的镜像
https://github.com/search?utf8=%E2%9C%93&q=distroless&type=
容器的分类
按用途容器大致可分为两类:服务类容器和工具类容器
- 服务类容器以daemon的形式运行,对外提供服务,比如web
server,数据库等,通过-d以后台方式启动这类容器是非常合适的,如果要排查问题,可以通过exec -it进入容器 - 工具类容器通常能给我们提供一个临时的工作环境,通常以run -it方式运行