为什么安装 NodeJS 时 Docker 要下载这么多?

为什么安装 NodeJS 时 Docker 要下载这么多?

我有一个简单的Dockerfile

FROM node:4.2.2
EXPOSE 8000

当我运行时docker build -t myapp .,它会显示下载内容的大小:

使用 Docker 安装 NodeJS

虽然 NodeJS 本身不超过 30Mb,但似乎大于 200Mb。还下载了什么?

答案1

Docker 会安装比应用程序本身更多的内容,因为 Docker 是一个容器解决方案,而不是像 apt 或 rpm 这样的包管理器。Docker 应该与 Xen、VMWare 或 VirtualBox 等全系统虚拟化进行比较。摘自 Docker 文档:

Docker 允许您将应用程序及其所有依赖项打包成标准化单元,以进行软件开发。

Docker 容器将软件包装在一个完整的文件系统中,其中包含运行所需的一切:代码、运行时、系统工具、系统库 - 您可以在服务器上安装的所有内容。这保证了无论在什么环境中运行,它始终以相同的方式运行。 来源

FROM node:4.2.2例如,将部署基于 Debian wheezy 的 docker 容器,它将为您提供基本的 Debian 环境。而要为您提供这个环境,Docker 需要安装的不仅仅是 nodejs。

如果你想知道具体安装了什么,你需要查看 Dockerfile 中包含的 Dockerfile。在本例中node:4.2.2。以下是github 仓库。您可以看到其中包含另一个 Dockercontainer buildpack-deps:wheezy。如果您查看该Dockerfile您可以看到这些包已安装:

    autoconf \
    automake \
    bzip2 \
    file \
    g++ \
    gcc \
    imagemagick \
    libbz2-dev \
    libc6-dev \
    libcurl4-openssl-dev \
    libevent-dev \
    libffi-dev \
    libgeoip-dev \
    libglib2.0-dev \
    libjpeg-dev \
    liblzma-dev \
    libmagickcore-dev \
    libmagickwand-dev \
    libmysqlclient-dev \
    libncurses-dev \
    libpng-dev \
    libpq-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libtool \
    libwebp-dev \
    libxml2-dev \
    libxslt-dev \
    libyaml-dev \
    make \
    patch \
    xz-utils \
    zlib1g-dev \

答案2

每个容器镜像都是分层构建的;如果你运行

docker history myapp

您将看到每一层的大小;正如另一个答案所说,其中的大部分可能位于层中debian

相关内容