4
respostas

Erro rodar docker

Estou tendo este erro ao tentar rodar o docker do itemservice

PS C:\Users\maico\OneDrive\Documents\Alura\2461-microservices-dotnet> docker run -d -p 8080:80 itemservice:1.0
9c8e4df02874d6d04736bcc299ffc90e16f4ab35cabee5da86d606e82e2348aa
PS C:\Users\maico\OneDrive\Documents\Alura\2461-microservices-dotnet> docker logs 9c8e4df02874d6d04736bcc299ffc90e16f4ab35cabee5da86d606e82e2348aa
Unhandled exception. RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable
---> System.AggregateException: One or more errors occurred. (Connection failed)
---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed
---> System.Net.Sockets.SocketException (111): Connection refused
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at RabbitMQ.Client.Impl.TcpClientAdapter.ConnectAsync(String host, Int32 port)
at RabbitMQ.Client.Impl.TaskExtensions.TimeoutAfter(Task task, TimeSpan timeout)
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectOrFail(ITcpClient socket, AmqpTcpEndpoint endpoint, TimeSpan timeout)
--- End of inner exception stack trace ---
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectOrFail(ITcpClient socket, AmqpTcpEndpoint endpoint, TimeSpan timeout)
at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectUsingAddressFamily(AmqpTcpEndpoint endpoint, Func2 socketFactory, TimeSpan timeout, AddressFamily family) at RabbitMQ.Client.Impl.SocketFrameHandler.ConnectUsingIPv4(AmqpTcpEndpoint endpoint, Func2 socketFactory, TimeSpan timeout)
at RabbitMQ.Client.Impl.SocketFrameHandler..ctor(AmqpTcpEndpoint endpoint, Func2 socketFactory, TimeSpan connectionTimeout, TimeSpan readTimeout, TimeSpan writeTimeout) at RabbitMQ.Client.Framing.Impl.IProtocolExtensions.CreateFrameHandler(IProtocol protocol, AmqpTcpEndpoint endpoint, Func2 socketFactory, TimeSpan connectionTimeout, TimeSpan readTimeout, TimeSpan writeTimeout)
at RabbitMQ.Client.ConnectionFactory.CreateFrameHandler(AmqpTcpEndpoint endpoint)
at RabbitMQ.Client.EndpointResolverExtensions.SelectOne[T](IEndpointResolver resolver, Func2 selector) --- End of inner exception stack trace --- at RabbitMQ.Client.EndpointResolverExtensions.SelectOne[T](IEndpointResolver resolver, Func2 selector)
at RabbitMQ.Client.Framing.Impl.AutorecoveringConnection.Init(IEndpointResolver endpoints)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
--- End of inner exception stack trace ---
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(String clientProvidedName)
at RabbitMQ.Client.ConnectionFactory.CreateConnection()
at ItemService.AsyncDataServices.MessageBusSubscriber.IniciaRabbitMQ() in /app/AsyncDataServices/MessageBusSubscriber.cs:line 27
at ItemService.AsyncDataServices.MessageBusSubscriber..ctor(IConfiguration configuration, IProcessaEvento eventProcessor) in /app/AsyncDataServices/MessageBusSubscriber.cs:line 22
at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,

meus dockerfile é esse e appsettings
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT [ "dotnet", "ItemService.dll" ]

{
"RabbitMQHost": "rabbitmq-svc",
"RabbitMQPort": "5672"
}

4 respostas

Olá Maicon.
Tudo bem?
O erro que você está enfrentando indica que o seu serviço ItemService não conseguiu se conectar ao RabbitMQ.
A exceção RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable sugere que o container do ItemService não está conseguindo acessar o RabbitMQ através do endereço ou porta especificados.
Aqui estão algumas sugestões para resolver o problema:

1. Verificar o Nome do Serviço RabbitMQ

No seu arquivo appsettings.json, você está usando "RabbitMQHost": "rabbitmq-svc".
Isso implica que você espera que o RabbitMQ esteja acessível via o serviço com o nome rabbitmq-svc.
Isso funcionará apenas se o nome rabbitmq-svc for resolvido corretamente dentro do mesmo contexto de rede Docker (por exemplo, se o nome do serviço for esse mesmo no Docker Compose).
Se você estiver usando o Docker Compose, verifique se o nome do serviço do RabbitMQ está correto no arquivo docker-compose.yml.
Exemplo:

version: '3.8'
services:
  itemservice:
    image: itemservice:1.0
    build:
      context: .
    depends_on:
      - rabbitmq
    ports:
      - "8080:80"
  rabbitmq:
    image: "rabbitmq:management"
    ports:
      - "5672:5672"
      - "15672:15672"  # Interface de administração

2. Verificar a Rede Docker

Se você não estiver usando Docker Compose e estiver apenas executando containers Docker independentes, pode ser que o rabbitmq-svc não esteja acessível de dentro do container do ItemService.
Você pode tentar usar o IP do host ou nome do serviço para garantir que a conexão seja feita corretamente.

