Docker를 이용한 애플리케이션 배포 방법
현대의 소프트웨어 개발과 운영에서는 컨테이너화가 매우 중요한 역할을 하고 있습니다. 그 중에서도 Docker는 애플리케이션을 쉽고 효율적으로 배포할 수 있도록 도와주는 플랫폼입니다. 이번 포스트에서는 Create React App을 이용해 만든 React 프로젝트를 Docker로 패키징하고 배포하는 과정을 상세히 설명하겠습니다.
Docker 환경 설정
우선, Docker를 사용하기 위해서는 Docker Hub 계정을 생성하고 Docker Desktop을 설치해야 합니다. 이 작업이 완료된 후, Docker의 기능을 활용하여 애플리케이션을 배포할 수 있습니다.
Docker Repository 생성하기
첫 번째 단계는 Docker Hub에서 Repository를 만드는 것입니다. Docker Hub에 로그인한 후, ‘Create Repository’ 버튼을 클릭합니다. 필요한 정보를 입력하고 Repository를 생성합니다. 이 단계는 이미지의 버전 관리를 용이하게 하므로 매우 중요합니다.
Dockerfile 작성하기
이제 Docker 이미지를 만들기 위해 Dockerfile을 생성해야 합니다. Dockerfile은 애플리케이션의 빌드 및 실행에 필요한 명령어를 담고 있는 파일로, 프로젝트의 최상위 폴더에 위치시키는 것이 좋습니다. Dockerfile의 이름은 반드시 ‘Dockerfile’이어야 하며 대소문자 구분이 중요합니다. 아래는 기본적인 Dockerfile 예시입니다:
FROM node:20
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
위 코드는 Node.js를 기반으로 하는 애플리케이션이며, 3000번 포트를 사용해 실행되는 구조입니다. 이 파일을 통해 Docker가 프로젝트의 환경을 설정하고 종속성을 설치합니다.
Docker 이미지 빌드하기
이제 터미널에서 프로젝트 폴더로 이동한 뒤, 다음 명령어를 통해 Docker 이미지를 빌드하세요:
docker build -t yourusername/sample-cra-project:0.0.1 -f Dockerfile .
여기서 ‘yourusername’ 부분은 본인의 Docker Hub 사용자 이름으로 변경해야 합니다. 이 명령어를 통해 Docker는 Dockerfile을 기반으로 이미지를 생성합니다.
컨테이너 실행하기
생성된 이미지를 기반으로 Docker 컨테이너를 실행하려면 다음과 같은 명령어를 사용합니다:
docker run -p 80:3000 yourusername/sample-cra-project:0.0.1
위 명령에서 ’80:3000’은 로컬 시스템의 80번 포트를 컨테이너의 3000번 포트에 매핑하는 역할을 합니다. 이 단계에서 애플리케이션이 성공적으로 실행되는지 확인해야 합니다. 만약 ‘webpack compiled successfully’라는 메시지가 나오면 정상적으로 실행된 것입니다.
Docker Hub로 이미지 배포하기
애플리케이션이 정상적으로 실행되었다면, 이제 Docker Hub에 이미지를 배포할 차례입니다. 다음 명령어로 이미지를 push 합니다:
docker push yourusername/sample-cra-project:0.0.1
이후 Docker Hub에 접속하면 새로운 태그가 생성된 것을 확인할 수 있습니다. 이로써 이미지를 성공적으로 배포한 것입니다.
백엔드 애플리케이션 및 데이터베이스 배포
이제 React 애플리케이션 외에도 Spring Boot 백엔드와 MySQL 데이터베이스를 Docker로 배포할 수 있습니다. 백엔드 애플리케이션은 Spring Boot를 사용하여 Docker 이미지화할 수 있으며, 다음 단계로 진행하겠습니다.
Spring Boot Dockerfile 작성하기
백엔드 프로젝트의 루트 디렉토리에 Dockerfile을 생성하고 다음 내용을 작성합니다:
FROM openjdk:17-jdk
LABEL maintainer="your_email@example.com"
ARG JAR_FILE=build/libs/your-app-SNAPSHOT.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
이 Dockerfile은 Spring Boot 애플리케이션을 Docker 이미지로 빌드하기 위한 것입니다. 이후 이미지 빌드를 위해 다음 명령어를 사용합니다:
docker build -t yourusername/your-backend-app:latest .
MySQL 데이터베이스 컨테이너 실행하기
MySQL 데이터베이스의 Docker 이미지를 다운받고 실행하는 방법은 다음과 같습니다:
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=mydb -p 3306:3306 mysql:8.0
이렇게 하면 MySQL 데이터베이스가 실행되며, 애플리케이션과 연결될 준비가 됩니다.
docker-compose를 이용한 관리
여러 컨테이너를 관리하기 위해 docker-compose를 사용하는 것이 유용합니다. 아래는 두 개의 서비스, 즉 데이터베이스와 백엔드를 포함하는 docker-compose.yml 파일의 예시입니다:
version: "3"
services:
mysql-db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
backend-app:
image: yourusername/your-backend-app:latest
depends_on:
- mysql-db
ports:
- "8080:8080"
위와 같이 구성된 docker-compose 파일을 사용하여 간편하게 여러 컨테이너를 동시에 실행할 수 있습니다. 해당 디렉토리에서 다음 명령어를 실행하면 됩니다:
docker-compose up -d
마무리
이번 포스트에서는 Docker를 활용하여 React 애플리케이션과 Spring Boot 백엔드, MySQL 데이터베이스를 배포하는 방법을 살펴보았습니다. Docker를 사용하면 개발 및 배포 과정이 한층 간편해지며, 보다 효율적으로 애플리케이션을 관리할 수 있습니다. Docker의 활용으로 여러분의 프로젝트가 더욱 성공적으로 이루어지길 바랍니다.
자주 찾으시는 질문 FAQ
Docker란 무엇인가요?
Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주는 플랫폼입니다. 이를 통해 소프트웨어의 배포와 관리를 더욱 쉽게 할 수 있습니다.
Dockerfile은 어떤 역할을 하나요?
Dockerfile은 애플리케이션을 빌드하고 실행하는 데 필요한 명령어를 포함한 스크립트 파일입니다. 이를 통해 Docker 이미지를 생성하는 과정이 자동화됩니다.
컨테이너와 이미지의 차이는 무엇인가요?
이미지는 실행 가능한 애플리케이션의 스냅샷으로, 컨테이너는 이러한 이미지를 바탕으로 실행되는 독립적인 환경을 의미합니다. 즉, 이미지는 정적이고, 컨테이너는 동적입니다.
Docker Hub는 어떤 사용 용도가 있나요?
Docker Hub는 사용자가 만든 Docker 이미지를 저장하고 공유할 수 있는 중앙 저장소입니다. 이곳에서 이미지를 다운로드하거나 배포할 수 있습니다.
docker-compose의 장점은 무엇인가요?
docker-compose는 여러 컨테이너를 한 번에 정의하고 관리할 수 있는 도구입니다. 이를 통해 복잡한 애플리케이션을 쉽게 구축하고 운영할 수 있습니다.