0

假设我有一个 docker-compose 文件,如下所示:

version: '2'
services:

  # The php-fpm container
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www

    expose:
      - 8003

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    links:
       - app:app

    ports:
      - 80:80
      - 8004:8003

所以我喜欢从 Web 容器中的 8004 端口为 App 容器上的 8003 端口提供服务。但我无法得到结果。所以我的猜测是 Web 容器上 8004:8003 的 Web 端口映射仅限于 Web 容器。还是它实际上映射到 App 容器上暴露的 8003 端口?

如果是这样,我如何测试 Web 端口 8004 实际上映射到 App 容器上的端口 8003?

有没有办法让我创建一个单向绑定(甚至更好的双向绑定)或将 App 容器上的端口 8003 映射到 Web 容器上的端口 8004?

如果我的主机正在运行一些 App 和 docker 服务(包括这两个容器),并且 App 正在尝试侦听 Web 容器中的端口 8004,他实际上是在与 App 容器通信。

4

1 回答 1

1

容器旨在使每个进程保持独立。每个进程/容器都有自己独立的网络堆栈

实现您所描述的从一个容器到另一个容器的“映射”的唯一方法是是否存在转发请求的用户空间进程。就像 Apache http 或 Nginx 将 HTTP 请求转发到 FastCGI PHP 进程一样。

对于调试,将端口直接映射到app容器。如果您无法连接,则app容器中的调试设置可能存在问题。

  # The php-fpm container
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - './:/var/www'
    ports:
      - '8003:8003'

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app    
    ports:
      - 80:80

顺便说一句,links版本 2+ 连接不需要。默认情况下,Compose 将创建一个用户定义的网络,该网络允许您的容器之间的访问。

于 2017-11-28T01:51:26.073 回答