Chuyển tới nội dung

Bài thực hành docker microservice

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 

Tag:
Liên hệ