3. Verificar a Configuração do RabbitMQ

  • Certifique-se de que o RabbitMQ está em execução e ouvindo na porta 5672.
  • Você pode verificar isso com o comando:
    docker ps
    

Para garantir que o container do RabbitMQ esteja ativo.

4. Testar a Conexão com RabbitMQ

Dentro do container ItemService, tente fazer uma conexão simples com o RabbitMQ para ver se o problema é de rede ou configuração.
Você pode usar ferramentas como telnet ou nc para testar a conectividade.
Dentro do container do ItemService, execute:

telnet rabbitmq-svc 5672

Ou, se estiver no ambiente local:

telnet <IP_DO_HOST> 5672

5. Logs do RabbitMQ

Verifique os logs do RabbitMQ para ver se há alguma falha de configuração.
Você pode acessar os logs do RabbitMQ via a interface de administração (se estiver usando a versão com o plugin de management).
A interface do RabbitMQ geralmente fica disponível em http://localhost:15672, com o usuário e senha padrão sendo guest/guest.

6. Ajustar o Dockerfile

Se o ItemService precisa de variáveis de ambiente para se conectar ao RabbitMQ, você pode definir essas variáveis diretamente no Dockerfile ou no docker-compose.yml. Exemplo no Dockerfile:

ENV RabbitMQHost=rabbitmq-svc
ENV RabbitMQPort=5672

Ou no docker-compose.yml:

services:
  itemservice:
    build:
      context: .
    environment:
      - RabbitMQHost=rabbitmq-svc
      - RabbitMQPort=5672

Conclusão

Com base no erro, a causa mais provável é que o nome de host ou a rede entre os containers não está configurada corretamente.
Se você estiver usando Docker Compose, o nome do serviço do RabbitMQ no arquivo docker-compose.yml deve ser o mesmo que está configurado no appsettings.json.
Caso contrário, se estiver rodando containers isolados, verifique as configurações de rede e conectividade entre eles.

Faça os testes ai e me avise os resultados.
Bons estudos.

Aina não consegui executar, continua dando o mesmo erro. Não utilizei o docker compose por conta que o curso não esta usando tambem.

enfim ajustei o appSettings para o nome de serviço correto

{
"RabbitMQHost": "rabbitmq-svc",
"RabbitMQPort": "5672",
"RabbitMQUser": "guest",
"RabbitMQPassword": "guest"
}

tentei executar o comando telnet porem nao deu certo, não cosnegui executar dentro do container por conta que o erro faz o container parar de executar
PS C:\Users\maico\OneDrive\Documents\Alura\2461-microservices-dotnet\ItemService> telnet rabbitmq-svc 5672
Conectando-se a rabbitmq-svc...Não foi possível abrir conexão com host, na porta 5672: conexão falhou
PS C:\Users\maico\OneDrive\Documents\Alura\2461-microservices-dotnet\ItemService>

aqui o dockerfile do itemService

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT [ "dotnet", "ItemService.dll" ]

Aqui esta o repositorio do projeto
https://github.com/Maicon-Tomasi/ProjetoMicroservicosAlura

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá amigo.
Vamos tentar mais uma vez!
Aqui estão algumas possíveis causas e sugestões de como resolver:

1. Verificação da Rede Docker

O erro que você está encontrando com o telnet indica que o container do ItemService não está conseguindo alcançar o rabbitmq-svc na porta 5672. Quando você usa Docker sem docker-compose, é importante garantir que os containers estejam na mesma rede.

Solução:

  1. Verifique a rede dos containers. Se você não estiver usando docker-compose, pode ser necessário especificar explicitamente a rede ao executar seus containers.
    • Ao rodar o rabbitmq e o ItemService, certifique-se de que ambos estejam na mesma rede. Você pode criar uma rede Docker personalizada, como:

      docker network create my-network
      

      Depois, ao iniciar os containers, conecte-os à mesma rede:

      docker run -d --name rabbitmq --network my-network rabbitmq:management
      
      docker run -d --name itemservice --network my-network itemservice:latest
      

      Com isso, os containers itemservice e rabbitmq devem poder se comunicar usando o nome rabbitmq ou rabbitmq-svc, se estiverem na mesma rede.

2. Nome do Serviço e Host do RabbitMQ

No seu appsettings.json, você configurou RabbitMQHost para rabbitmq-svc. Mas esse nome deve ser resolvido corretamente. Se você não está utilizando o docker-compose, o nome do host rabbitmq-svc pode não ser resolvível dependendo de como o container está sendo executado.

Solução:

  • No Docker, você precisa garantir que o nome rabbitmq-svc seja o mesmo nome do container RabbitMQ ou, no caso de um container em rede, o nome do serviço.
  • Para o nome de host, você pode tentar alterar para rabbitmq, que é o nome do container. Isso pode ser feito diretamente no appsettings.json ou no código de configuração do RabbitMQ.

