Docker Compose容器无法相互通信

huangapple go评论88阅读模式
英文:

Docker Compose containers can't communicate with each other

问题

如何在使用Docker和Docker Compose部署时,解决Spring Boot应用程序、RabbitMQ和MySQL之间的通信问题以及后端应用程序持续重启且无法与RabbitMQ和MySQL建立通信的故障?

Dockerfile:

  1. FROM openjdk:17-alpine
  2. ADD target/*.jar app.jar
  3. ENTRYPOINT ["java","-jar","/app.jar"]

Docker Compose:

  1. version: "3.9"
  2. networks:
  3. net:
  4. driver: bridge
  5. services:
  6. thermostat-app:
  7. image: myapp
  8. build: .
  9. restart: always
  10. ports:
  11. - "8080:8080"
  12. environment:
  13. MYSQL_USER: root
  14. MYSQL_PASSWORD: password
  15. MYSQL_PORT: 3306
  16. networks:
  17. - net
  18. rabbitmq:
  19. image: rabbitmq:3.9.11-management-alpine
  20. container_name: rabbitmq
  21. networks:
  22. - net
  23. db:
  24. image: mysql:latest
  25. command: --default-authentication-plugin=mysql_native_password
  26. restart: always
  27. environment:
  28. MYSQL_ROOT_PASSWORD: password
  29. MYSQL_DATABASE: mysqldb
  30. networks:
  31. - net

application.properties:

  1. spring.datasource.url=jdbc:mysql://db:${MYSQL_PORT:3306}/thermostat
  2. spring.datasource.username=${MYSQL_USER:root}
  3. spring.datasource.password=${MYSQL_PASSWORD:password}
  4. spring.jpa.hibernate.ddl-auto=create
  5. spring.jpa.show-sql=true
  6. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
  7. spring.rabbitmq.host=localhost
  8. spring.rabbitmq.port=5672
  9. spring.rabbitmq.username=guest
  10. spring.rabbitmq.password=guest
英文:

How can I troubleshoot communication issues between my Spring Boot application, RabbitMQ, and MySQL when using Docker and Docker Compose for deployment, as my back-end application keeps restarting and fails to establish communication with RabbitMQ and MySQL?

Dockerfile:

<!-- language: lang-docker -->

  1. FROM openjdk:17-alpine
  2. ADD target/*.jar app.jar
  3. ENTRYPOINT [&quot;java&quot;,&quot;-jar&quot;,&quot;/app.jar&quot;]

Docker compose:

<!-- language: lang-yaml -->

  1. version: &quot;3.9&quot;
  2. networks:
  3. net:
  4. driver: bridge
  5. services:
  6. thermostat-app:
  7. image: myapp
  8. build: .
  9. restart: always
  10. ports:
  11. - &quot;8080:8080&quot;
  12. environment:
  13. MYSQL_USER: root
  14. MYSQL_PASSWORD: password
  15. MYSQL_PORT: 3306
  16. networks:
  17. - net
  18. rabbitmq:
  19. image: rabbitmq:3.9.11-management-alpine
  20. container_name: rabbitmq
  21. networks:
  22. - net
  23. db:
  24. image: mysql:latest
  25. command: --default-authentication-plugin=mysql_native_password
  26. restart: always
  27. environment:
  28. MYSQL_ROOT_PASSWORD: password
  29. MYSQL_DATABASE: mysqldb
  30. networks:
  31. - net

application.properties:

<!-- language: lang-properties -->

  1. spring.datasource.url=jdbc:mysql://db:${MYSQL_PORT:3306}/thermostat
  2. spring.datasource.username=${MYSQL_USER:root}
  3. spring.datasource.password=${MYSQL_PASSWORD:password}
  4. spring.jpa.hibernate.ddl-auto=create
  5. spring.jpa.show-sql=true
  6. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
  7. spring.rabbitmq.host=localhost
  8. spring.rabbitmq.port=5672
  9. spring.rabbitmq.username=guest
  10. spring.rabbitmq.password=guest

答案1

得分: 1

在容器中,localhost 意味着容器本身。同一Docker网络上的容器可以使用其服务名称作为主机名相互访问。

您已经在数据源URL中完成了这一操作,使用了 db 作为主机名。

您还需要对RabbitMQ进行同样的操作,并将

  1. spring.rabbitmq.host=localhost

更改为

  1. spring.rabbitmq.host=rabbitmq
英文:

In a container, localhost means the container itself. Containers on the same docker network can address each other using their service names as host names.

You've done that with the datasource URL, where you've used db as the host name.

You need to do it for RabbitMQ as well and change

  1. spring.rabbitmq.host=localhost

to

  1. spring.rabbitmq.host=rabbitmq

huangapple
  • 本文由 发表于 2023年4月11日 15:09:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/75983266.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定