众所周知的“ Docker容器彼此看不见”的问题

时间:2019-03-22 10:03:55

标签: docker docker-compose

我检查了很多论坛条目(例如也在stackoverflow中),但是我仍然无法弄清楚我的docker-compose文件出了什么问题。

因此,当我启动应用程序(content-app)时,出现以下异常:

Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=content-database)(port=3306)(type=master) : Connection refused (Connection refused)

我的应用程序是一个尝试连接数据库的Spring Boot应用程序,JDBC URL是

url: jdbc:mariadb://content-database:3306/contentdb?autoReconnect=true

Spring Boot应用程序可以在本地正常运行(当不使用docker时)可以连接到本地mariadb。
因此,content-app容器看不到content-database容器。我读到,如果我指定一个网络并将容器分配给该网络,则它们应该能够相互连接。

当我连接到正在运行的content-app容器时,我可以远程登录到content-database

root@894628d7bdd9:/# telnet content-database 3306
Trying 172.28.0.3...
Connected to content-database.
Escape character is '^]'.
n
5.5.5-10.4.3-MariaDB-1:10.4.3+maria~bionip/4X@wW/�#_9<b[~)N.:ymysql_native_passwordConnection closed by foreign host.

我的docker-compose yaml文件:

version: '3.3'
networks: 
  net_content:
services:
  content-database:
    image: content-database:latest
    build:
      context: .
      dockerfile: ./database/Dockerfile 
    networks: 
    - net_content
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
  content-redis:
    image: content-redis:latest
    build:
      context: .
      dockerfile: ./redis/Dockerfile 
    networks: 
    - net_content
  content-app:
    image: content-app:latest
    build:
      context: .
      dockerfile: ./content/Dockerfile 
    networks: 
      - net_content
    depends_on:
    - "content-database"

请问有什么提示吗?
谢谢!

2 个答案:

答案 0 :(得分:0)

您必须在./database/Dockerfile的Dockerfile中公开正在监听内容数据库的端口。

答案 1 :(得分:0)

我猜MariaDB正在监听默认端口3307 ,这意味着您的应用程序也必须连接到该端口。我想是这种情况,因为您正在将容器的端口3307映射到“外部”。

更改连接字符串中的端口:

url: jdbc:mariadb://content-database:3307/contentdb?autoReconnect=true