docker - Docker Compose文件中的网络

标签 docker networking service hyperlink compose

我正在为我的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/

相关文章:

docker - 从Dockerfile构建Docker镜像:无法启动容器

html - 在apache2服务器上部署docker

linux - debian 8 iptables-持久

docker - docker 新手,想知道如何阅读 docker 的源代码?

docker - Kubernetes - 尝试使用 init 容器创建 pod

android - 在本地网络中发现嵌入式设备?

ios - 我正在尝试使用 Swift Codable 从 subreddit 解析 JSON。为什么我的对象返回零?

ios - 从循环中的 URL 下载图像以获取 Collection View

java - 有没有类似Java 1.5中的ServiceLoader的东西?

Android - 通过 put/getExtra 启动带有额外信息的服务