【问题标题】:Docker container and mysql container connection errorDocker容器和mysql容器连接错误
【发布时间】:2020-08-18 14:18:57
【问题描述】:

我是 docker 新手。我需要将 mysql 单独容器与 tomcat 连接到另一个单独的容器。所以首先我使用

拉取 docker 镜像

docker 拉mysql

之后我尝试运行镜像并通过以下命令运行数据库容器。

docker run --name easql -e MYSQL_ROOT_PASSWORD=1234 -d mysql

之后我通过运行以下命令创建一个数据库。

docker exec -it easql mysql -uroot -p

然后运行mysql命令创建一个名为custom的数据库。 之后,我创建了一个文件夹并创建了一个 Dockerfile 和 webapp 文件夹。在我的 webapp 文件夹中,我创建了名为 db1.jsp 文件的文件夹,我的 db1.jsp 文件如下所示。

<%@ page import="pageNumber.*,java.util.*, java.io.*, java.sql.*"%>
<!DOCTYPE html>
<body>
    <%

    try {
      java.sql.Connection con;
      Class.forName("org.gjt.mm.mysql.Driver");
      con = DriverManager.getConnection("jdbc:mysql://db:3306/custom", "root", "1234");
      out.println ("database successfully opened.");
    }
    catch(SQLException e) {
      out.println("SQLException caught: " +e.getMessage());
    }
  %>
</body>

我的 Dockerfile 正在关注

FROM tomcat:8-jre8
COPY ./webapp /usr/local/tomcat/webapps/webapp
CMD ["catalina.sh", "run"]

我的文件夹结构如下。

我的 context.xml 文件如下。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource
        name="jdbc/custom" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" 
        url="jdbc:mysql://db:3306/custom"
        driverClassName="com.mysql.jdbc.Driver"
        username="root" password="1234"
    />
</Context>

之后,我通过转到文件夹内部并运行以下命令来构建此应用程序

docker build -t 123adw .

docker run --name hello -p 4000:8080 123adw

之后我通过以下命令在应用程序之间建立链接

docker run --name 连接 --link easql:mysql -d 123adw

但是当我运行 http://localhost:4000/webapp/db1.jsp 时,它给了我以下错误。

捕获的 SQLException: Communications link failure 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动没有收到服务器发来的任何数据包。

任何人都可以帮我解决这个问题。

【问题讨论】:

    标签: docker containers


    【解决方案1】:

    如果您使用多个容器,请尝试使用docker-compose,它会更容易。尝试在 docker compose 文件下面,您可能需要稍作更改,但您会明白的。

    mysql-db 容器和web-app 容器都在同一个网络app_net 中。所以在你内部web-app你可以调用mysql容器为mysql-db,端口为3306(并将8002端口暴露给主机)

    version: '2'
    services:
        web-app:
            build: ./webapp # put your web app in /webapp folder in this folder must have the Dockerfile for the webapp
            ports:
            - "4000:8080"
            restart: always
            working_dir: /usr/local/tomcat/webapps/webapp
            networks:
            - app_net
    
        mysql-db:
            container_name: mysql-db
            restart: always
            image: mysql:8.0
            environment:
                MYSQL_ROOT_PASSWORD: 'root'
                MYSQL_USER: 'root'
                MYSQL_PASS: 'root'
            volumes:
            - ./mysql-data:/var/lib/mysql # create this(mysql-data) folder for persisting data of the mysql in your host
            ports:
            - "8002:3306"
            networks:
            - app_net
    
    networks:
        app_net:
            driver: "bridge"
    

    【讨论】:

    • 我试试这个,但是当我运行 docker-compose up 时出现错误“无法找到指定的 Dockerfile:Dockerfile”
    • 你应该创建一个 webapp 文件夹并将你的 webapp 内容放在 Dockerfile 中
    • 使用这个 docker-compose 是创建另一个名为 easql (mysql) 的容器还是使用已经创建的 easql 容器
    • 停止当前的 easql 容器并运行 docker-composer。它将创建一个名为 mysql-db 的容器
    • 对不起,它试图创建 mysql-db 但卡在那里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2019-04-14
    • 2019-08-04
    • 2021-04-04
    • 2020-12-30
    相关资源
    最近更新 更多