-
Notifications
You must be signed in to change notification settings - Fork 0
YourNote 803: Deploying Application with Docker
This guide explains how to build a JSP web application, package it into a Docker image, push it to Docker Hub, and deploy it on a DigitalOcean server.
Note
If you are using an Apple Silicon Mac (M1/M2/M3), you must build a multi-platform Docker image (
linux/amd64andlinux/arm64) so it can run on DigitalOcean (AMD64).
Create a file named Dockerfile in the root directory of your project.
FROM tomcat:10.1-jdk21
# Remove default Tomcat applications
RUN rm -rf /usr/local/tomcat/webapps/*
# Copy WAR file into Tomcat
COPY target/sttpk2023-payroll.war /usr/local/tomcat/webapps/ROOT.war
EXPOSE 8080
CMD ["catalina.sh", "run"]Your project structure should look like:
sttpk2023-payroll
│
├── Dockerfile
├── pom.xml
│
└── target
└── sttpk2023-payroll.war
Compile the project using Maven.
mvn clean packageVerify the generated WAR file.
ls targetExpected output:
sttpk2023-payroll.war
On macOS:
docker buildx create --name mybuilder --useVerify:
docker buildx lsExample:
NAME/NODE DRIVER/ENDPOINT
mybuilder * docker-container
docker loginExample:
Username: zhamri
Password: ********
Login Succeeded
Since the project is built on Apple Silicon, build a multi-platform image.
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t zhamri/sttpk2023-payroll:0.0.1 \
--push .This command:
- Builds the Docker image
- Creates both AMD64 and ARM64 versions
- Pushes the image directly to Docker Hub
docker buildx imagetools inspect zhamri/sttpk2023-payroll:0.0.1Expected output:
Name: docker.io/zhamri/sttpk2023-payroll:0.0.1
Manifests
linux/amd64
linux/arm64
If both architectures appear, the image is ready for deployment.
ssh root@YOUR_SERVER_IPExample:
ssh root@159.xxx.xxx.xxxdocker pull zhamri/sttpk2023-payroll:0.0.1Verify:
docker imagesExpected:
REPOSITORY TAG
zhamri/sttpk2023-payroll 0.0.1
docker run -d \
--name payroll \
--restart unless-stopped \
-p 8080:8080 \
zhamri/sttpk2023-payroll:0.0.1Verify:
docker psExpected:
CONTAINER ID IMAGE STATUS
abcd1234 zhamri/sttpk2023-payroll:0.0.1 Up 5 seconds
Open:
http://YOUR_SERVER_IP:8080
Example:
http://159.xxx.xxx.xxx:8080
Your JSP application should appear.
Create docker-compose.yml.
services:
payroll:
image: zhamri/sttpk2023-payroll:0.0.1
container_name: payroll
restart: unless-stopped
ports:
- "8080:8080"Start:
docker compose up -dStop:
docker compose downCreate an Nginx configuration.
server {
listen 80;
server_name payroll.zhamri.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Enable the configuration.
sudo ln -s /etc/nginx/sites-available/payroll \
/etc/nginx/sites-enabled/Test:
sudo nginx -tReload Nginx.
sudo systemctl reload nginxsudo certbot --nginx -d payroll.zhamri.comBuild and push version 0.0.2.
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t zhamri/sttpk2023-payroll:0.0.2 \
--push .On DigitalOcean:
docker pull zhamri/sttpk2023-payroll:0.0.2Stop the old container.
docker stop payrollRemove it.
docker rm payrollRun the new version.
docker run -d \
--name payroll \
--restart unless-stopped \
-p 8080:8080 \
zhamri/sttpk2023-payroll:0.0.2docker imagesdocker psdocker ps -adocker logs payrolldocker logs -f payrolldocker stop payrolldocker start payrolldocker restart payrolldocker rm payrolldocker rmi zhamri/sttpk2023-payroll:0.0.1JSP Project
│
▼
mvn clean package
│
▼
target/sttpk2023-payroll.war
│
▼
docker buildx build
│
▼
Docker Hub
│
▼
DigitalOcean
│
▼
docker pull
│
▼
docker run
│
▼
Nginx Reverse Proxy
│
▼
HTTPS
│
▼
https://payroll.zhamri.com
This deployment workflow supports both Apple Silicon (ARM64) and Intel/AMD64 Linux servers, making it suitable for local development and production deployment on DigitalOcean.