이번 포스트는 프로젝트를 docker로 배포하고 싶어서 배포전에 docker에 관해서 공부한 내용을 정리해본다!
Docker는 애플리케이션을 컨테이너(container)라는 단위로 격리해서 실행할 수 있게 해주는 플랫폼이다.
Docker는 가볍고 빠른 가상화 기술이다. VM과 달리 OS를 공유하기 때문에 훨씬 빠르고 자원도 적게 든다.
Docker Image를 실행한 인스턴스를 말한다.
# 예: Node.js 앱 컨테이너 실행
docker run -d -p 3000:3000 my-app
컨테이너들끼리는 같은 Docker 네트워크 안에 잇으면 서로 이름으로 통신할 수 있다.
// 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,
}
});
// 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 # 이미 만들어둔 네트워크를 사용한다
# 네트워크 생성
$ 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 build -t my-app:1.0 .
이미지를 기반으로 컨테이너를 무한히 만들어 낼 수 있다.
이미지를 만들기 위한 설정 스크립트이다.
# 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 | 컨테이너가 시작될 때 실행할 명령어 |
ENTRYPOINT | CMD와 유사하지만 고정된 실행 진입점 설정 |
ENV | 환경 변수 설정 |
EXPOSE | 컨테이너가 사용할 포트 명시 (문서화 목적) |
ARG | 빌드 타임 변수 지정 |
LABEL | 메타데이터 지정 (version, maintainer 등) |
VOLUME | 볼륨 마운트 지정 (데이터 지속용) |
docker build로 이미지 생성docker run으로 로컬 테스트docker pushdocker pull여러 개의 컨테이너를 한 번 정의하고 실행하는 설정 파일
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:
services:
app:
environment:
- NODE_ENV=production
- PORT=3000
# env_file:
services:
app:
env_file:
- .env