이미지 빌드와 컨테이너 실행, 그리고 재시작
작성한 Dockerfile을 바탕으로 이미지를 빌드하고, 컨테이너를 띄우며, 장애 시 자동 재시작하게 만드는 방법을 배웁니다.
우리는 지금까지 도커의 개념과 이미지, 컨테이너의 차이, 그리고 레시피 역할을 하는 Dockerfile 작성법까지 살펴보았습니다. 이제 남은 것은 직접 손을 움직여 레시피대로 요리를 완성하는 것입니다. 이번 에피소드에서는 Dockerfile을 사용해 나만의 도커 이미지를 빌드(Build)하고, 그 이미지로 컨테이너를 직접 실행(Run)하는 실전 명령어들을 배웁니다. 더 나아가, 내 서버가 갑자기 꺼지더라도 오뚝이처럼 다시 살아나게 만드는 마법의 '자동 재시작' 설정까지 완벽하게 정복해 봅시다.
레시피에서 붕어빵 틀 만들기: 이미지 빌드
Dockerfile이라는 문서가 준비되었다면, 도커 엔진에게 이 문서를 읽고 이미지를 만들어달라고 명령을 내려야 합니다. 이 과정을 빌드(Build)라고 부릅니다.
docker build 명령어
터미널을 열고 Dockerfile이 있는 폴더로 이동한 뒤, 다음 명령어를 입력합니다.
`docker build -t my-app-image .`
명령어를 하나씩 뜯어보겠습니다.
- `docker build` : 도커야, 이미지를 만들어줘.
- `-t my-app-image` : 이 이미지의 이름(태그)을 'my-app-image'라고 지어줘. (t는 tag의 약자입니다)
- `.` : 레시피(Dockerfile)와 복사할 재료 파일들이 있는 곳은 바로 '현재 폴더(.)'야. 마지막의 이 점(.)을 빼먹으면 에러가 납니다.
이 명령어를 치면 터미널에 1단계, 2단계 하면서 Dockerfile에 적힌 명령어들이 순서대로 쭉 실행되는 로그가 올라옵니다. 최종적으로 성공(Success) 메시지가 뜨면 내 컴퓨터에 나만의 붕어빵 틀이 완성된 것입니다.
태그(Tag)를 활용한 버전 관리
이미지 이름 뒤에 콜론(`:`)을 붙이면 버전을 명시할 수 있습니다. 예를 들어 `docker build -t my-app-image:1.0 .`이라고 입력하면 1.0 버전을 의미합니다. 버전을 적지 않으면 자동으로 `latest`(가장 최신)라는 꼬리표가 붙습니다. 소프트웨어 업데이트를 할 때 이 태그를 활용하여 예전 버전과 새 버전을 안전하게 관리할 수 있습니다.
틀에서 붕어빵 굽기: 컨테이너 실행
붕어빵 틀(이미지)이 완성되었으니, 이제 붕어빵(컨테이너)을 구워서 실제로 내 프로그램을 띄워볼 차례입니다. 이때 사용하는 명령어가 `docker run`입니다.
docker run 명령어 해부하기
bashdocker run -d --name my-running-app my-app-image- 1docker run은 이미지를 기반으로 새로운 컨테이너를 생성하고 실행합니다.
- 2-d 옵션은 'Detach(분리)'의 약자로, 컨테이너를 백그라운드에서 조용히 실행하라는 뜻입니다.
- 3--name 옵션은 외우기 어려운 무작위 컨테이너 ID 대신, 내가 부르기 쉬운 이름을 붙여줍니다.
- 4마지막에는 어떤 이미지를 실행할 것인지 앞서 만든 이미지 이름을 적어줍니다.
docker run 명령어의 기초
`docker run` 명령어는 도커에서 가장 중요하고 가장 많이 쓰이는 명령어입니다. 이 명령어 한 줄이면 복잡한 런타임 환경이 순식간에 메모리에 띄워지고 프로그램이 동작을 시작합니다.
백그라운드 실행 옵션 (-d)
만약 터미널에서 그냥 `docker run my-app-image`를 실행하면, 서버의 로그가 터미널 화면을 가득 채우게 됩니다. 그리고 그 터미널 창을 실수로 닫거나 `Ctrl+C`를 누르는 순간 컨테이너도 같이 꺼져버립니다.
이를 방지하기 위해 서버 프로그램(웹 서버, DB 등)을 띄울 때는 항상 `-d` (데몬/백그라운드) 옵션을 붙여줍니다. `-d`를 붙이면 도커는 컨테이너를 백그라운드에서 조용히 돌려놓고, 우리는 터미널 창을 계속해서 다른 작업에 사용할 수 있게 됩니다.
빌드부터 실행까지 한 번에 보기
- 레시피 작성: 프로젝트 폴더에 `Dockerfile` 준비
- 이미지 굽기: `docker build -t vibe-server .`
- 컨테이너 띄우기: `docker run -d --name my-vibe-server vibe-server`
- 확인하기: `docker ps` 명령어를 치면 백그라운드에서 'my-vibe-server'가 쌩쌩 돌아가고 있는 목록을 볼 수 있습니다!
컨테이너 생명 유지 장치: 재시작 정책
서버를 운영하다 보면 예상치 못한 이유로 프로그램이 뻗어버리거나(Crash), 컴퓨터가 강제로 재부팅되는 일이 발생합니다. 컨테이너는 기본적으로 한 번 꺼지면 스스로 다시 켜지지 않습니다.
왜 자동 재시작이 필요한가?
새벽 3시에 서버에 오류가 나서 컨테이너가 멈췄다고 상상해 보세요. 재시작 설정이 없다면 여러분은 알람을 받고 일어나 터미널을 열고 직접 `docker start`를 쳐야만 서비스가 복구됩니다. 도커는 이런 수고를 덜기 위해 강력한 자가 치유 능력을 제공합니다.
--restart 옵션 활용하기
컨테이너를 실행할 때 `--restart` 옵션을 주면 컨테이너가 꺼졌을 때 도커 엔진이 알아서 다시 켜줍니다.
- `--restart always`: 컨테이너가 꺼지는 이유를 불문하고, 꺼지면 무조건 다시 살려냅니다. 컴퓨터 본체를 껐다 켜도 도커가 시작되자마자 이 컨테이너를 자동으로 띄워줍니다. 바이브코딩으로 배포하는 개인 서버에서는 가장 유용한 옵션입니다.
- `--restart unless-stopped`: `always`와 비슷하지만, 사용자가 직접 `docker stop` 명령어를 쳐서 "내가 의도적으로 끈 것"일 때만 빼고 재시작합니다.
적용하는 방법은 매우 간단합니다. `run` 명령어에 옵션만 추가하면 됩니다. `docker run -d --restart always --name my-server my-app-image`
컨테이너 실행 전 최종 확인
- Dockerfile이 있는 폴더에서 명령어(.)를 실행했는가?
- 서버용 애플리케이션이라면 백그라운드 실행 옵션(-d)을 넣었는가?
- 나중에 관리하기 쉽도록 컨테이너 이름(--name)을 명시적으로 지어주었는가?
- 갑작스러운 서버 재부팅에 대비해 재시작 정책(--restart always)을 설정했는가?
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.컨테이너가 예상치 못한 에러로 종료되거나 컴퓨터가 재부팅되었을 때, 도커가 컨테이너를 자동으로 다시 실행하게 만들려면 어떤 옵션을 사용해야 하나요?
3줄 요약
- 1docker build 명령어는 Dockerfile을 읽어 나만의 도커 이미지(붕어빵 틀)를 생성합니다.
- 2docker run 명령어는 생성된 이미지를 바탕으로 컨테이너(붕어빵)를 메모리에 띄우며, -d 옵션을 주어 백그라운드에서 안전하게 실행합니다.
- 3--restart always 옵션을 추가하면 서버가 죽거나 재부팅되어도 컨테이너가 스스로 부활하는 강력한 환경을 만들 수 있습니다.