首页 > 解决方案 > 如何解释 docker compose 文件中的数据库卷条目

问题描述

我正在设置我的第一个 postgresql docker 容器,作为使用 docker compose 的分布式应用程序的一部分,并且对 compose 文件的语法有些困惑。对 docker 来说还是很新的,所以如果这是直接从 docker 101 出来的,请原谅我。

这是我在 docker-compose.yml 中的 postgres 容器的样子:

version: '2'
services:
  database:
    image: postgres
    container_name: database-container-name
    environment:
      - POSTGRES_PASSWORD=some_password_here
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - PGDATA=/var/lib/postgresql/data/db-files/
    ports:
      - 5433:5432
    volumes:
      - ./.db/data:/var/lib/postgresql/data:delegated
      - ./.db/init:/docker-entrypoint-initdb.d

volumes一点让我陷入了循环。有人可以解释那里发生了什么,容器是否将其/.db/data/文件夹映射到我的本地/var/lib/postgresql/data文件夹?我查看了一些文档,但没有深入了解。

另外,在上面的端口部分,有什么处理5433:5432?这是否意味着我的端口 5433 映射到 docker 容器的端口 5432?如果是这样,这是否意味着如果我在我的盒子上的端口 5433 上连接到 psql 或 pgAdmin,它会默默地映射到 docker 容器中的 postgresql 实例?

标签: postgresqldockerdocker-compose

解决方案


卷位让我陷入了循环。有人可以解释那里发生了什么,容器是否将其 /.db/data/ 文件夹映射到我的本地 /var/lib/postgresql/data 文件夹?

volumes您的服务部分,您正在主机和容器之间database创建几个绑定挂载。每个卷条目的语法(在这种情况下)是HOST_PATH:CONTAINER_PATH:OPTIONS. 所以当你看到:

      - ./.db/data:/var/lib/postgresql/data:delegated

docker-compose.yml您正在将本地(到您的).db/data目录映射到/var/lib/postgresql/data容器中。换句话说,在一个目录中所做的更改将在另一个目录中可见。

delegated选项特定于 MacOS;文档说:

delegated: 容器运行时对挂载的看法是权威的。在容器中所做的更新在主机上可见之前可能会有延迟。

您的volume服务部分对应于以下-v选项docker rundocker run除了我上面链接的绑定安装文档之外,您可能会在文档中发现更有趣的内容。

另外,在上面的端口部分,5433:5432 是怎么回事?这是否意味着我的端口 5433 映射到 docker 容器的端口 5432?如果是这样,这是否意味着如果我在我的盒子上的端口 5433 上连接到 psql 或 pgAdmin,它会默默地映射到 docker 容器中的 postgresql 实例?

ports部分用于在您的主机上发布端口。语法是HOST_PORT:CONTAINER_PORT. 所以当你看到:

      - 5433:5432

这是将主机端口映射5433到容器端口5432。换句话说,您可以通过连接到5433主机上的端口来连接到您的 postgres 数据库。如果您的主机上已经运行了一个 postgres 实例,这可能是为了避免冲突,该实例已经绑定到端口 5432。


推荐阅读