Docker新建的容器存储在哪里

Docker是当前最流行的容器化技术之一,它使得应用程序的打包、分发和部署变得更加简单和高效。但是,对于许多初学者而言,Docker的运行机制以及容器的存储位置常常产生疑问。本文将阐述Docker容器的存储结构、不同数据存储位置以及如何进行管理与查询。

Docker容器的存储位置

Docker容器的存储主要集中在Docker的默认目录:/var/lib/docker。这是Docker在Linux上运行时默认使用的存储路径。在这个路径下,Docker会存储镜像、容器、网络和卷等所有相关数据。Docker为每个容器和镜像创建一系列子目录,以组织相关文件。

存储结构

/var/lib/docker下,主要包含以下几个子目录:

  • overlay2:用于存放镜像的层,Docker使用OverlayFS以高效的方式管理容器文件系统。
  • containers:存储所有运行的容器的具体信息,如日志、配置信息等。
  • image:存储下载的镜像与其元数据。
  • volumes:用于存储Docker卷的数据,便于数据的持久化和共享。

使用ls命令可以查看这些目录的内容:

ls /var/lib/docker

如何查看容器存储

要查看特定容器的存储位置及文件,可以通过容器的ID找到相应的目录。可以使用以下命令获取容器ID:

docker ps -a

然后可以通过下面的命令找到与之相关的文件路径:

docker inspect <container_id>

在输出中,找到GraphDriver部分,该部分会显示存储驱动及其管理的文件路径。例如:

"GraphDriver": {
    "Data": {
        "Lower": [
            "/var/lib/docker/overlay2/abc1234/lower",
            ...
        ],
        ...
    },
    "Name": "overlay2"
}

Docker存储类型及使用

Docker支持多种存储类型,不同的存储类型会影响容器的数据管理方式。主要的存储类型包括:

  1. 容器文件系统:每个容器都有自己独特的文件系统,由其基础镜像的层和容器层构成。
  2. 数据卷:用于持久化和共享数据。卷被视为容器外部的存储,数据卷可以存在于主机上,也可以在多个容器之间共享。
  3. 绑定挂载:将主机的目录直接挂载到容器中,适合需要共享主机文件的场景。

创建和使用数据卷

创建数据卷非常简单,可以使用以下命令:

docker volume create my_volume

创建后,可以使用以下命令查看可用的卷:

docker volume ls

使用数据卷的示例

在创建数据卷后,可以在运行容器时使用该卷。例如:

docker run -d -v my_volume:/data --name my_container ubuntu

在这个示例中,我们将数据卷my_volume挂载到了容器内/data目录。任何在容器中/data目录下的文件都会存储在数据卷中,从而在容器删除后仍然可以访问。

代码示例

假设我们创建一个简单的Node.js应用并使用Docker来部署它,并将数据存储到数据卷中。首先,创建一个Dockerfile

# 使用Node.js的官方镜像
FROM node:14

# 创建应用目录
WORKDIR /usr/src/app

# 拷贝package.json和package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 拷贝源代码
COPY . .

# 暴露应用端口
EXPOSE 8080

# 启动应用
CMD ["node", "app.js"]

然后用下面的命令来构建镜像:

docker build -t my-node-app .

接下来,我们运行容器并挂载数据卷:

docker run -d -v my_volume:/usr/src/app/data --name my_node_container -p 8080:8080 my-node-app

这样,所有在应用运行过程中生成的数据将保存在my_volume中。

关系图示例

为了更好地理解Docker的存储结构,下面是一个关系图,展示了容器、镜像及数据卷之间的关系:

erDiagram
    CONTAINER ||--o{ IMAGE : uses
    IMAGE ||--|{ VOLUME : stores
    CONTAINER ||--|{ VOLUME : accesses

结论

了解Docker容器的存储机制是使用Docker的关键一步。无论是使用数据卷持久化数据,还是利用绑定挂载实现主机与容器之间的数据共享,掌握这些基本概念都能帮助开发者更高效地管理容器化应用。希望本文能帮助你更深入地了解Docker的存储结构以及如何在实践中灵活运用。