使用Docker-Compose启动的容器无法相互连接

问题描述

我对Docker Compose有一个初学者的问题。我正在尝试从docker-compose-slim.yml example file扩展Zipkin GitHub repository

我需要对其进行更改,以便它可以包含我编写的一个简单的FastAPI应用程序。不幸的是,我无法使它们彼此连接。 FastAPI尝试将POST请求发送到Zipkin容​​器时会被拒绝,即使它们都使用YAML文件中定义的显式链接和端口映射连接到同一网络。但是,我可以从主机连接到这两个服务器。

能告诉我我做错了什么吗?

以下是错误消息:

Error emitting zipkin trace. ConnectionError(MaxRetryError("httpconnectionPool(host='127.0.0.1',port=9411): Max retries exceeded with url: /api/v2/spans (Caused by NewConnectionError('<urllib3.connection.httpconnection object at 0x7fce354711c0>: Failed to es
tablish a new connection: [Errno 111] **Connection refused**'))"))

这是Docker Compose YAML文件

version: '2.4'

services:
  zipkin:
    image: openzipkin/zipkin-slim
    container_name: zipkin
    environment:
      - STORAGE_TYPE=mem
    ports:
      # Port used for the Zipkin UI and HTTP Api
      - 9411:9411
    depends_on:
      - storage

  storage:
    image: busyBox:1.31.0
    container_name: fake_storage

  myfastapi:
    build: .
    ports:
      - 8000:8000
    links:
      - zipkin
    depends_on:
      - zipkin

  dependencies:
    image: busyBox:1.31.0
    container_name: fake_dependencies

networks:
  default:
    name: foo_network

这是Dockerfile:

FROM python:3.8.5
ADD . /app
workdir /app

RUN pip install -r requirements.txt

EXPOSE 8000
CMD ["uvicorn","wsgi:app","--host","0.0.0.0","--port","8000"]

解决方法

您必须告诉容器网络“ foo_network”。外部标志表示无法从外部访问容器。当然,您不必打赌,但是我认为举个例子可能很好。

由于“链接”功能,请看这里Link

version: '2.4'

services:
  zipkin:
    image: openzipkin/zipkin-slim
    container_name: zipkin
    environment:
      - STORAGE_TYPE=mem
    ports:
      # Port used for the Zipkin UI and HTTP Api
      - 9411:9411
    depends_on:
      - storage
    networks:
      - foo_network

  storage:
    image: busybox:1.31.0
    container_name: fake_storage
    networks:
      - foo_network

  myfastapi:
    build: .
    ports:
      - 8000:8000
    links:
      - zipkin
    depends_on:
      - zipkin
    networks:
      - foo_network

  dependencies:
    image: busybox:1.31.0
    container_name: fake_dependencies
    networks:
     - foo_network

networks:
  foo_network:
    external: false