개발자를 위한 Docker 입문: 이미지·컨테이너·Dockerfile
데브노트 편집팀·2026.07.11·7분 읽기
ADVERTISEMENT
"제 컴퓨터에선 잘 됐는데요"라는 말은 환경 차이에서 옵니다. Docker는 앱과 실행 환경을 **하나의 패키지(컨테이너)**로 묶어 어디서나 똑같이 돌게 합니다.
이미지 vs 컨테이너
가장 헷갈리는 개념입니다.
- 이미지(Image): 실행에 필요한 모든 것을 담은 '설계도'(읽기 전용)
- 컨테이너(Container): 이미지를 실행한 '실체'(프로세스)
클래스와 인스턴스 관계와 같습니다. 이미지 하나로 컨테이너 여러 개를 띄울 수 있습니다.
Dockerfile: 이미지를 만드는 레시피
# Node.js 앱 예시
FROM node:20-alpine # 베이스 이미지
WORKDIR /app # 작업 디렉터리
COPY package*.json ./ # 의존성 파일 먼저 복사(캐시 활용)
RUN npm ci # 의존성 설치
COPY . . # 소스 복사
EXPOSE 3000
CMD ["npm", "start"] # 컨테이너 시작 명령
핵심 최적화: package.json을 먼저 복사해 npm ci를 실행하면, 소스만 바뀌었을 때 의존성 설치 레이어가 캐시되어 빌드가 빨라집니다.
자주 쓰는 명령어
| 명령 | 역할 |
|---|---|
docker build -t myapp . | Dockerfile로 이미지 빌드 |
docker run -p 3000:3000 myapp | 컨테이너 실행(포트 매핑) |
docker ps | 실행 중 컨테이너 목록 |
docker logs <id> | 로그 확인 |
docker exec -it <id> sh | 컨테이너 내부 접속 |
이미지 가볍게 만들기
alpine같은 경량 베이스 사용.dockerignore로node_modules,.git제외- 멀티스테이지 빌드로 빌드 도구는 최종 이미지에서 제거
FROM node:20 AS build
# ... 빌드 ...
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
마무리 체크리스트
- 이미지=설계도, 컨테이너=실행 인스턴스
- 의존성 파일 먼저 복사해 캐시 활용
.dockerignore로 불필요 파일 제외- 운영 이미지는 멀티스테이지 + 경량 베이스
Docker 하나만 익혀도 "환경 때문에" 생기는 문제의 대부분이 사라집니다.
ADVERTISEMENT
함께 보면 좋은 글
백엔드·인프라· 7분
Docker 입문: 이미지와 컨테이너 개념부터 첫 실행까지
이미지와 컨테이너의 차이가 헷갈리는 입문자를 위한 가이드입니다. Dockerfile 작성, build/run/exec 명령어, 그리고 실무에서 자주 쓰는 명령을 실제 예제로 익혀보세요.
2026.06.20
백엔드·인프라· 6분
환경 변수와 비밀값 관리: .env를 커밋하면 안 되는 이유
.env로 설정을 분리하는 이유, .gitignore와 .env.example 패턴, NEXT_PUBLIC_ 접두사의 노출 위험, 키가 유출됐을 때 대처까지 정리합니다.
2026.06.10
백엔드·인프라· 6분
REST vs GraphQL: 무엇을 언제 선택할까
오버페칭·언더페칭 문제부터 캐싱·러닝커브까지. REST와 GraphQL의 본질적 차이와 프로젝트별 선택 기준을 실전 관점에서 비교합니다.
2026.07.10