도커는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 소프트웨어를 '컨테이너'라는 표준화된 유닛으로 패키징하여, 개발 환경과 운영 환경의 차이 없이 어디서든 동일하게 실행되도록 돕습니다. 가상 머신보다 가볍고 빠르며 자원을 효율적으로 사용하는 것이 특징입니다.
도커 이미지는 컨테이너를 생성하기 위한 읽기 전용 설계도(템플릿)입니다. 코드, 라이브러리, 설정 파일 등 애플리케이션 실행에 필요한 모든 것을 담고 있는 스냅샷과 같습니다. 한 번 만들어진 이미지는 변하지 않으며, 이 이미지를 공유하면 누구나 똑같은 환경을 복제할 수 있습니다.
컨테이너는 도커 이미지를 실행한 상태로, 애플리케이션이 실제 구동되는 격리된 공간입니다. 이미지라는 설계도로 만든 '실제 제품'에 비유할 수 있으며, 독립된 자원을 할당받아 프로세스가 실행됩니다. 하나의 이미지로 여러 개의 컨테이너를 동시에 띄울 수 있고, 삭제와 생성이 매우 자유롭습니다.
도커파일은 이미지를 만들기 위한 명령어들을 모아놓은 텍스트 파일입니다. 어떤 베이스 이미지를 쓸지, 어떤 파일을 복사할지, 어떤 명령어를 실행할지 적어둔 '레시피'와 같습니다. 이 파일을 실행(build)하면 자동으로 도커 이미지가 생성되어 환경 구축을 자동화할 수 있습니다.

Docker Compose는 여러 개의 컨테이너를 하나의 서비스로 정의하고 묶어서 관리할 수 있게 도와주는 도구입니다.
별도의 run.sh 스크립트 파일을 작성하지 않아도, 하나의 docker-compose.yml 파일만으로 여러 컨테이너의 실행 환경과 설정을 선언적으로 정의할 수 있습니다.
####### run.sh #######
# 1. 네트워크 생성
docker network create my-project-network
# 2. 볼륨 생성
docker volume create postgres_data
# 3. Redis 실행
docker run -d --name my-project-redis \
--network my-project-network \
redis:7-alpine
# 4. Postgres 실행
docker run -d --name my-project-postgres \
--network my-project-network \
-e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypass \
-v postgres_data:/var/lib/postgresql/data \
postgres:15-alpine
# 5. API 서버 빌드 및 실행 (매우 복잡해짐)
docker build -t myproject-api -f Dockerfile.dev .
docker run -d --name my-project-server \
--network crypto-express-network \
-p 3000:3000 \
-v $(pwd):/app -v /app/node_modules -v /app/.pnpm-store \
-e DATABASE_URL=... (기타 환경변수 생략) \
crypto-api sh -c "pnpm install && pnpm run start:dev"