/* 도커를 쓰는 이유 */
처음에 도커라는 개념이 너무 이해가 안됐다. 도커를 쓰는 이유에 대해 알면 개념을 잡는 데 도움이 많이 될 것이다.
먼저, 공동프로젝트로 웹 개발을 한다고 생각해보자. 프론트 개발자 1명, 백엔드 개발자 1명이다.
프론트는 자바스크립트를 쓰고 백엔드는 자바를 쓴다.
어느날, 두 명은 프론트, 백엔드를 같이 돌려서 서로 통신이 잘 되는 지 테스트를 해보고 싶다고 한다.
하지만, 프론트의 컴퓨터에는 자바가 깔려있지 않고, 백엔드의 컴퓨터에는 자바 스크립트가 깔려있지 않다.
그러면 테스트를 위해서는 프론트는 자바를 다운로드 해야하고 백엔드는 자바 스크립트를 다운로드 해야한다. 거기서 더해서 백엔드는 nodejs를 다운로드 해야하고 프론트엔드는 MySQL을 다운로드 할 필요도 있다,
여기서 도커(docker)는 자바, 자바스크립트, nodejs, MySQL를 다운로드할 필요를 덜어준다.
도커를 통해 가상의 공간에서 자바, 자바스크립트, nodejs, MySQL을 다운로드할 수 있다.
그리고 이 가상의 공간을 실행해주고 프론트 백엔드를 실행하면 정상적으로 돌아간다.
/* 도커 이미지 */
자바, 자바스크립트, nodejs, MySQL이 도커 이미지이다. 즉, 특정 프로세스(자바, 자바스크립트 ...)를 실행하기 위한 모든 파일과 환경을 가진 것으로 자바 이미지를 가진 컨테이너를 실행하면 자바를 다운로드할 필요가 없다. 즉 자바 이미지는 자바를 실행하기 위한 모든 파일을 가지고 있다.
/* Dockerfile */
# 베이스 이미지로 OpenJDK 사용
FROM openjdk:11-jre-slim
# 작업 디렉토리 설정
WORKDIR /app
# 애플리케이션 JAR 파일 복사
COPY target/myapp.jar /app/myapp.jar
# 애플리케이션 실행
CMD ["java", "-jar", "myapp.jar"]
Dockerfile이란 도커 이미지를 빌드하기 위한 파일이다. 위의 코드를 보면 4개의 줄이 보이는데 각 줄을 도커 레이어라고 한다.
/* 도커 컨테이너 */
도커 컨테이너는 이미지를 실행한 상태이다. 위의 Dockerfile을 통해 자바 이미지를 빌드했으면 컨테이너에 이 자바 이미지를 실행할 수 있다. 또한, 도커 이미지를 여러 컨테이너에 실행할 수 있다. 도커 컨테이너를 삭제되어도 도커 이미지는 삭제 되지 않는다.
/* docker-compose.yml */
version: '3'
services:
java-app:
build:
context: .
dockerfile: Dockerfile-java
ports:
- "8080:8080"
depends_on:
- mysql-db
environment:
- DATABASE_HOST=mysql-db
- DATABASE_PORT=3306
- DATABASE_NAME=mydatabase
- DATABASE_USER=root
- DATABASE_PASSWORD=secret
mysql-db:
build:
context: .
dockerfile: Dockerfile-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydatabase
해당 파일은 자바 이미지(java-app)과 MySQL 이미지를 생성하는 코드이다.
자바는 위에서 작성한 Dockerfile을 통해서 빌드를 하고 MySQL은 이미지를 docker-compose.yml를 통해 직접 생성한다.
docker-compose up --build
해당 명령어를 실행하여 도커 이미지를 빌드하고 컨테이너를 실행한다.
이후 프론트 개발자는 백엔드 프로젝트를 자바,MySQL 설치 필요없이 실행할 수 있다.
'백엔드' 카테고리의 다른 글
[Spring Boot] 순환 참조 (Circular Reference) (0) | 2024.04.17 |
---|---|
[Java] 리액티브 프로그래밍 - RxJava (0) | 2024.04.08 |
[Spring Boot] RESTAPI - 예외처리 (1) | 2024.01.11 |
[Spring Boot] JsonIgnore, JsonIgnoreProperty, JsonFilter (2) | 2024.01.04 |
[Spring Boot] RestAPI - ResponseEntity, Hateoas (1) | 2024.01.04 |