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.messageclient
和 rabbitmq.producer
服务之间发送和接收数据。我错过了什么?
简而言之,每个容器的行为就像一台孤立的机器,localhost
容器中指的是其本地网络。两个容器之间的通信与具有各自 IP 地址的两台机器之间的通信相同。 docker-compose
默认情况下为所有容器创建桥接网络,因此您可以使用容器的名称连接到它们,并且 Docker 在内部为您进行地址转换。
不确定为什么要创建一个名为 rabbitmq_go_net
的新桥,但只连接到 rabbitmq
。您可以删除网络或向其添加另外两个容器。然后在您的 rabbitmq.messageclient
容器中,您可以使用 rabbitmq:5672
而不是 localhost:5672
连接 rabbitmq
容器,依此类推。
docket compose 网络参考资料:
如果你想在你的 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.messageclient
和 rabbitmq.producer
服务之间发送和接收数据。我错过了什么?
简而言之,每个容器的行为就像一台孤立的机器,localhost
容器中指的是其本地网络。两个容器之间的通信与具有各自 IP 地址的两台机器之间的通信相同。 docker-compose
默认情况下为所有容器创建桥接网络,因此您可以使用容器的名称连接到它们,并且 Docker 在内部为您进行地址转换。
不确定为什么要创建一个名为 rabbitmq_go_net
的新桥,但只连接到 rabbitmq
。您可以删除网络或向其添加另外两个容器。然后在您的 rabbitmq.messageclient
容器中,您可以使用 rabbitmq:5672
而不是 localhost:5672
连接 rabbitmq
容器,依此类推。
docket compose 网络参考资料:
如果你想在你的 compose 文件中与服务通信,你应该使用服务名称作为主机名。此外,“端口”部分用于将端口映射到主机,您不需要它来连接服务。