Docker Compose 中的入站和出站流量

Inbound and Outbound traffic in Docker Compose

我有 3 张 docker 图片; rabbitmq,客户端和发布者图像。在不使用 docker 图像的情况下,三个服务在默认端口 5672.

上通信良好

下面是我的docker-compose.yml

version: '3.4'

services:
  rabbitmq.messageclient:
    image: ${DOCKER_REGISTRY-}rabbitmqmessageclient
    ports:
      - "5672" 
    build:
      context: .
      dockerfile: RabbitMQ.Client/Dockerfile

  rabbitmq.producer:
    image: ${DOCKER_REGISTRY-}rabbitmqproducer
    ports:
      - "5672"
    build:
      context: .
      dockerfile: RabbitMQ.Producer/Dockerfile
   
  rabbitmq:
    image: rabbitmq:3-management
    container_name: 'rabbitmq'
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/mnesia
      - ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
    networks:
      - rabbitmq_go_net

networks:
  rabbitmq_go_net:
    driver: bridge


我的客户

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["RabbitMQ.Client/RabbitMQ.MessageClient.csproj", "RabbitMQ.Client/"]
RUN dotnet restore "RabbitMQ.Client/RabbitMQ.MessageClient.csproj"
COPY . .
WORKDIR "/src/RabbitMQ.Client"
RUN dotnet build "RabbitMQ.MessageClient.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "RabbitMQ.MessageClient.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "RabbitMQ.MessageClient.dll"]

我的制片人

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["RabbitMQ.Producer/RabbitMQ.Producer.csproj", "RabbitMQ.Producer/"]
RUN dotnet restore "RabbitMQ.Producer/RabbitMQ.Producer.csproj"
COPY . .
WORKDIR "/src/RabbitMQ.Producer"
RUN dotnet build "RabbitMQ.Producer.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "RabbitMQ.Producer.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "RabbitMQ.Producer.dll"]

我的主机名是:localhost 我无法在 rabbitmq.messageclientrabbitmq.producer 服务之间发送和接收数据。我错过了什么?

简而言之,每个容器的行为就像一台孤立的机器,localhost容器中指的是其本地网络。两个容器之间的通信与具有各自 IP 地址的两台机器之间的通信相同。 docker-compose 默认情况下为所有容器创建桥接网络,因此您可以使用容器的名称连接到它们,并且 Docker 在内部为您进行地址转换。

不确定为什么要创建一个名为 rabbitmq_go_net 的新桥,但只连接到 rabbitmq。您可以删除网络或向其添加另外两个容器。然后在您的 rabbitmq.messageclient 容器中,您可以使用 rabbitmq:5672 而不是 localhost:5672 连接 rabbitmq 容器,依此类推。

docket compose 网络参考资料:

如果你想在你的 compose 文件中与服务通信,你应该使用服务名称作为主机名。此外,“端口”部分用于将端口映射到主机,您不需要它来连接服务。