$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic
# syntax=docker/dockerfile:1
FROM eclipse-temurin:17-jdk-jammy
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:resolve
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]
$ docker build --tag java-docker .
$ docker images
! 아래처럼 나오면 성공 !

$ docker tag java-docker:latest java-docker:v1.0.0
! 아래처럼 나오면 성공 !

rmi 명령어 사용
$ docker rmi java-docker:v1.0.0
! 아래처럼 나오면 성공 !

< Terminal 1 >
$ docker run java-docker
< Terminal 2 >
$ curl --request GET --url http://localhost:8080/actuator/health --header 'content-type:application/json'
Terminal 2에서 위 코드를 실행하면 해당 Error 발생
컨테이너가 네트워킹을 포함하여 격리되어 실행되기 때문에 포트 8080에서 localhost에 연결할 수 없다.
- Error -
curl: (7) Failed to connect to localhost port 8080 after 2219 ms: Couldn't connect to server
< Terminal 1 >
Ctrl - C 키를 눌러 컨테이너 중지 or $ docker stop <<ContainerName>>
$ docker run --publish 8080:8080 java-docker
< Terminal 2 >
$ curl --request GET --url http://localhost:8080/actuator/health --header 'content-type:application/json'
! 아래처럼 나오면 성공 !

Sample Application은 웹 서버이기 때문에 컨테이너랑 연결할 필요 X -> 상단의 1) Sample Application Connnect to Container 단계는 안 해도 됨
===> detached mode로 실행
< Terminal 1 >
$ docker run -d -p 8080:8080 java-docker
<<<<<컨테이너 ID 출력됨>>>>>
< Terminal 2 >
$ curl --request GET --url http://localhost:8080/actuator/health --header 'content-type:application/json'
! 아래처럼 나오면 성공 !

3) List containers
$ docker ps$ docker ps -a4) Stop containers
$ docker stop <<ContainerName>>
5) Restart conatiners
$ docker restart <<ContainerName>>
6) Remove containers
$ docker rm <<ContainerName>> <<ContainerName>> <<ContainerName>> ...
7) To name a container
--name 활용
$ docker run --rm -d -p 8080:8080 --name springboot-server java-docker
<<<<<컨테이너 ID 출력됨>>>>>
! 아래처럼 나오면 성공 !

- MySQL을 실행하기 전에 Docker가 영구 데이터 및 구성을 저장하기 위해 관리할 수 있는 두 개의 볼륨을 생성
- 바인드 마운트를 사용하는 대신 Docker가 제공하는 관리 볼륨 기능을 사용
데이터 용 : $ docker volume create mysql_data
MySQL 구성 용 : $ docker volume create mysql_config
- 응용 프로그램과 데이터베이스가 서로 통신하는 데 사용할 네트워크
- 연결 문자열을 만들 때 사용할 수 있는 DNS 조회 서비스 제공
$ docker network create mysqlnet
$ docker run -it --rm -d -v mysql_data:/var/lib/mysql -v mysql_config:/etc/mysql/conf.d --network mysqlnet --name mysqlserver -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:8.0
# syntax=docker/dockerfile:1
FROM eclipse-temurin:17-jdk-jammy
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:resolve
COPY src ./src
CMD ["./mvnw", "spring-boot:run", "-Dspring-boot.run.profiles=mysql"]
$ docker build --tag java-docker .
$ docker run --rm -d --name springboot-server --network mysqlnet -e MYSQL_URL=jdbc:mysql://mysqlserver/petclinic -p 8080:8080 java-docker
!!!! Check Running Containers. Stop the container if it is running !!!!
$ curl --request GET --url http://localhost:8080/vets --header 'content-type:application/json'
! 아래처럼 나오면 성공 !

Dockerfile 수정
# syntax=docker/dockerfile:1
FROM eclipse-temurin:17-jdk-jammy as base
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:resolve
COPY src ./src
FROM base as development
CMD ["./mvnw", "spring-boot:run", "-Dspring-boot.run.profiles=mysql", "-Dspring-boot.run.jvmArguments='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'"]
FROM base as build
RUN ./mvnw package
FROM eclipse-temurin:17-jre-jammy as production
EXPOSE 8080
COPY --from=build /app/target/spring-petclinic-*.jar /spring-petclinic.jar
CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/spring-petclinic.jar"]
Dockerfile 과 같은 경로에 docker-compose.dev.yml 파일 생성
version: '3.8'
services:
petclinic:
build:
context: .
target: development
ports:
- "8000:8000"
- "8080:8080"
environment:
- SERVER_PORT=8080
- MYSQL_URL=jdbc:mysql://mysqlserver/petclinic
volumes:
- ./:/app
depends_on:
- mysqlserver
mysqlserver:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_USER=petclinic
- MYSQL_PASSWORD=petclinic
- MYSQL_DATABASE=petclinic
volumes:
- mysql_data:/var/lib/mysql
- mysql_config:/etc/mysql/conf.d
volumes:
mysql_data:
mysql_config:
Docker가 Image를 컴파일한 다음 container를 시작하도록 flag 전달
< Terminal 1 >
$ docker-compose -f docker-compose.dev.yml up --build
< Terminal 2 >
$ curl --request GET --url http://localhost:8080/vets --header 'content-type: application/json'
! 아래처럼 나오면 성공 !

================중단점 설정 및 작성해야함============