【问题标题】:Unable to Connect MySQL container to Tomcat Container in docker无法将 MySQL 容器连接到 docker 中的 Tomcat 容器
【发布时间】:2016-06-01 08:38:44
【问题描述】:

计划

我希望我的 tomcat 服务器能够在单独的容器中连接到我的 MySQL 服务器。

问题

Tomcat 无法连接到 MySQL

我使用了wordpress tutorial 中关于设置与 mysql 容器的链接的一些详细信息,并创建了指向 MySQL 的链接。

虽然 tomcat 和 mysql 启动得很好,但我似乎无法让 tomcat 能够连接到 MySQL,但这些设置在我的本地机器上运行得很好。

我也尝试过使用--net: "host",尽管这不适用于 Tomcat,因为它会引发严重错误。

以前的答案

noticed on this post a load 可能会修复该错误,但我认为这些都不会转化为我的问题,因为我相信这是一个 docker 问题而不是主机问题。

docker-compose.yml

web:
  image: tomcat:7.0
  container_name: tomcat-container
  ports:
   - "80:8080"
  hostname: docker-tomcat
  volumes:
   - /home/webapps:/usr/local/tomcat/webapps
  links:
   - db
db:
  image: mysql
  container_name: mysql-container
  environment:
   MYSQL_ROOT_PASSWORD: Mysqlpassword1
   MYSQL_DATABASE: tracker
  volumes:
   - /home/mysqlDB:/var/lib/mysql

这是我的Context.xml from tomcat.

<Context>
    <Resource
        name="jdbc/tracker" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" 
        url="jdbc:mysql://localhost:3306/tracker?useSSL=false"
        driverClassName="com.mysql.jdbc.Driver"
        username="root" password="mysqladmin1"
    />
    <Resource
        name="jdbc/jenkins" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" 
        url="jdbc:mysql://localhost:3306/jenkins?useSSL=false"
        driverClassName="com.mysql.jdbc.Driver"
        username="root" password="mysqladmin1"
    />
</Context>

错误代码。

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at databaseConnections.SQLDatabaseConnection.tableExists(SQLDatabaseConnection.java:131)
at databaseConnections.JiraSQLDatabaseConnection.<init>(JiraSQLDatabaseConnection.java:50)

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    如果您使用的容器已经在运行或使用单独的 DockerFile 运行,那么您可能需要考虑使用

    external_links:
      -  mysql-container:db
    

    请注意,名称 mysql-container 是您的容器的名称。如果您不知道名称或没有在docker-compose.yml 中指定名称,您也可以通过运行找到它

    docker ps
    

    带有NAMES 的列是您在外部链接中需要的列。在: 之后的db 只是一个别名,它可以是你想要的任何东西。这将是您的主机名。例如,如果在对数据库进行 docker 化之前,您的主机是 localhost,那么您现在必须将其更改为 db

    最后,您还必须确保两个容器在同一个网络中运行。您可以通过创建一个新网络来做到这一点:

    docker network create --driver=bridge my-network
    

    然后在两个容器的docker-compose.yml内,在与service相同的缩进级别添加如下网络配置

    networks:
      default:
        external:
          name: my-network
    

    【讨论】:

      【解决方案2】:

      当您将 db 链接为“db”时,您不能使用 localhost 来加入您的数据库。你应该“分贝”

      jdbc:mysql://db:3306/tracker?useSSL=false
      

      在您的容器中,localhost 设计您的 tomcat 容器,而不是您的主机。 MySQL 容器有自己的网络。

      另外,如果你不喜欢“db”这个名字,你可以用不同的名字来命名链接

      例如:

       links:
         - db:container-mysql
      

      在这种情况下,在你的 tomcat 容器中,你可以使用

      jdbc:mysql://container-mysql:3306/tracker?useSSL=false
      

      【讨论】:

      • 是否可以执行- db:localhost 之类的操作,这样我就不需要将其从开发设置更改为部署设置?否则非常感谢,我会尽快尝试。
      • 我从不尝试使用本地主机。我认为 localhost 是一个关键字。你可以试试,也许 localhost 会起作用,但我认为你不应该。
      • 事实上,我认为你仍然应该在你的docker和你的计算机上使用“my-mysql-server”,并在你的计算机上更改以将此条目添加到本地dns(/etc/hosts )
      • 感谢您的回复。尽管现在我有另一个问题[Note] Access denied for user 'root'@'172.17.0.3' (using password: YES) ,尽管我已经授予了所有 priv。 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION 知道为什么吗?
      • @gbenroscience 我真的不记得了,我很害怕。我想我刚刚制作了两个单独的文件。一个用于本地开发,一个用于远程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2020-07-29
      • 1970-01-01
      • 2016-04-26
      • 2016-07-22
      • 2017-08-10
      • 2019-09-27
      相关资源
      最近更新 更多