簡體   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