Docker 입문: 이미지와 컨테이너 개념부터 첫 실행까지
"내 컴퓨터에선 잘 됐는데요?" — 이 한마디를 없애려고 나온 게 Docker입니다. 하지만 입문자는 이미지와 컨테이너의 차이부터 막힙니다. 비유하면 이미지는 붕어빵 틀(설계도), **컨테이너는 그 틀로 찍어낸 붕어빵(실행 인스턴스)**입니다. 이미지 하나로 컨테이너를 여러 개 찍을 수 있습니다.
1. Dockerfile 작성
이미지를 만드는 설계도가 Dockerfile입니다. Node.js 앱 예시입니다.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
주의: package.json을 먼저 복사하고 npm ci를 실행한 뒤 소스를 복사하면, 코드만 바뀔 때 의존성 설치 레이어가 캐시되어 빌드가 훨씬 빨라집니다.
2. 빌드하고 실행하기
# 이미지 빌드 (-t 로 이름:태그 지정)
docker build -t myapp:1.0 .
# 컨테이너 실행 (-d 백그라운드, -p 포트매핑)
docker run -d -p 8080:3000 --name web myapp:1.0
# 실행 중인 컨테이너 확인
docker ps
이제 브라우저에서 localhost:8080으로 접속하면 컨테이너 안 3000 포트로 연결됩니다.
3. run vs exec — 입문자가 가장 헷갈리는 부분
| 명령어 | 역할 | 비유 |
|---|---|---|
docker run | 이미지로 새 컨테이너 생성+시작 | 붕어빵 새로 굽기 |
docker exec | 이미 떠 있는 컨테이너에 명령 실행 | 구운 붕어빵 안 들여다보기 |
docker start | 멈춘 컨테이너 다시 시작 | 식은 붕어빵 데우기 |
# 실행 중인 컨테이너 안에서 셸 열기 (디버깅용)
docker exec -it web sh
# 로그 실시간 확인
docker logs -f web
4. 정리와 청소
docker stop web && docker rm web # 중지 후 삭제
docker images # 이미지 목록
docker system prune -f # 안 쓰는 리소스 일괄 정리
주의: docker system prune은 멈춘 컨테이너와 dangling 이미지를 지웁니다. 운영 서버에서는 영향 범위를 꼭 확인하세요.
마무리 체크리스트
- 이미지=설계도, 컨테이너=실행 인스턴스
- Dockerfile은 자주 안 바뀌는 것부터 복사해 캐시 활용
- 새로 띄울 땐
run, 떠 있는 것엔exec -p 호스트:컨테이너로 포트 매핑- 작업 후
prune으로 디스크 청소
함께 보면 좋은 글
환경 변수와 비밀값 관리: .env를 커밋하면 안 되는 이유
.env로 설정을 분리하는 이유, .gitignore와 .env.example 패턴, NEXT_PUBLIC_ 접두사의 노출 위험, 키가 유출됐을 때 대처까지 정리합니다.
REST API 설계 원칙: 실무에서 욕먹지 않는 7가지 규칙
URL에 동사를 넣고, 200으로 에러를 내보내는 잘못된 API는 이제 그만. 리소스 명명, HTTP 메서드, 상태 코드, 버저닝까지 실무 표준에 맞춰 REST API를 설계하는 법을 정리했습니다.
자주 쓰는 Git 명령어 정리: 실무 필수 25개 한 장 요약
add, commit, branch, rebase, stash까지 실무에서 매일 쓰는 Git 명령어를 시나리오별로 정리했습니다. 잘못 커밋했을 때 되돌리는 방법과 협업 충돌 해결 흐름까지 한 번에 익혀보세요.