Docker容器和mysql容器连接错误

时间:2018-10-12 08:48:10

标签: docker containers

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

拉出docker镜像
  

docker pull 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"]

,我的文件夹结构如下。 enter image description here

我的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:通信链接失败最近一次成功发送到服务器的数据包是0毫秒前。驱动程序尚未收到来自服务器的任何数据包。

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

1 个答案:

答案 0 :(得分:0)

如果您使用多个容器,请尝试使用docker-compose更加容易。试试下面的docker compose文件,您可能需要做一些改动,但是您会明白的。

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

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"