首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使我的mysql码头集装箱可在另一个港口访问3306?

问如何使我的mysql码头集装箱可在另一个港口访问3306?
EN

Stack Overflow用户
提问于 2022-09-11 09:15:02
回答 2查看 149关注 0票数 1

我有一个码头组合,其中包含以下说明:

代码语言:javascript
复制
version: '3.8'
services:
  mysql-standalone:
    container_name: marqueblanchebd
    image: marqueblanchebd:latest
    ports: 
      - "3307:3306"
    volumes:
      - data:/var/lib/mysql
        
  spring-boot:
    image: testmb
    container_name: mbwebservice
    ports:
    - "8091:8080"
    build:
      context: .                          
      dockerfile: Dockerfile 
    depends_on:
      - mysql-standalone 
    environment:
      SPRING_DATASOURCE_PASSWORD: ramses2021
      SPRING_DATASOURCE_URL: jdbc:mysql://marqueblanchebd:3307/marque_blanche?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
    volumes:
      - ./:/uploads/deployment
volumes:
  data:

当我运行-compose时,在我的springboot项目中发生以下错误:由: java.net.ConnectException: Connection拒绝(连接拒绝)引起

但是,当我将默认的mysql端口3306 ("3306:3306")放入docker-组合文件中时,我的springboot项目成功地将自己连接到数据库容器。下面是我的mysql dockerfile:

代码语言:javascript
复制
FROM mysql:latest

EXPOSE 3307
ENV MYSQL_DATABASE=marque_blanche
ENV MYSQL_ROOT_PASSWORD=ramses2021
ADD marque_blanche.sql /docker-entrypoint-initdb.d
EN

回答 2

Stack Overflow用户

发布于 2022-09-11 10:16:06

在docker network内部,服务名marqueblanchebd将解析为容器IP。对于SPRING_DATASOURCE_URL=jdbc:mysql://marqueblanchebd:3307/...,连接尝试是对<container_ip>:3307进行的,但是数据库正在侦听端口3306,因此连接被拒绝。要使连接正常工作,您需要配置mysql服务以侦听端口3307而不是端口3306。通信量不会从docker network传输到主机,然后从主机传输回docker network。

我建议不要向主机公开数据库,您可以从mysql-standalone服务中删除mysql-standalone映射,例如:

代码语言:javascript
复制
services:
  mysql-standalone:
    container_name: 'marqueblanchebd'
    image: 'marqueblanchebd:latest'
    expose: 
      - '3306'
    volumes:
      - 'data:/var/lib/mysql'

..。并将spring-boot服务配置为使用默认的mysql-standalone服务端口:

代码语言:javascript
复制
  spring-boot:
    # ...
    environment:
      # ...
      SPRING_DATASOURCE_URL: jdbc:mysql://marqueblanchebd:3306/marque_blanche?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
      # ...

这将隔离docker network中的数据库。

票数 0
EN

Stack Overflow用户

发布于 2022-09-14 08:33:18

我会建议一个简单的方法来解决这个问题:

只需在mysql服务的文件中插入这一行:

代码语言:javascript
复制
environment:
  MYSQL_TCP_PORT: 3307 

正如在这个link中所说的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73678096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档