Docker撰写。 networking。 Spring Boot和MySQL连接

我尝试将spring启动web应用程序连接到数据库容器。 而且我可以从网上ping db容器。 但是网页无法通过暴露的3307端口连接到数据库。 但我可以通过内部容器端口3306连接到数据库。项目非常简单。 什么可能是错的?

这是我的docker-compose.yml

version: '3' services: db: build: context: ./db dockerfile: Dockerfile image: db ports: - "3307:3306" volumes: - demo_volume:/var/lib/mysql networks: - my-backend web: build: context: ./web dockerfile: Dockerfile image: web depends_on: - db ports: - "18080:8080" networks: - my-backend environment: - DATABASE_HOST=db - DATABASE_USER=user - DATABASE_PASSWORD=password - DATABASE_NAME=demo - DATABASE_PORT=3307 - SPRING_PROFILES_ACTIVE=container - DEBUG=true volumes: demo_volume: driver: local networks: my-backend: driver: bridge 

这很简单。

我的application.yml为活动configuration文件 – 容器

 spring: profiles: container datasource: url: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?characterEncoding=UTF-8 username: ${DATABASE_USER} password: ${DATABASE_PASSWORD} driver-class-name: com.mysql.jdbc.Driver jpa: database-platform: org.hibernate.dialect.MySQLDialect 

也很简单

数据库Dockerfile

 FROM mysql:5.7 ENV MYSQL_ROOT_PASSWORD=admin ENV MYSQL_DATABASE=demo ENV MYSQL_USER=user ENV MYSQL_PASSWORD=password ADD dump.sql /docker-entrypoint-initdb.d/ 

网站Dockerfile

 FROM java:8-jre COPY ./web.jar /app/web.jar CMD ["java", "-jar", "/app/web.jar"] CMD ["java", "-Xmx200m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/web.jar"] 

你应该链接容器,使其工作。

 web: build: context: ./web dockerfile: Dockerfile image: web depends_on: - db ports: - "18080:8080" networks: - my-backend environment: - DATABASE_HOST=db - DATABASE_USER=user - DATABASE_PASSWORD=password - DATABASE_NAME=demo - DATABASE_PORT=3307 - SPRING_PROFILES_ACTIVE=container - DEBUG=true links: - db 

现在在您的Web容器/ etc / hosts应该有一个条目数据库容器

关于Docker文档,同一个桥接networking(用户定义的)中的所有容器都通过它们的内部端口进行通信。 这是与图像isolated_bridge_network解释

如果你希望你的容器应该可以从外部networking获得,你应该发布这个端口。 发布 – 意味着您应该将内部端口映射到外部环境。 请参阅图像published_ports_from_isolated_bridge_network