3. Verifique a Porta do RabbitMQ

Você também mencionou que está tentando se conectar à porta 5672, mas o RabbitMQ pode não estar escutando na porta correta ou a configuração pode não estar exposta corretamente.

Solução:

  • Verifique se o RabbitMQ está sendo executado e exposto corretamente na porta 5672. Para isso, você pode rodar o seguinte comando para ver os logs do container RabbitMQ:
    docker logs rabbitmq
    
    Verifique se há mensagens de erro ou informações sobre as portas expostas.
  • Se você não especificou a exposição da porta ao iniciar o container RabbitMQ, você precisará incluir a flag -p para mapear a porta:
    docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
    

4. Verifique o Estado do Container

Caso o ItemService esteja caindo rapidamente devido ao erro de conexão, você pode inspecionar os logs do container para ver a causa específica.

Solução:

  • Para ver os logs do container do ItemService, execute:
    docker logs itemservice
    
    Isso pode fornecer mais detalhes sobre o erro que está ocorrendo e pode ajudar a identificar se a aplicação falha devido à falta de conexão com o RabbitMQ.

5. Verifique a Configuração do RabbitMQ no Container

Se você estiver usando o RabbitMQ com a interface de gerenciamento (geralmente na porta 15672), verifique se você consegue acessar a interface web para garantir que o RabbitMQ está funcionando como esperado.

  • Acesse no navegador: http://localhost:15672
  • Logue com o usuário padrão: guest / guest

6. Testar a Conexão com RabbitMQ Dentro do Container

Como você mencionou que o container do ItemService está parando, talvez seja interessante tentar rodar um comando de telnet dentro do próprio container para tentar diagnosticar a falha de rede.

  1. Entre no container do ItemService com:
    docker exec -it itemservice /bin/bash
    
  2. Tente rodar o comando telnet ou ping dentro do container para ver se consegue alcançar o RabbitMQ.
    telnet rabbitmq 5672
    
    Ou, caso tenha o ping instalado:
    ping rabbitmq
    

Resumo

A principal coisa a verificar é se os containers estão na mesma rede Docker e se você está usando o nome correto para o serviço do RabbitMQ.
Se o ItemService não consegue se conectar, isso pode ser por causa da rede, do nome do host ou das portas não estarem corretamente expostas.
Experimente essas soluções e veja se alguma delas resolve o problema.

continua....

Pode haver conflitos de portas e containers antigos rodando em segundo plano, especialmente se você fez vários testes de docker run sem parar ou remover os containers anteriores.
Esses conflitos podem impedir que novas instâncias subam corretamente (por exemplo, erro de “port already in use” ou falha de conexão).
Vamos ver como fazer uma limpeza total e reiniciar o ambiente Docker do zero.

1. Parar todos os containers em execução

docker stop $(docker ps -q)

Isso para todos os containers em execução.

2. Remover todos os containers (inclusive parados)

docker rm $(docker ps -aq)

Remove todos os containers do sistema.

3. Remover todas as imagens (opcional, mas bom pra recomeçar limpo)

docker rmi -f $(docker images -q)

Remove todas as imagens baixadas/construídas.
Isso vai forçar o Docker a baixar novamente imagens como mcr.microsoft.com/dotnet:6.0, rabbitmq:management, etc.

4. Remover volumes (para limpar dados persistentes, ex: banco de dados, RabbitMQ)

Se quiser zerar tudo mesmo, inclusive dados do RabbitMQ, rode:

docker volume rm $(docker volume ls -q)

5. Remover redes personalizadas

Se você criou redes (como my-network), pode limpar também:

docker network rm $(docker network ls -q)

6. Reiniciar o Docker (recomendado)

Depois de limpar tudo:

  • No Windows:
    • Abra o Docker DesktopSettingsTroubleshoot → clique em Restart Docker Desktop
  • Ou pelo terminal:
    net stop com.docker.service
    net start com.docker.service
    
  • No Linux:
    sudo systemctl restart docker
    

RECRIAR O AMBIENTE LIMPO

Depois que estiver tudo limpo, siga estes passos:

  1. Crie uma rede nova:

    docker network create my-network
    
  2. Suba o RabbitMQ:

    docker run -d --name rabbitmq --network my-network -p 5672:5672 -p 15672:15672 rabbitmq:management
    
  3. Suba seu ItemService:

    docker build -t itemservice .
    docker run -d --name itemservice --network my-network itemservice
    
  4. Verifique os logs se ainda houver erros:

    docker logs itemservice
    

Dica: Verificar uso de portas

Antes de subir containers, veja se alguma porta está ocupada:

Windows PowerShell:

netstat -ano | findstr :5672

Linux/macOS:

sudo lsof -i :5672

Se aparecer algum processo, finalize-o (no Windows, com taskkill /PID <pid> /F).

Tenta ai essas opções e avisa os resultados.
Avise ai qualquer duvida.
Até...