“Containers – Docker”
Docker Compose: Java App + MySQL Deployment
** Containerized Spring Boot Java application with MySQL 8.0 database using Docker Compose and Nexus private registry. Production-ready setup with persistent data.**
Project Goal
Enhanced static Java app now supports data persistence via MySQL. Production-ready Docker Compose deployment.
Architecture
** ┌─────────────────┐ ┌──────────────────┐ │ Java App │───▶│ MySQL 8.0 │ │ (Spring Boot) │ │ (Persistent) │ │ Port: 3000 │ │ Port: 3306 │ └─────────────────┘ └──────────────────┘ │ │ └───────────┬──────────┘ │ ┌──────────────┐ │ Nexus │ │ Docker Repo │ └──────────────┘ **
1. Clone Repository and change the folder
git clone git@gitlab.com:ascharle/docker-compose.git
cd docker-compose
Start mysql container using docker
docker run -p 3306:3306 \
--name mysql \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=team-member-projects \
-e MYSQL_USER=admin \
-e MYSQL_PASSWORD=adminpass \
-d mysql
Build the application / create the jar file
./gradlew build
Set env vars to make your life easy in the terminal for the application
export DB_USER=admin
export DB_PWD=adminpass
export DB_SERVER=localhost
export DB_NAME=team-member-projects
Start java application
java -jar build/libs/docker-exercises-project-1.0-SNAPSHOT.jar
start phpmyadmin container using the official image – docker hub
docker run -p 8083:80 \
--name phpmyadmin \
--link mysql:db \
-d phpmyadmin/phpmyadmin
access it in the browser
localhost:8083
login to phpmyadmin UI with either of 2 mysql user credentials:
- admin:adminpass
- root:rootpass
Create a docker-compose file with both containers
Configure a volume for your DB
Test that everything works again
docker compose file in the folder
Start containers with docker-compose
docker-compose -f docker-compose.yaml up
Create a Dockerfile for the application
FROM openjdk:17.0.2-jdk
EXPOSE 8080
RUN mkdir /opt/app
COPY build/libs/docker-exercises-project-1.0-SNAPSHOT.jar /opt/app
WORKDIR /opt/app
CMD ["java", "-jar", "docker-exercises-project-1.0-SNAPSHOT.jar"]
Build and push Java Application Docker Image
Create a docker hosted repository on Nexus
Build the image locally and push to this repository
Build the application / create the jar file
./gradlew build
#### create docker image - {repo-name}/{image-name}:{image-tag}
docker build -t {repo-name}/java-app:1.0-SNAPSHOT .
#### push docker to remote docker repo {repo-name}
docker push {repo-name}/java-app:1.0-SNAPSHOT
Add application to docker-compose
Add the application’s docker image to docker-compose. Configure all needed env vars.
Check docker compose file
set all needed environment variables
export DB_USER=***
export DB_PWD=***
export DB_SERVER=***
export DB_NAME=team-member-projects
export MYSQL_ROOT_PASSWORD=
export PMA_HOST=mysql
export PMA_PORT=3306
#### start all 3 containers
docker-compose -f docker-compose.yaml up
Run application on server with docker-compose
Set insecure docker repository on server, because Nexus uses http
on Linux server – to add an insecure docker registry, add the file /etc/docker/daemon.json with the following content
{
"insecure-registries" : [ "{repo-address}:{repo-port}" ]
}
Restart docker for the configuration to take affect
sudo service docker restart
#### check the insecure repository was added - last section "Insecure Registries:"
docker info
#### do docker login to repo
docker login {repo-address}:{repo-port}
#### Change hardcoded HOST env var in src/main/resources/static/index.html file, line 48
const HOST = "{server-ip-address}";
#### Rebuild the application and image and push to repo
gradle build
docker build -t {repo-name}/java-app:1.0-SNAPSHOT .
docker push {repo-name}/java-app:1.0-SNAPSHOT
#### copy docker-compose file to remote server
scp -i ~/.ssh/id_rsa docker-compose.yaml {server-user}:{server-ip}:/home/{server-user}
#### ssh into the remote server
#### set all env vars as you did in exercise 6
#### run docker compose file
#### open port 8080 on server to access java application

