The Plan
I want my tomcat server to be able to connect to my MySQL server both in separate containers.
The Problem
Tomcat cannot connect to MySQL
I used some of the details from the wordpress tutorial about setting up a link with the mysql container and created the link to the MySQL.
Although the tomcat and mysql spin up just fine I can't seem to get tomcat to be able to connect to MySQL, the settings work on my local machine perfectly fine.
I've attempted to use --net: "host"
as well although that does not work with Tomcat as it throws a severe error.
Previous answers
I noticed on this post a load of possible fixes for the error although I don't believe any of these would translate to my problem as I believe this is a docker problem not a host one.
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
This is my 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 error code.
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)
As you're linking db as "db", you cannot use localhost to join you database. you should "db"
In your container, localhost design your tomcat container, not your host. MySQL container has his own network.
Futhermore, if you don't like "db" name, you can name link it with different name
For exemple:
In this case, inside you tomcat container, you could use
If you are using a container already running or run by using separate DockerFile, then you might want to consider using
Note that the name
mysql-container
is the name of your container. If you don't know the name or haven't specified one in thedocker-compose.yml
you can also find it by runningThe column with the
NAMES
is the one you'll need in the external links. Thedb
after:
is just an alias and it could be anything you want. It will be your hostname. For example if before dockerizing the database your host waslocalhost
you have to now change it intodb
.Lastly, you must also be sure to have both of the containers running in the same network. You can do that by creating a new network as:
Then inside the
docker-compose.yml
of both the containers, add the following network configuration at the same indentation level as that ofservice