繁体   English   中英

如何使我的 mysql docker 容器可以在 3306 以外的另一个端口上访问?

[英]how to make my mysql docker container accessible on another port apart 3306?

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

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:

当我运行docker-compose时,我的 springboot 项目发生以下错误: 原因:java.net.ConnectException:连接被拒绝(连接被拒绝)

但是当我将默认的 mysql 端口 3306 ("3306:3306") 放入 docker-compose 文件时,我的 springboot 项目成功连接到我的数据库容器。 这是我的 mysql dockerfile:

FROM mysql:latest

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

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


我建议不要将数据库暴露给主机,您可以从mysql-standalone服务中删除ports映射,例如:

services:
  mysql-standalone:
    container_name: 'marqueblanchebd'
    image: 'marqueblanchebd:latest'
    expose: 
      - '3306'
    volumes:
      - 'data:/var/lib/mysql'

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

  spring-boot:
    # ...
    environment:
      # ...
      SPRING_DATASOURCE_URL: jdbc:mysql://marqueblanchebd:3306/marque_blanche?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
      # ...

这将隔离docker network内部的数据库。

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

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

environment:
  MYSQL_TCP_PORT: 3307 

正如此链接中所说

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM