如何从 docker 容器连接到远程 mysql 托管?

Posted

技术标签:

【中文标题】如何从 docker 容器连接到远程 mysql 托管?【英文标题】:How to connect to a remote mysql hosting from docker container? 【发布时间】:2021-06-05 04:29:16 【问题描述】:

我有一个远程 mysql 主机。

我已经创建了一个简单的 Spring Boot 应用程序。

我已经创建了这个项目的 .jar 文件。

我已经从这个 app.jar 创建了一个 docker 镜像

我创建了一个使用此托管的容器。一切正常,但问题是

它使用我的配置文件中提供的参数。

与类文件中提供的参数一起使用它可以正常工作:

docker run  --name app1 -p 8000:8080 app-image:v1

我需要做的是连接到我创建容器时提供的随机主机,而不是链接(或耦合)到这个特定的服务器。

步骤如下:

1.- Dockerfile

FROM openjdk:8
VOLUME /tmp
EXPOSE 8080:8080
ADD ./target/app-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

2.- 创建图像

docker build -t app-image:v1 . 

3.- 创建一个容器

docker run  --name app1 -p 8000:8080 app-image:v1

工作正常,但使用 DatasourceConfig 中的参数

4.- 我在spring boot app(v2.4.3)中的配置是这样的:

@Configuration
public class DatasourceConfig 
    @Bean
    public DataSource datasource() 
        return DataSourceBuilder.create()
          .driverClassName("com.mysql.cj.jdbc.Driver")
          .url("jdbc:mysql://mysql-remote.net:8192/test-database")
          .username("root")
          .password("q")
          .build(); 
    

我尝试了几个选项来覆盖默认选项,如下所示:

docker run  --name app1 -p 8001:8080 -e MYSQL_USER=root -e MYSQL_PASSWORD=q  -e MYSQL_DATABASE=jdbc:mysql://mysql-remote.net:8192/test-database app-image:v1

但我明白了:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

有什么建议吗?

谢谢

更新 1: 在本地工作我使用这个配置:

 @Bean
    public DataSource datasource() 
        return DataSourceBuilder.create()
          .driverClassName("com.mysql.cj.jdbc.Driver")
          .url("jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false")
          .username("root")
          .password("q")
          .build(); 
    

我使用此配置创建 docker 映像。据我所知,传递参数应该覆盖这个配置,但没办法。

我用过 Ashok 写的,但是没用。

更新 2(已解决)

在 DatasourceConfig 中添加此代码,使用默认值在本地工作:

    @Value("$custom.property.url:jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false")
    String url;

    @Value("$custom.property.username:root")
    String username;

    @Value("$custom.property.password:q")
    String password;
    
    @Bean
    public DataSource datasource() 
        return DataSourceBuilder.create()
          .driverClassName("com.mysql.cj.jdbc.Driver")
          .url(url)
          .username(username)
          .password(password)
          .build(); 
    

稍后我像往常一样创建图像并像这样运行容器(覆盖参数并从我的 docker 容器连接到外部 mysql 托管)。我用几个容器测试了这个应用程序,效果很好!!

docker run --name app1 -p 8001:8080 -e custom.property.username=root -e custom.property.password=q  -e custom.property.url=jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false app-image:v1

谢谢你的帮助!!

【问题讨论】:

为什么你有这个类DatasourceConfig而不使用默认? 为什么要构建自己的数据源?为什么不使用 JPA 和 env 设置? Spring Boot 2.4.3 版本中的 application.properties 不工作,原因 【参考方案1】:

应该是:SPRING_DATASOURCE_URLMYSQL_USERMYSQL_ROOT_PASSWORD

【讨论】:

【参考方案2】:
docker run  --name app1 -p 8001:8080 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=q  -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-remote.net:8192/test-database app-image:v1

【讨论】:

您能否为您的代码添加一些解释? Code-only answers may fall under 'Very Low Quality' ...and are candidates for deletion....We've always touted that we aren't a code factory. We are the people who teach others to fish. Code-only answers only feed a person for a day 如果你想删除它【参考方案3】:

尝试以下配置

Docker/Linux 终端:

docker run --name dreamsql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=mypwd \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=<Password> \
-e MYSQL_DATABASE=mydata \
-d mysql:5.7

Windows CMD 提示:

docker run --name dreamsql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypwd -e MYSQL_USER=myuser -e MYSQL_PASSWORD=<Password> -e MYSQL_DATABASE=mydata -d mysql:5.7

CHECK_BELOW 应根据您的要求替换为以下之一:

docker 桌面的本地主机

192.168.99.100 用于 docker 工具箱

远程 MySQL 实例的 IP 地址

"jdbc:mysql://:3306/mydata"

注意:用户名 (MYSQL_USER):myuser 和密码 (MYSQL_PASSWORD) 用于 MySQL docker 命令

【讨论】:

以上是关于如何从 docker 容器连接到远程 mysql 托管?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 docker 容器中的 python 脚本连接到 localhost 上的 mysql 数据库

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?

如何将我的 docker 连接到远程数据库?

如何通过 JMX 连接到远程 Docker 容器

从 docker 主机外部远程连接到在 docker 容器上运行的 oracle 数据库

如何连接到在 docker 容器上运行的远程 Jupyter Notebook?