我是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"]
我的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毫秒前。驱动程序尚未收到来自服务器的任何数据包。
任何人都可以帮助我解决这个问题。
答案 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"