Docker Compose: Java App + MySQL Deployment

“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

Leave a Comment

Your email address will not be published. Required fields are marked *