一. 选择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操作系统基础镜像开始构建,可以参考下表来选择合适的基础镜像:
Docker基础镜像操作系统基础镜像对比(参考官方文档),优化docker镜像

1. busybox

2. Alpine

  • 描述:Alpine是一个面向安全的、轻量级的Linux系统,基于musl libc和busybox。

  • 官网:https://www.alpinelinux.org/

  • 镜像:https://hub.docker.com/_/alpine/.

  • 包管理命令: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

4. Ubuntu

5. Debian

二.编程语言基础镜像

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进行本地代理,从而减少网络请求的问题。

相关文章:

  • 2021-08-21
  • 2022-01-08
  • 2021-12-10
  • 2022-01-21
  • 2021-08-14
  • 2021-07-05
  • 2022-12-23
猜你喜欢
  • 2021-06-19
  • 2021-08-01
  • 2022-12-23
  • 2021-09-22
  • 2021-06-16
  • 2021-12-01
  • 2021-04-10
相关资源
相似解决方案