目录:
一. 选择Docker基础镜像
- 因为Docker镜像是基于基础镜像来构建的,因此选择的基础镜像越高级,我们要做的底层工作就越少。
- 比如,如果构建一个Java应用的镜像,选择一个openjdk的镜像作为基础镜像比选择一个alpine镜像作为基础镜像要简单地多。
镜像官网:
- Docker镜像官网(Docker Hub): https://hub.docker.com
- 阿里云容器Hub:https://dev.aliyun.com
- Google镜像(gcr.io):https://console.cloud.google.com/gcr/images/google-containers/GLOBAL
(需要科学上网,主要为Kubernetes相关镜像)
操作系统基础镜像
比如你要从Linux操作系统基础镜像开始构建,可以参考下表来选择合适的基础镜像:
1. busybox
-
描述:可以将busybox理解为一个超级简化版嵌入式Linux系统。
-
包管理命令:apk, lbu
-
包管理文档:https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
2. Alpine
-
描述:Alpine是一个面向安全的、轻量级的Linux系统,基于musl libc和busybox。
-
包管理命令:apk, lbu
-
包管理文档:https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
-
Alpine 是一个小但功能全的基础镜像 。Alpine采用了 musl libc和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox又完善的多,Alpine 还提供了自己的包管理工具 `apk,可以方便地安装、删除、更新软件。广泛应用于Docker容器中。
-
AlpineDocker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker镜像,它的容量只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。
-
Alpine 的软件包数量比很多流行的发行版要少得多。根据实际业务需求来选择基础镜像
3. CentOS
-
描述:可以理解CentOS是RedHat的社区版
-
包管理命令:yum, rpm
4. Ubuntu
-
描述:另一个非常出色的Linux发行版
-
包管理命令:apt-get, dpkg
5. Debian
-
描述:另一个非常出色的Linux发行版
-
包管理命令:apt-get, dpkg
二.编程语言基础镜像
Java基础镜像
- https://hub.docker.com/_/java/ (Deprecated)
- https://hub.docker.com/_/openjdk/
- 由于Oracle JDK license问题,Docker官方的Java基础镜像使用的是OpenJDK而不是Oracle JDK。
Python基础镜像
- https://hub.docker.com/_/python/
NodeJs基础镜像
- https://hub.docker.com/_/node/
应用基础镜像
Nginx基础镜像
- https://hub.docker.com/_/nginx/
Tomcat基础镜像
- https://hub.docker.com/_/tomcat/
Jetty基础镜像
- https://hub.docker.com/_/jetty/
其它基础镜像例子
Maven基础镜像
- https://hub.docker.com/_/maven/
Jenkins基础镜像
- https://hub.docker.com/r/jenkins/jenkins/
GitLab基础镜像
- https://hub.docker.com/r/gitlab/gitlab-ce/
三. 优化docker镜像
1. 把run命令进行组合,都写到一行
- 合并dockerfile中可合并的指令,减少最终生成镜像的层数。
- 因为docker镜像制作是一层一层构建的,一条语句就会创建一个新层。层数越多,体积越大。所以减少语句即会减小镜像体积,可以用 “&&”
将多条命令连接起来
2 .清除缓存和临时文件
- 在镜像构建过程中,可能会适用apt-get或yum等方式进行包的安装,在完成后系统会残留一些不必要的文件,或者适用源代码进行编译某些应用时,源代码文件夹将会存放在镜像中,在镜像构建的最后步骤,可以将这些不必要的文件进行删除。
3. 镜像服务化
- 当有多个服务时,分开多个镜像去运行这些服务,各司其职,例如在同一个镜像中打包了Apache
httpd、MySQL、PHP,这无疑造成该镜像耦合性太差且体积臃肿。建议采用不同的镜像去托管不同的应用。
4. 删除构建目录额外的文件
- 在构建镜像时将会上传构建文件夹中的所有文件,但有时不是全部的文件都是构建所需的,可以通过.dockerignore文件进行过滤,这将提高构建的速度及镜像的大小。
5.优化网络请求
- 在构建镜像过程中,可能有指令需要使用网络去实现下载、安装等操作,由于网络的不确定性,可能会造成构建过程较久,而且构建的时间不一等问题,建议采用本地化引用网络资源来解决问题,例如Centos使用yum进行软件包的管理时,可以通过Nexus进行本地代理,从而减少网络请求的问题。