서론
Docker란 무엇이고 어떻게 사용하는지 간단히 정리하고자 합니다.
https://github.com/hosunghyun/Smart_Makeup_Web.git
GitHub - hosunghyun/Smart_Makeup_Web: 웹으로 캠을 사용하여 서버로 화장 시뮬레이션을 제공
웹으로 캠을 사용하여 서버로 화장 시뮬레이션을 제공. Contribute to hosunghyun/Smart_Makeup_Web development by creating an account on GitHub.
github.com
최근에 진행한 Smart MakeUP 프로젝트 뿐만 아니라 여러 프로그램을 개발할 때 집에서는 컴퓨터 밖에서는 노트북 혹은 위치한 장소의 컴퓨터를 활용해서 프로그램을 개발해 왔습니다. 이런 개발 환경으로 인해 매번 처음 실행하는 환경에서는 환경설정 및 라이브러리 설치 등의 설정을 해줘야하는 번거로움이 존재하여 이런 문제를 해결하고자 Docker 라는 기술을 공부해보고자 합니다.
Docker란?
Docker Desktop은 컨테이너화된 애플리케이션과 마이크로서비스를 빌드, 공유, 실행할 수 있는 Mac, Linux 또는 Windows 환경을 위한 원클릭 설치 애플리케이션입니다. |
출처 : dockerdocs
Docker Desktop
Explore Docker Desktop, what it has to offer, and its key features. Take the next step by downloading or find additional resources
docs.docker.com
- Docker는 애플리케이션과 해당 환경을 컨테이너라는 단위로 패키징하고 관리할 수 있게 해주는 컨테이너화 플랫폼입니다.
- 애플리케이션 실행에 필요한 모든 것(플리케이션, 라이브러리, 환경설정, 시스템 툴 등)을 하나의 이미지로 묶어 배포 및 실행 환경에 관계없이 일관된 성능을 제공합니다.
즉 Docker는 컨테이너를 만들고 배포하고 구동한다 라고 정리할 수 있습니다.
Docker의 필요성
애플리케이션을 구동하는데 많은 것들이 필요해졌습니다. 예를 들면 .c, .java, .html 같은 소스 파일만 서버에 배포하는 것으로는 플리케이션을 구동하는데 문제점이 존재합니다. 언어의 버전, 라이브러리, 환경 설정 등을 모두 설정해야 동작합니다. 즉 Docker가 필요한 이유는 개발, 테스트, 배포 과정에서 발생하는 환경의 차이를 극복하고, 효율적이고 일관된 실행 환경을 제공하기 때문입니다.
Docker의 특징
경량화
가상머신(Virtual Machine)과 Docker는 모두 시스템을 격리된 환경에서 실행하는 기술로 비슷해 보이지만 작동 방식과 사용 사례가 다릅니다.

