Docker 명령어 첫걸음: run부터 stop·rm까지 컨테이너 CLI 실습
Docker를 설치했는데도 컨테이너를 어떻게 실행하고 멈추는지 막막하다면, 먼저 명령어를 따로 외우기보다 하나의 컨테이너를 끝까지 다뤄보는 편이 쉽습니다. 이번 실습에서는 docker run으로 컨테이너를 만들고, docker ps로 상태를 확인한 뒤 docker exec로 내부에 접속합니다. 마지막에는 docker stop과 docker rm으로 정리합니다.
아래 명령어는 macOS·Linux의 Terminal과 Windows PowerShell에서 거의 같은 방식으로 실행할 수 있습니다. Docker Desktop이 실행 중이고 터미널에서 docker 명령어를 사용할 수 있다는 전제에서 진행합니다.
이번 실습에서 컨테이너의 생명주기를 따라가 봅니다
예제에서는 alpine 이미지를 사용합니다. Alpine은 용량이 작은 Linux 이미지라서 기본 CLI 실습에 적합합니다. 컨테이너 이름은 기억하기 쉽도록 cli-practice로 지정하겠습니다.
| 단계 | 명령어 | 하는 일 |
|---|---|---|
| 실행 | docker run |
이미지로 새 컨테이너를 만들고 시작합니다. |
| 조회 | docker ps |
실행 중인 컨테이너를 확인합니다. |
| 접속·명령 실행 | docker exec |
실행 중인 컨테이너 안에서 명령어를 실행합니다. |
| 정지 | docker stop |
실행 중인 컨테이너를 정상적으로 멈춥니다. |
| 삭제 | docker rm |
정지된 컨테이너를 삭제합니다. |
Docker의 공식 CLI에서는 위 명령어를 각각 docker container run, docker container ls, docker container exec처럼 길게 쓸 수도 있습니다. 짧은 형태인 docker run, docker ps, docker exec이 별칭으로 제공되기 때문에 입문 실습에서는 짧은 명령어를 사용하겠습니다.
docker run으로 첫 컨테이너 실행하기
docker run --name cli-practice -d alpine sleep 3600
명령어를 실행하면 Docker가 로컬에 alpine 이미지가 있는지 확인합니다. 이미지가 없다면 레지스트리에서 이미지를 내려받은 다음 컨테이너를 만들고 실행합니다. 마지막의 sleep 3600은 컨테이너 안에서 3,600초 동안 실행될 프로세스입니다. 실행 중인 프로세스가 있어야 다음 단계에서 docker exec로 접속할 수 있습니다.
--name cli-practice: 컨테이너에 직접 이름을 붙입니다.-d: 터미널을 계속 사용할 수 있도록 백그라운드에서 실행합니다.alpine: 사용할 이미지 이름입니다.sleep 3600: 컨테이너가 바로 종료되지 않도록 실행할 명령입니다.
명령어가 성공하면 긴 문자열 형태의 컨테이너 ID가 출력됩니다. 이 ID 대신 이후에는 지정한 이름인 cli-practice를 사용하겠습니다. 컨테이너 이름을 지정하지 않으면 Docker가 임의의 이름을 만들기 때문에 초보자 실습에서는 --name을 붙이는 편이 편리합니다.
docker ps로 실행 상태 확인하기
docker ps
docker ps는 현재 실행 중인 컨테이너 목록을 보여줍니다. 출력 결과에서 IMAGE는 사용한 이미지, COMMAND는 컨테이너에서 실행 중인 명령, STATUS는 실행 상태, NAMES는 컨테이너 이름을 뜻합니다.
방금 실행한 컨테이너가 보이지 않는다면 먼저 Docker Desktop이 실행 중인지 확인하고, 명령어를 다시 입력해 보세요. 실행 중인 컨테이너뿐 아니라 정지된 컨테이너까지 보고 싶다면 -a 옵션을 붙입니다.
docker ps -a
이 차이를 모르면 “컨테이너가 사라졌다”고 착각하기 쉽습니다. docker ps에는 실행 중인 항목만 표시되고, 이미 종료된 컨테이너는 docker ps -a에서 확인할 수 있습니다.
docker exec로 컨테이너 안에 들어가기
docker exec -it cli-practice sh
docker exec는 실행 중인 컨테이너에서 새 명령을 실행합니다. 여기서 -i는 터미널 입력을 유지하고, -t는 대화형 터미널을 할당합니다. 두 옵션을 함께 쓰면 컨테이너 내부의 셸을 직접 조작할 수 있습니다.
명령어가 실행되면 프롬프트가 바뀌면서 컨테이너 내부의 sh 셸에 들어갑니다. 다음처럼 간단한 명령어를 입력해 보세요.
pwd
ls
cat /etc/os-release
작업을 마치고 호스트 컴퓨터의 터미널로 돌아오려면 다음을 입력합니다.
exit
docker exec는 컨테이너의 기존 주 프로세스를 바꾸는 명령이 아닙니다. 현재 실행 중인 컨테이너 안에서 별도의 명령이나 셸을 실행하는 방식입니다. 따라서 컨테이너가 이미 정지된 상태라면 docker exec를 사용할 수 없습니다.
컨테이너를 멈출 때는 docker stop
docker stop cli-practice
docker stop은 실행 중인 컨테이너를 정지합니다. Docker는 기본적으로 컨테이너의 주 프로세스에 종료 신호를 보내고, 정해진 시간 안에 종료되지 않으면 강제 종료합니다. 일반적인 개발 실습에서는 먼저 docker stop을 사용하는 것이 좋습니다.
정지한 뒤 상태를 확인해 보세요.
docker ps
docker ps -a
첫 번째 명령어에서는 컨테이너가 더 이상 실행 중이지 않아 목록에서 빠지고, 두 번째 명령어에서는 정지된 상태의 cli-practice를 확인할 수 있습니다. 정지했다고 컨테이너가 삭제된 것은 아닙니다.
정지된 컨테이너를 docker rm으로 삭제하기
docker rm cli-practice
docker rm은 컨테이너 자체를 삭제합니다. 방금 docker stop으로 정지했기 때문에 별도의 옵션 없이 삭제할 수 있습니다. 삭제가 끝난 뒤 다음 명령어로 확인합니다.
docker ps -a
이제 cli-practice가 목록에 나타나지 않아야 합니다. 컨테이너를 삭제해도 이미지인 alpine까지 함께 삭제되는 것은 아닙니다. 이미지와 컨테이너는 별도의 객체이므로 이미지 목록은 docker image ls로 따로 확인합니다.
실행 중인 컨테이너를 바로 삭제해야 한다면 docker rm -f cli-practice처럼 -f를 사용할 수 있습니다. 다만 이 옵션은 실행 중인 프로세스를 강제로 종료하므로, 학습 단계에서는 먼저 docker stop을 실행하는 흐름을 익히는 편이 안전합니다.
명령어가 실패할 때 가장 먼저 볼 부분
이미 컨테이너 이름을 사용 중인 경우
docker: Conflict. The container name ... is already in use
같은 이름의 컨테이너가 남아 있다는 뜻입니다. docker ps -a로 확인한 뒤 다시 사용하지 않을 컨테이너라면 docker rm cli-practice로 삭제하고 docker run을 다시 실행합니다.
docker exec가 실행되지 않는 경우
대부분 컨테이너가 실행 중이 아닌 상태에서 접속하려고 할 때 발생합니다. docker ps로 실행 여부를 확인하고, 정지된 컨테이너를 다시 사용하려면 새로 docker run하지 말고 docker start cli-practice를 사용합니다. docker run은 새 컨테이너를 만들고, docker start는 기존 컨테이너를 다시 시작한다는 차이가 있습니다.
컨테이너가 명령 직후 종료되는 경우
컨테이너는 내부의 주 프로세스가 끝나면 함께 종료됩니다. 예를 들어 단순한 셸이나 짧은 명령만 실행하면 바로 종료될 수 있습니다. 이번 실습에서 sleep 3600을 사용한 이유도 컨테이너가 일정 시간 동안 실행 상태를 유지하도록 하기 위해서입니다.
이번 실습의 전체 흐름을 한 번에 다시 실행하기
docker run --name cli-practice -d alpine sleep 3600
docker ps
docker exec -it cli-practice sh
exit
docker stop cli-practice
docker ps -a
docker rm cli-practice
docker ps -a
핵심은 명령어를 개별적으로 외우는 것이 아니라 실행 → 확인 → 내부 명령 실행 → 정지 → 삭제의 흐름을 이해하는 데 있습니다. Docker와 가상머신의 차이가 아직 낯설다면 Docker와 가상머신(VM)의 차이를 먼저 읽고 돌아와도 좋습니다.
실습을 반복할 때는 컨테이너 이름을 바꾸거나 docker ps -a의 결과를 직접 비교해 보세요. 특히 docker stop은 정지, docker rm은 삭제라는 차이를 구분하면 이후 Docker Compose나 포트·볼륨 실습으로 넘어갈 때도 훨씬 덜 헷갈립니다.