Docker getting started with Java

HYOJU KIM·2023년 6월 5일

1. Build Images

1) Sample Application Copy in local

$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic

2) spring-petclinic 디렉토리 하위에 메모장으로 'Dockerfile' 생성 (확장자 X)

# 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"]

3) Docker Image Build

$ docker build --tag java-docker .

4) View local images

$ docker images

[ 결과 화면 ]

! 아래처럼 나오면 성공 !

5) Create Tag Images

$ docker tag java-docker:latest java-docker:v1.0.0

[ 결과 화면 ]

! 아래처럼 나오면 성공 !

6) Remove Tag

rmi 명령어 사용
$ docker rmi java-docker:v1.0.0

[ 결과 화면 ]

! 아래처럼 나오면 성공 !


2. Run your images as a container

1) Sample Application Connnect to Container

< 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'

[ 결과 화면 ]

! 아래처럼 나오면 성공 !

2) Run in detached mode

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

  • Running Containers : $ docker ps
  • All Containers s: $ docker ps -a

4) 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 출력됨>>>>>

[ 결과 화면 ]

! 아래처럼 나오면 성공 !


3. Use containers for development

  • MySQL을 실행하기 전에 Docker가 영구 데이터 및 구성을 저장하기 위해 관리할 수 있는 두 개의 볼륨을 생성
  • 바인드 마운트를 사용하는 대신 Docker가 제공하는 관리 볼륨 기능을 사용

1) Create Volume

데이터 용 : $ docker volume create mysql_data
MySQL 구성 용 : $ docker volume create mysql_config

2) 사용자 정의 Birdge Network

  • 응용 프로그램과 데이터베이스가 서로 통신하는 데 사용할 네트워크
  • 연결 문자열을 만들 때 사용할 수 있는 DNS 조회 서비스 제공

$ docker network create mysqlnet

3) Run MySQL in a containers & Attach to the Volumes and Network

$ 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

4) Edit Dockerfile

# 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"]

5) build image

$ docker build --tag java-docker .

6) Run containers

$ 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 !!!!

7) Test

$ curl --request GET --url http://localhost:8080/vets --header 'content-type:application/json'

[ 결과 화면 ]

! 아래처럼 나오면 성공 !

8) Dockerfile for development

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"]

9) Use Compose to develop locally

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'

[ 결과 화면 ]

! 아래처럼 나오면 성공 !

10) Connect a Debugger

  • IntelliJ IDEA 실행
  • Menu -> File -> Open -> spring-petclinic 예제 프로젝트 열기
  • Menu -> Run -> Edit COnfiguration -> + 클릭하여 Remote JVM Debug 추가 -> Port 번호 변경(8080), Use module classpath를 spring-petclinic으로 변경

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

  • Menu - Run - Debug 'RemoteDebug' 클릭 ===> 오류남
profile
신입 개발자

0개의 댓글