文章目录
- 1. 镜像优化要求
-
- 1.1 直接建立
- 1.2 清理构建镜像中间产物
- 1.3 使用多阶段构建镜像
1. 镜像优化要求
要求:
- 选择最精简的镜像(重)
- 减少镜像层数
- 清理镜像构建的中间产物。
- 注意优化网络请求(提高构建速度)
- 尽量使用构建缓存
- 使用多阶构建镜像(重)
1.1 直接建立
1)创建dockerfile:部署一个nginx镜像
[[email protected] docker]# vim dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
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
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)编写yum文件:
[[email protected] docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.5.250/rhel7.3
gpgcheck=0
3)建立镜像:
[[email protected] docker]# docker build -t nginx-song:v1
Rpmdb checksum is invalid: dCDPT(pkg checksums): zlib-devel.x86_64 0:1.2.7-17.el7 - u
# 出现错误。
4)修改文件:
FROM rhel7
EXPOSE 80
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
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
5)再次构建:构建成功
[[email protected] docker]# docker build -t nginx-song:v1 .
Sending build context to Docker daemon 148.1MB
………………
Successfully built 19d878c879ee
Successfully tagged nginx-song:v1
6)查看镜像大小:296M
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v1 19d878c879ee 2 minutes ago 296MB
1.2 清理构建镜像中间产物
1)修改dockerfile:将多run合并,解决依赖后清空yum仓库,安装完成后删除安装目录:
FROM rhel7
EXPOSE 80
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 -fr /mnt/nginx-1.15.9
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)构建镜像:
[[email protected] docker]# docker build -t nginx-song:v2 .
Successfully built d4a998a59401
Successfully tagged nginx-song:v2
3)查看镜像大小:
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v2 d4a998a59401 17 seconds ago 253MB
nginx-song v1 19d878c879ee 11 minutes ago 296MB
4)查看v1与v2的层数:v2比v1明显减少
[[email protected] docker]# docker history nginx-song:v1
IMAGE CREATED CREATED BY SIZE COMMENT
19d878c879ee 14 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
e029e309a7fb 14 minutes ago /bin/sh -c make install 3.86MB
9d5168b30df3 14 minutes ago /bin/sh -c make 12.3MB
9f64c46c3301 14 minutes ago /bin/sh -c ./configure --prefix=/usr/local/n… 71.6kB
124b3f3ae5b3 14 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0B
2010ad9b58e9 14 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd64… 6.2MB
97d38ee8f246 14 minutes ago /bin/sh -c yum install -y gcc make pcre-deve… 126MB
a9e3c381542b 15 minutes ago /bin/sh -c rpmdb --rebuilddb 6.64MB
e7ac104affae 17 minutes ago /bin/sh -c #(nop) COPY file:cdc4ff92626da754… 66B
3388ca3e91fd 17 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from
[[email protected] docker]# docker history nginx-song:v2
IMAGE CREATED CREATED BY SIZE COMMENT
d4a998a59401 3 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
39f5803f66ea 3 minutes ago /bin/sh -c rpmdb --rebuilddb && yum install … 106MB
c613223d72b9 4 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0B
ef3f55eddaef 4 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd64… 6.2MB
e7ac104affae 18 minutes ago /bin/sh -c #(nop) COPY file:cdc4ff92626da754… 66B
3388ca3e91fd 18 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from -
1.3 使用多阶段构建镜像
其实我们需要的是最终编译的二进制程序:
1)修改dockerfile:
FROM rhel7 as build
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 -fr /mnt/nginx-1.15.9
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)再次构建:
[[email protected] docker]# docker build -t nginx-song:v3 .
Sending build context to Docker daemon 148.1MB
Step 1/11 : FROM rhel7 as build
---> 0a3eb3fde7fd
Step 2/11 : EXPOSE 80
---> Using cache
---> 3388ca3e91fd
Step 3/11 : COPY dvd.repo /etc/yum.repos.d/
---> Using cache
---> e7ac104affae
Step 4/11 : ADD nginx-1.15.9.tar.gz /mnt
---> Using cache
---> ef3f55eddaef
Step 5/11 : WORKDIR /mnt/nginx-1.15.9
---> Using cache
---> c613223d72b9
Step 6/11 : RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.9
---> Using cache
---> 39f5803f66ea
Step 7/11 : FROM rhel7
---> 0a3eb3fde7fd
Step 8/11 : EXPOSE 80
---> Using cache
---> 3388ca3e91fd
Step 9/11 : VOLUME ["/usr/local/nginx/html"]
---> Running in ea8a05e01b8e
Removing intermediate container ea8a05e01b8e
---> f673946d83bd
Step 10/11 : COPY --from=build /usr/local/nginx /usr/local/nginx
---> 8e8912902f04
Step 11/11 : CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
---> Running in 5a12b5ad7daa
Removing intermediate container 5a12b5ad7daa
---> b73caec5d60e
Successfully built b73caec5d60e
Successfully tagged nginx-song:v3
3)查看大小:
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v3 b73caec5d60e 57 seconds ago 144MB
nginx-song v2 d4a998a59401 12 minutes ago 253MB
nginx-song v1 19d878c879ee 24 minutes ago 296MB
4)查看镜像层:更少了
[[email protected] docker]# docker history nginx-song:v3
IMAGE CREATED CREATED BY SIZE COMMENT
b73caec5d60e About a minute ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
8e8912902f04 About a minute ago /bin/sh -c #(nop) COPY dir:291cafd9a03367f03… 3.86MB
f673946d83bd 2 minutes ago /bin/sh -c #(nop) VOLUME [/usr/local/nginx/… 0B
3388ca3e91fd 28 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from -
选择精简镜像层,就能更好的优化容器。