초보자도 OK! 나만의 도커 이미지 만들고 실행하기 🐳
안녕하세요! 지난 포스팅에서 Dockerfile을 작성해 우리만의 도커 이미지 설계도를 완성했습니다. 하지만 설계도가 있다고 건물이 뚝딱 지어지는 건 아니죠? 오늘은 이 설계도를 실제 도커 이미지로 만들고, 그 이미지를 바탕으로 컨테이너를 실행하는 법을 자세히 알아볼게요. 컴퓨터 초보자도 쉽게 따라올 수 있도록 차근차근 설명해 드릴 테니 걱정 마세요! 🚀
1. 설계도(Dockerfile)를 이미지로 만들기: docker build
지난 시간에 만든 Dockerfile은 우리 프로젝트 폴더에 존재합니다. 이제 이 파일을 도커가 읽어서 실제 이미지를 만들도록 명령을 내려야 합니다. 이때 사용하는 명령어가 바로 **docker build**입니다.
VS Code의 터미널을 열고, 프로젝트 루트 폴더에서 아래 명령어를 입력해보세요.
docker build .
이 명령어는 "현재 폴더(.)에 있는 Dockerfile을 기반으로 새로운 커스텀 이미지를 만들어달라"고 도커에게 요청하는 것입니다. 터미널을 보면 도커가 Dockerfile의 각 명령어를 순서대로 실행하는 과정이 나타납니다.
jtyui-iMac:nodejs-app-starting-setup jty$ docker build .
[+] Building 3.7s (9/9) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 125B 0.0s
... (중간 과정 생략) ...
=> CACHED [2/4] WORKDIR /app 0.0s
=> [3/4] COPY . . 0.0s
=> [4/4] RUN npm install 2.6s
... (중간 과정 생략) ...
FROM, WORKDIR, COPY, RUN 등 Dockerfile에 작성했던 명령어들이 순차적으로 실행되는 것을 볼 수 있죠? 이렇게 빌드가 완료되면, 도커 이미지가 성공적으로 생성됩니다.
2. 만들어진 이미지 확인하기: docker images
이미지가 잘 만들어졌는지 확인하려면 docker images 명령어를 사용합니다.
jtyui-iMac:nodejs-app-starting-setup jty$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 0790e064d721 7 minutes ago 1.65GB
node latest 14fe96d5b60b 2 weeks ago 1.63GB
여기서 <none>이라고 표시된 이미지가 바로 방금 우리가 만든 커스텀 이미지입니다. 이름은 아직 없지만, 고유한 IMAGE ID (예: 0790e064d721)가 부여된 것을 볼 수 있습니다. node:latest 이미지는 우리 이미지를 만들기 위한 베이스 이미지입니다.
3. 이미지를 컨테이너로 실행하기: docker run
이제 이미지를 컨테이너로 실행해 봅시다. 이때 사용하는 명령어가 바로 **docker run**입니다.
docker run [이미지 ID]
터미널에서 방금 만든 이미지의 ID를 복사해 위 명령어를 실행하면, 컨테이너가 시작됩니다.
💡 잠깐! 이미지 ID의 모든 문자를 입력할 필요는 없어요!
도커는 이미지 ID를 사용할 때 고유 식별이 가능한 선까지만 입력해도 됩니다. 예를 들어 0790e064d721이라는 ID는 0790이나 심지어 0만으로도 충분히 식별이 가능하다면, 전체 ID를 입력하지 않아도 명령어를 실행할 수 있습니다. 이는 모든 도커 명령어에 적용되는 꿀팁이니 기억해두세요!
jtyui-iMac:nodejs-app-starting-setup jty$ docker run 0790e064d721
명령어를 실행하면 터미널이 멈추고 새로운 입력이 불가능해집니다. 이는 컨테이너 안에서 실행된 CMD ["node", "server.js"] 명령어가 계속 실행 중이기 때문입니다. 즉, 서버가 정상적으로 동작하고 있다는 뜻입니다.
하지만 여기서 끝이 아닙니다. 이 상태에서 웹 브라우저를 열고 http://localhost:[포트]에 접속해봐도 아무것도 보이지 않습니다. 왜일까요?

4. 컨테이너를 종료하고 포트 연결하기
컨테이너가 제대로 동작하지 않는 것처럼 보이니 일단 멈춰볼까요? 새로운 터미널 창을 열고, docker ps 명령어로 현재 실행 중인 컨테이너 목록을 확인합니다.
jtyui-iMac:nodejs-app-starting-setup jty$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
314bc0d7d2ea 0790e064d721 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 80/tcp unruffled_turing
STATUS가 Up으로 표시된 것을 보니 컨테이너가 잘 실행되고 있네요. 이제 이 컨테이너를 멈춰보겠습니다. docker stop [컨테이너 이름] 명령어를 사용합니다. (블로그 화면상에서 STATUS와 NAMES는 bash 오른쪽 끝에 있습니다. 보이지 않는다면 드래그 또는 오른쪽 이동 휠을 사용하여 확인하시면 됩니다.)
docker stop unruffled_turing
다시 docker ps를 입력하면 실행 중인 컨테이너가 없는 것을 확인할 수 있습니다.
💡 왜 EXPOSE만으로는 포트가 연결되지 않을까요?
지난 포스팅에서 EXPOSE 80 명령어는 컨테이너가 80번 포트를 사용한다는 것을 문서화하는 역할이라고 설명했습니다. 이 명령어는 도커에게 힌트를 주는 용도일 뿐, 실제 포트 연결을 수행하지 않습니다. EXPOSE 명령어를 Dockerfile에서 삭제하더라도 포트 연결은 가능하며, 이는 -p 옵션이 진짜 포트 연결을 담당하기 때문입니다.
이제 -p 옵션을 사용해 포트를 연결하고 다시 실행해 봅시다.
docker run -p 3000:80 [이미지 ID]
- -p: 포트 연결(publish)을 위한 옵션입니다.
- 3000:80: "로컬 PC의 3000번 포트와 컨테이너 내부의 80번 포트를 연결(매핑)하라"는 뜻입니다.
이 명령어를 실행하면, 이제 웹 브라우저에서 http://localhost:3000에 접속했을 때 정상적으로 웹사이트가 나타나는 것을 확인할 수 있습니다! 우리는 로컬의 3000번 포트를 통해 컨테이너 내부의 80번 포트로 접근한 것입니다.
이번 포스팅에서는 Dockerfile을 이미지로 빌드하고, 그 이미지를 컨테이너로 실행하는 과정을 상세히 알아봤습니다. 다음 포스팅에서는 도커의 다른 유용한 명령어들과 컨테이너 관리 방법에 대해 더 깊이 다뤄볼게요.
궁금한 점이 있다면 언제든 댓글로 남겨주세요! 😊
'DevOps' 카테고리의 다른 글
| [Docker 6편] 컨테이너의 다양한 모드와 상호작용하기 🐳 (1) | 2025.08.19 |
|---|---|
| [Docker 5편] 컨테이너와 이미지 관리 명령어 모음 🐳 (2) | 2025.08.18 |
| [Docker 4편] 🐳 도커, 넌 대체 어떻게 빌드되는 거야? 이미지 레이어! (2) | 2025.08.18 |
| [Docker 2편] Dockerfile 작성해보기 (2) | 2025.08.16 |
| [Docker 1편] 내 컴퓨터에서는 잘 되는데? 개발자를 위한 도커(Docker) 이야기 (4) | 2025.08.15 |