gpt4 book ai didi

docker - Docker Compose文件中的网络

转载 作者:行者123 更新时间:2023-12-02 19:00:34 25 4
gpt4 key购买 nike

我正在为我的Web应用程序编写一个docker compose文件。如果我使用``链接''将服务彼此连接,是否还需要包含``端口''? “依赖”是“链接”的替代选项吗?彼此之间撰写文件时,哪种连接服务最佳?

最佳答案

对此的核心设置在Networking in Compose中进行了描述。如果绝对不执行任何操作,则一个服务可以使用docker-compose.yml文件中的名称作为主机名,使用容器内进程正在侦听的端口来调用另一个服务。

直到启动顺序问题为止,以下是一个最小的docker-compose.yml证明了这一点:

version: '3'
services:
server:
image: nginx
client:
image: busybox
command: wget -O- http://server/
# Hack to make the example actually work:
# command: sh -c 'sleep 1; wget -O- http://server/'

您根本不应该使用 links:。它是第一代Docker网络的重要组成部分,但在现代Docker上没有用。 (类似地,没有理由将 expose:放入Docker Compose文件中。)

您总是连接到容器内部正在运行的进程的端口。 ports:是可选的;如果您有 ports:,则跨容器调用始终连接到第二个端口号,并且重新映射没有任何效果。在上面的示例中,即使您将 client添加到 ports: ['12345:80']容器以使其可从其他端口从外部访问,但 server容器始终连接到默认的HTTP端口80。
depends_on:影响两件事。尝试将 depends_on: [server]添加到示例的 client容器中。如果您查看Compose在启动时会打印出来的“正在启动...”消息,这将迫使 serverclient开始启动之前就开始启动,但这不能保证 server已启动并正在运行并可以为请求服务(这是数据库容器非常普遍的问题)。如果您仅使用 docker-compose up client来启动堆栈的一部分,这也会导致 server以它开头。

一个更完整的典型示例如下所示:

version: '3'
services:
server:
# The Dockerfile COPYs static content into the image
build: ./server-based-on-nginx
ports:
- '12345:80'
client:
# The Dockerfile installs
# https://github.com/vishnubob/wait-for-it
build: ./client-based-on-busybox
# ENTRYPOINT and CMD will usually be in the Dockerfile
entrypoint: wait-for-it.sh server:80 --
command: wget -O- http://server/
depends_on:
- server

因此,在这个 Realm 中的问题似乎还有许多其他不必要的选择。 container_name:显式设置非Compose docker命令的容器名称,而不是让Compose选择它,并且它为网络目的提供了备用名称,但您实际上并不需要它。 hostname:影响容器的内部主机名(例如,您可能会在shell提示中看到的名称),但对其他容器没有影响。您可以手动创建 networks:,但是Compose为您提供了一个 default网络,没有理由不使用它。

关于docker - Docker Compose文件中的网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60755618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com