1.Dự án microserivce
Yêu cầu, viết các Dockerfile cho các service và viết docker-compose file cho dự án.
│ microservices.iml
│ docker-compose.yml
│ .env
│ nginx.conf
│ Readme.md
│
├───activity-notification
│ │ .gitattributes
│ │ .gitignore
│ │ HELP.md
│ │ mvnw
│ │ mvnw.cmd
│ │ pom.xml
│ ├───.mvn
│ ├───src
│ └───target
│
├───database
│
├───project-service
│ │ .gitattributes
│ │ .gitignore
│ │ HELP.md
│ │ mvnw
│ │ mvnw.cmd
│ │ pom.xml
│ │
│ ├───.mvn
│ ├───src
│ └───target
│
└───user-service
│ .gitattributes
│ .gitignore
│ HELP.md
│ mvnw
│ mvnw.cmd
│ pom.xml
├───.mvn
├───src
└───target
2. Viết Dockerfile và docker-compose.yml
a. Dockerfile cho service activity-notification
FROM maven:latest AS build
WORKDIR /activitinotificationservice
COPY . .
RUN mvn clean package -DskipTests
FROM eclipse-temurin:21-jdk-alpine
WORKDIR /activitinotificationservice
COPY --from=build /activitinotificationservice/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/activitinotificationservice/app.jar"]
b. Dockerfile cho service project-service
FROM maven:latest AS build
WORKDIR /project-service
COPY . .
RUN mvn clean package -DskipTests
FROM eclipse-temurin:21-jdk-alpine
WORKDIR /project-service
# Copy the built JAR file from the build stage to the final image
COPY --from=build /project-service/target/*.jar project-service.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/project-service/project-service.jar"]
c. Dockerfile cho service user-service
FROM maven:latest AS build
WORKDIR /user-service
COPY . .
RUN mvn clean package -DskipTests
FROM eclipse-temurin:21-jdk-alpine
WORKDIR /user-service
COPY --from=build /user-service/target/*.jar user-service.jar
EXPOSE 8082
ENTRYPOINT ["java", "-jar", "/user-service/user-service.jar"]
d. Tạo file .env chứa các biến môi trường
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=project_management
MYSQL_USER=root
MYSQL_PASSWORD=123123
RABBITMQ_USER=admin
RABBITMQ_PASS=admin
e. file docker-compose.yml
services:
mysql:
image: mysql:8.0
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./database:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD-SHELL", "mysqladmin -u root -p${MYSQL_PASSWORD} ping -h localhost || exit 1"]
interval: 30s
retries: 5
timeout: 10s
start_period: 10s
networks:
- internal-network
redis:
image: redis:latest
container_name: redis-container
ports:
- "6379:6379"
networks:
- internal-network
rabbitmq:
image: rabbitmq:management
container_name: rabbitmq-container
ports:
- "5672:5672" # Default RabbitMQ port for messaging
- "15672:15672" # Management console
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS}
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 30s
retries: 5
timeout: 10s
start_period: 10s
networks:
- internal-network
nginx:
image: nginx:latest
container_name: nginx-gateway
ports:
- "9099:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- project-service
- user-service
- activity-notification-service
networks:
- internal-network
project-service:
build:
context: ./project-service
dockerfile: Dockerfile
container_name: project-service-container
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
networks:
- internal-network
user-service:
build:
context: ./user-service
dockerfile: Dockerfile
container_name: user-service-container
ports:
- "8081:8081"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
networks:
- internal-network
activity-notification-service:
build:
context: ./activity-notification
dockerfile: Dockerfile
container_name: activity-notification-container
ports:
- "8082:8082"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
networks:
- internal-network
client-app-service:
build:
context: ../client-app
dockerfile: Dockerfile
container_name: client-app-container
ports:
- "80:80"
networks:
- internal-network
networks:
internal-network:
driver: bridge
volumes:
mysql-data:
3. Build và Run
C:\Project\devops-coaching\microservices> docker-compose.exe build
[+] Building 51.9s (33/50)
=> => sha256:12192d56b233dce7c68a9bd97ea25fc16f373e53a9d 88.08MB / 157.86MB
=> [user-service build 1/4] FROM docker.io/library/maven:latest
=> => resolve docker.io/library/maven:latest@sha256:fbea85372e7a68b98e3dda2
=> => sha256:6216c548675b4044bfa40eeb95f24c9e455f9a418764 154B / 154B
=> => sha256:784f1a897806aa87b47d5c3e92689c58aced6e14a801 848B / 848B
=> => sha256:fd0a440fdd64055840bb12732795dcaa86d7137dc4fd 8.95MB / 8.95MB
=> => sha256:59425f3d7529b10c21939674f5cb924a1dfbb189f646 2.28kB / 2.28kB
=> => sha256:73a9b1c0d92035853affe67fa01a459394368614bfef 22.54MB / 22.54MB
=> => sha256:4e45d9955da75f68345210ee9e4fe797f6d93a773f9f 157B / 157B
=> => sha256:a4f9b8cc7730a836e508c88306a18eb3dbac121962d5 57.67MB / 157.65MB
=> => sha256:ea8f5ca39c1af3a196185cdd4c8e2c9d9f23d008b1f2 22.96MB / 22.96MB
=> => sha256:32f112e3802cadcab3543160f4d2aa5441384f40e927 29.72MB / 29.72MB
=> => extracting sha256:32f112e3802cadcab3543160f4d2aa607f5441384f40e927
=> [activity-notification-service internal] load build context
=> => transferring context: 9.88kB
=> [project-service internal] load build context
=> => transferring context: 26.13kB
=> [client-app-service] resolving provenance for metadata file
...
=> => naming to docker.io/library/microservices-user-service:latest
=> => unpacking to docker.io/library/microservices-user-service:latest
=> [project-service] resolving provenance for metadata file
=> [user-service] resolving provenance for metadata file
[+] Running 4/4
✔ user-service Built
✔ client-app-service Built
✔ activity-notification-serviceBuilt
✔ project-service Built
Sau khi build xong chạy docker compose up -d
[+] Running 9/9
✔ Network microservices_internal-network Created 0.2s
✔ Container project-service-container Started 4.7s
✔ Container user-service-container Started 4.3s
✔ Container client-app-container Started 4.1s
✔ Container redis-container Started 3.5s
✔ Container mysql-container Started 4.4s
✔ Container rabbitmq-container Started 3.9s
✔ Container activity-notification-container Started 3.4s
✔ Container nginx-gateway Started 5.3s
