우리는 한다, 개발을.

Docker 를 사용해 개발 환경 구축하기

⌛ 2 mins

개발 모드에서 도커 사용하기

Docker

docker-logo.png

“도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너 로 실행하고 관리하는 오픈 소스 프로젝트이다.”

이미지와 컨테이너

docker-architecture.png

  • 도커 이미지 : 종속성 및 패키지들

a snapshot or blueprint of the libraries and dependencies required inside a container for an application to run.

  • 도커 컨테이너 : 실행되는 격리된 환경

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

==> 중요한 건 도커 컨테이너, 이미지는 컨테이너를 만들기 위한 설계도 같은 것

개발 환경에서 도커 사용하기

  1. Dockerfile 를 사용해 이미지 만들기

Dockerfile

# * 베이스 이미지
FROM node:18

# 작업 디렉토리 (모든 명령어가 여기서 실행, 보통 /app/* 에서 함)
WORKDIR /app/backend

# * 소스 코드 복사 (현재 Dockerfile 위치에서 상대 경로로 복사)
COPY ../backend .

# * 의존성 설치
RUN npm install

# 환경 변수 설정 (생략해도 무관)
ENV NODE_ENV=development

# 안 써도 무방 그냥 포트 번호를 명시해주는 것 (웬만해선 하는게 좋다)
EXPOSE 3000

# * 실행 명령어
CMD ["npm", "run", "start:dev"]
  1. 이미지 빌드하기
    docker build .
    
  2. 컨테이너 실행하기
    docker run -p <로컬 포트>:<컨테이너 포트> <docker image ID>
    

[실제] 개발 환경에서 도커 사용하기

directory-structure.png

실제 환경에서는 docker compose 사용

docker compose 는 도커 컨테이너를 여러개 돌릴 수 있도록 해주는 도구

container.png

docker-compose.yml

version: '3.8'
services:
  frontend:
    build:
      context: ..
      dockerfile: docker/front.dev.Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - "../frontend:/app/frontend"
    environment:
      - DEV_ENV=docker
      - NODE_ENV=development

  backend:
    build:
      context: ..
      dockerfile: docker/back.dev.Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - "../backend:/app/backend"
    env_file:
      - ../backend/.env.development

  • version: 도커 컴포즈 파일 버전 명시
  • services: 서비스 명시 (사용할 컨테이너들)
  • build: 이미지 빌드
  • ports: 포트 매칭
  • volumes: 호스트(로컬 IDE)와 컨테이너 간의 파일 시스템 공유

(주의 사항) 컨테이너들이 서로 통신할 때는 [명시한 서비스 이름] 사용

problem.png

localhost (x) -> backend (o)

docker-compose up

[참고]