【问题标题】:Docker compose. Networks. Spring Boot and MySQL connection码头工人组成。网络。 Spring Boot 和 MySQL 连接
【发布时间】:2017-10-15 11:20:02
【问题描述】:

我尝试将 Spring Boot Web 应用程序连接到数据库容器。 我可以从 web ping db 容器。但是 web 无法通过暴露的 3307 端口连接到 db。但是我可以通过内部容器端口3306连接到db。项目非常简单。有什么问题?

这是我的 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 用于活动配置文件 - container

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

也很简单

db 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/

web 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"]

【问题讨论】:

  • dcoker 版本 Client: Version: 17.03.1-ce API version: 1.27 Go version: go1.7.5 Git commit: c6d412e Built: Tue Mar 28 00:40:02 2017 OS/Arch: darwin/amd64 Server: Version: 17.03.1-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: c6d412e Built: Fri Mar 24 00:00:50 2017 OS/Arch: linux/amd64 Experimental: true
  • iptables -t nat -L -n 的输出是什么?
  • @AlexKarshin iptables:找不到命令

标签: mysql spring docker docker-compose


【解决方案1】:

关于 Docker 文档,同一桥接网络(用户定义)中的所有容器都通过其内部端口进行通信。图片说明isolated_bridge_network

如果您希望您的容器可以从外部网络访问,您应该为此发布端口。发布 - 意味着您应该将内部端口映射到外部环境。见图片 published_ports_from_isolated_bridge_network

【讨论】:

    【解决方案2】:

    您应该链接容器以使其工作。

    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
    

    现在在您的网络容器 /etc/hosts 中应该有一个 db Container 条目

    【讨论】:

    • 很抱歉,但我不应该这样做。 link 已弃用声明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2020-05-05
    • 2017-11-13
    相关资源
    最近更新 更多