Docker 정리

Jiseong Choi·2025년 4월 8일

DevOps

목록 보기
1/1

이번 포스트는 프로젝트를 docker로 배포하고 싶어서 배포전에 docker에 관해서 공부한 내용을 정리해본다!

Docker란?

Docker는 애플리케이션을 컨테이너(container)라는 단위로 격리해서 실행할 수 있게 해주는 플랫폼이다.

  • 앱 실행에 필요한 환경(OS, 라이브러리, 종속성 등)을 하나의 이미지로 패키징하는 것이다.
  • 어디서나(개발 환경, 테스트 환경, 클라우드 서버) 동일하게 실행 가능하다.
  • 기존의 "내 PC에서는 작동하는데..?" 문제를 해결해준다.

Docker는 가볍고 빠른 가상화 기술이다. VM과 달리 OS를 공유하기 때문에 훨씬 빠르고 자원도 적게 든다.


Docker를 사용하는 이유

  • 개발 환경의 일관성 : 팀원마다 다른 환경 문제를 해결할 수 있다.
  • 빠른 배포 : 이미지 기반으로 빠르게 서버에 배포가 가능하다.
  • 마이크로서비스 : 각각의 서비스를 독립된 컨테이너로 관리가 가능하다.
  • 테스트 : 테스트용 환경을 빠르게 구성하고 제거가 가능하다.
  • 확장성 : 클라우드 + 컨테이너 오케스트레이션(Kubernates)과 찰떡궁합이다.

Docker Container란?

Docker Image를 실행한 인스턴스를 말한다.

  • 이미지: 실행 전 상태
  • 컨테이너: 실행 중인 인스턴스 (실제 동작)

특징

  • 격리된 공간에서 앱이 실행된다.
  • 독립적이면서도 매우 가볍다.
  • 실행/중지/삭제가 매우 빠르다.
# 예: Node.js 앱 컨테이너 실행
docker run -d -p 3000:3000 my-app

여러 컨테이너 간 통신

컨테이너들끼리는 같은 Docker 네트워크 안에 잇으면 서로 이름으로 통신할 수 있다.

방법 1. docker-compose 기본 네트워크 활용

// docker-compose
version: '3.9'
services:
  backend:
    build: ./backend
    ports:
      - "3000:3000"
    depends_on:
      - redis

  redis:
    image: redis:7
    ports:
      - "6379:6379"
            
// Node.js에서 redis라는 이름으로 접근 가능
import { createClient } from 'redis';

const redis = createClient({
  socket: {
    host: 'redis', // 컨테이너 이름
    port: 6379,
  }
});

방법 2. 사용자 정의 네트워크

// bash - 메인 네트워크 생성
$ docker network create my-network

// docker-compose - 각 컨테이너에 네트워크 연결
services:
	backend:
    image: my-backend
    networks:
      - my-network

  redis:
    image: redis
    networks:
      - my-network
            
networks:
  my-network:
    external: true	# 이미 만들어둔 네트워크를 사용한다

방법 3. 직접 Docker로 컨테이너 띄울 때 네트워크 지정

# 네트워크 생성
$ docker network create my-bridge-net

# 네트워크에 각 컨테이너 연결
$ docker run -d --name backend --network my-bridge-net my-backend
$ docker run -d --name redis --network my-bridge-net redis

Docker Image란?

컨테이너 실행을 위한 파일 시스템 스냅샷 + 설정 정보

  • 불변(immutable)
  • 여러 레이어로 구성되어 있어 캐시 재사용이 가능하다.
  • 빌드 명령어:
$ docker build -t my-app:1.0 .

이미지를 기반으로 컨테이너를 무한히 만들어 낼 수 있다.


Dockerfile이란?

이미지를 만들기 위한 설정 스크립트이다.

예시: Node.js 앱용 Dockerfile

# 1. 기반 이미지
FROM node:18

# 2. 작업 디렉토리 생성 및 설정
WORKDIR /app

# 3. 의존성 파일 복사
COPY package*.json ./

# 4. 의존성 설치
RUM npm install

# 5. 앱 소스 복사
COPY . .

# 6. 앱 포트 개방(선택)
EXPOSE 3000

# 7. 앱 실행 명령
CMD ["npm", "start"]

도커 파일 주요 명령어 정리

명령어설명
FROM기반 이미지 지정 (ubuntu, node, python 등)
WORKDIR작업 디렉토리 설정 (없으면 생성됨)
COPY로컬 파일을 이미지에 복사
RUN쉘 명령 실행 (예: npm install, apt-get install)
CMD컨테이너가 시작될 때 실행할 명령어
ENTRYPOINTCMD와 유사하지만 고정된 실행 진입점 설정
ENV환경 변수 설정
EXPOSE컨테이너가 사용할 포트 명시 (문서화 목적)
ARG빌드 타임 변수 지정
LABEL메타데이터 지정 (version, maintainer 등)
VOLUME볼륨 마운트 지정 (데이터 지속용)

Dockerfile > 이미지 > 배포 흐름

  1. Dockerfile 작성
  2. docker build로 이미지 생성
  3. docker run으로 로컬 테스트
  4. Docker Hub에 docker push
  5. 원격 서버에서 docker pull
  6. 컨테이너 실행 + Nginx 등으로 외부 노출

docker-compose.ytml이란?

여러 개의 컨테이너를 한 번 정의하고 실행하는 설정 파일

예시: Node.js + MongoDB

version: '3.9'
services:
  backend:
    build: ./backend
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    environment:
      - MONGO_URL=mongodb://mongo:27017/mydb

  mongo:
    image: mongo:6
    volumes:
      - mongo-data:/data/db
    ports:
      - "27017:27017"

volumes:
  mongo-data:
# 실행 명령어
$ docker-compose up -d --build
$ docker-compose down

환경변수 주입: environment & env_file

# environment:
services:
  app:
    environment:
      - NODE_ENV=production
      - PORT=3000
      
# env_file:
services:
  app:
    env_file:
      - .env
profile
나 혼자 공부하고, 끄적이는 공간. (Node.JS / Back-End Developer)

0개의 댓글