가상머신(VM)
- VM은 물리적인 서버 위에서 실행되는 완전한 운영 체제를 포함한 가상화된 환경을 제공합니다.
- VM은 하이퍼바이저(Hypervisor)라고 불리는 소프트웨어가 물리적 하드웨어 자원을 가상화하여 여러 개의 독립적인 VM을 실행합니다. 각 VM은 운영 체제(OS)를 포함하고, 가상 CPU, 메모리, 디스크를 가집니다.
Docker
- Docker는 OS 수준에서 가상화를 제공합니다. 즉, 컨테이너는 호스트 운영 체제의 커널을 공유하며, 각각의 애플리케이션을 격리된 환경에서 실행합니다.
- Docker는 운영 체제를 포함하지 않으며, 컨테이너 내에서 실행되는 프로그램만 포함됩니다. 따라서 훨씬 가볍고 빠르게 실행됩니다.
즉 가상머신은 Hypervisor 위에서 각각의 운영체제를 포함하기 때문에 무겁고 많은 리소스를 잡아 먹지만 Docker는 호스트 OS 위 Container Engine 위에 개별적인 컨테이너를 만들어서 각각의 컨테이너를 동작하기 때문에 가볍고 빠르게 실행합니다.
이식성
Dockaer는 개발, 테스트, 배포 환경에서 일관된 실행 환경을 제공하여 애플리케이션이 다양한 플랫폼에서 동일하게 동작할 수 있도록 보장하는 특징입니다.
Docker 이미지
- Immutable(불변성) : 한 번 빌드된 Docker 이미지는 변경되지 않습니다.
- Self-Contained(자금적 환경) : 애플리케이션 실행에 필요한 운영 체제, 라이브러리, 종속성 등을 포함합니다.
- 호환성 : 모든 Docker 호스트에서 실행 가능합니다.
다양한 환경에서 일관된 실행
- Docker는 컨테이너가 호스트 OS 커널을 공유하면서 독립적인 실행 환경을 제공하기 때문에 애플리케이션 실행 환경이 동일하게 유지되므로 어디서든 같은 결과를 보장합니다.
- Docker는 컨테이너 엔진이 설치된 하드웨어 및 운영 체제든 어디서나 실행됩니다.
격리성
Docker 컨테이너의 가장 중요한 특징 중 하나로 각 컨테이너가 독립적인 실행 환경을 제공하여 다른 컨테이너나 호스트 시스템에 영향을 주지 않도록 합니다.
격리성이 제공하는 장점
- 보안 : 컨테이너가 네트워크, 프로세스, 파일 시스템을 격리하므로 호스트나 다른 컨테이너에 영향을 미치기 힘듭니다.
- 충돌 방지 : 컨테이너 간 리소스 충돌을 방지하여 하나의 컨테이너에서 발생한 문제가 다른 컨테이너에 영향을 주지 않습니다.
- 독립된 개발 및 테스트 환경 : 컨테이너 내부는 고유한 실행 환경을 제공하므로 여러 애플리케이션이 독립적으로 실행이 가능합니다.
빠른 실행
가상머신은 운영 체제를 포함하기 때문에 부팅이 느리지만 Docker는 운영 체제를 포함하지 않기 때문에 부팅이 빠르며 애플리케이션 시작이 빠릅니다.
Docker 사용 방법
컨테이너를 만들기 위해서는 Docker File이 필요합니다. Docker File을 이용해서 Docker 이미지를 만들어 컨테이너를 구동할 수 있습니다.
Docker File은 컨테이너를 어떻게 만들어야 하는지에 대한 설명서로 애플리케이션 구동에 필요한 모든 것에 대한 스크립트입니다.
이렇게 생성된 Docker File을 이용해 애플리케이션 구동에 필요한 모든 것을 이미지로 만들고 만들어진 이미지는 변경이 불가능합니다.
컨테이너는 이미지를 이용해서 애플리케이션을 구현합니다.
1. Docker 설치
Docker: Accelerated Container Application Development
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
www.docker.com

본인에게 맞는 Docker를 다운로드 해줍니다.
2. visual studio code를 사용하면 확장자를 설치합니다.

vscode에서 Docker를 사용하려면 확장자를 설치해줍니다. 그러면 인텔리전스 기능으로 키워드만 줘도 코드 작성에 도움을 받을 수 있습니다.
3. Jar 파일 생성하기
./gradlew clean bootJar // Gradle 방식
mvn clean package // Maven 방식

스프링부트 애플리케이션을 Docker 이미지로 만들기 위해서는 스프링부트 애플리케이션의 JAR 파일이 필요합니다. JAR 파일을 만들기 위해서는 위와 같은 코드를 터미널에 작성해서 애플리케이션을 JAR 파일로 빌드합니다.
4. Docker File 작성하기
# Base Image : OpenJDK 17
FROM openjdk:17-jdk-slim
# 작업 디렉터리 설정
WORKDIR /smart_makeup_web
# JAR 파일을 컨테이너에 복사
COPY build/libs/smart_makeup_web-0.0.1-SNAPSHOT.jar app.jar
# 컨테이너에서 애플리케이션 실행
ENTRYPOINT [ "java", "-jar", "app.jar" ]
# 컨테이너의 포트 노출
EXPOSE 9090
- 시작은 FROM baseimage로 시작해야 합니다. 스프링부트 애플리케이션의 baseimage는 위에 코드와 같이 openjdk로 버전 17을 쓰겠다는 의미입니다.
- WORKDIR 경로를 명시해야합니다. 즉 루트 디렉터리를 지정하는 것입니다.
- COPY 명령을 사용해서 JAR 파일을 복사합니다. 처음 나오는 SNAPSHOT.jjar 을 복사해서 app.jar이라는 이름을 붙인다는 뜻입니다.
- ENTRYPOINT 명령은 복사한 app.jar 파일을 실행하라는 명령입니다.
- EXPOSE 명령은 포트번호를 지정합니다.
5. 빌드 및 실행하기
# 빌드 및 실행
docker build -t smart-makeup-web .
docker run -d -p 9090:9090 smart-makeup-web
chmod +x build-and-run.sh
./build-and-run.sh
-t는 어떤 파일을 사용할건지 나타냅니다.
.은 build context로 Docker에 필요한 파일의 위치를 나타냅니다.
-d는 detached를 의미하며 터미널에서 동작하면 터미널에 무수한 동작이 출력되므로 터미널이 아닌 백드라운드에서 동작하라는 의미입니다.
-p는 포트를 지정합니다. EXPOSE 로 컨테이너의 포트를 지정했고 스프링부트 애플리케이션의 포트를 연결하는 작업입니다.
docker ps
docker logs id
터미널에서 컨테이너를 확인할 수 있습니다.