services:
main:
ports:
- 3002:3000
depends_on:
- main_db
networks:
- backend
main_db:
image: postgres:16
container_name: main_db
ports:
- 5432:5432
volumes:
- main_db_pgdata:/var/lib/postgresql/data
networks:
- backend
test:
ports:
- 3003:3000
depends_on:
- test_db
networks:
- backend
test_db:
image: postgres:16
container_name: test_db
ports:
- 5433:5432
volumes:
- test_db_pgdata:/var/lib/postgresql/data
networks:
- backend
volumes:
main_db_pgdata: {}
test_db_pgdata: {}
networks:
backend:
driver: bridge
这里是我的作品的脱衣舞版本。 我试图为每种服务做一个独特的内部端口,但是在尝试启动服务时,我总是遇到问题,数据库存在一些问题,所以我只是停下来。我什至不知道哪种方式,AI说了同样的话
如果您有某种服务器流程,它会在端口上听。 PostgreSQL Server在端口5432上听;典型的节点Express服务器在端口3000上听;等等。 Docker的内部网络层意味着您不需要重新配置服务器端口即可没有冲突(您的示例设置在5432和3000端口中都有两项在内部侦听的服务,这还可以)。
容器内部的过程必须在0.0.0.0(“所有接口”)上聆听,而不是127.0.0.1(“仅“仅容器 - 私人locivate localhost”)。
第二次必须与该进程使用的端口编号完全匹配。 您不能为此端口选择一个任意号码,通常不值得重新配置预制图像以选择其他端口。您始终使用服务的内部端口。
ports:
将服务的撰写服务名称作为主机名。 您无需设置ports:
。
如果您确实有
container_name:
,那么两个容器需要一个共同的网络。 但是,对于几乎所有撰写应用程序,正确的设置是删除所有blocks,然后让创建一个为您创建一个名为您的网络。
networks:
networks:
default
),并且端口号将是第一个DATABASE_URL
main_db:5432
,否则主机系统上的
localhost
文件将不会自动注入容器中。在您显示的设置中,您在同一组合文件中有两个单独的应用程序副本。 不过,撰写的概念是
因此,我可能会将撰写文件重写为:
ports:
我删除了不必要的
.env
和
env_file:
设置,并在您可能已经拥有的几个.env
version: '3.8' # not harmful, compatible with older versions of Compose tool, useful for documenting new Compose feature requirements
services:
app:
build: .
ports:
- ${APP_PORT:-3002}:3000
depends_on:
- db
environment:
DATABASE_URL: postgresql://user:passw0rd@db:5432/mydb
db:
image: postgres:16
volumes:
- db_pgdata:/var/lib/postgresql/data
environment: { ... }
volumes:
db_pgdata:
块中添加了。 这里只有一个设置的副本。您可以在端口3002(撰写文件的默认值)上运行此侦听的一本副本AS
networks:
在端口3003上收听第二份副本
container_name:
注意,在撰写文件中指定了build:
(对于基于撰写的设置非常具体),但相反,它在组合设置的两个副本上是相同的。