도커(Docker) 엔진을 서버에 성공적으로 설치했다면, 이제 격리된 독립 공간에서 가볍고 빠르게 작동하는 ‘컨테이너(Container)’를 직접 생성하고 제어할 차례입니다. 도커 환경에서는 윈도우나 맥 OS처럼 마우스로 아이콘을 클릭하는 대신, 터미널 창에 텍스트 명령어를 입력하여 컨테이너를 띄우고, 모니터링하고, 삭제하는 프로세스를 거치게 됩니다.
도커 명령어는 구조가 매우 직관적이어서 몇 가지 핵심 명령어와 자주 쓰이는 필수 옵션만 손에 익혀두면, 웹 서버나 데이터베이스 같은 복잡한 인프라 서비스를 단 몇 초 만에 자유자재로 다룰 수 있습니다. 본 가이드에서는 실무에서 매일 사용하는 도커 컨테이너 생명 주기(Lifecycle) 관련 필수 명령어와 필수 실행 옵션을 상세히 정리합니다.
1. 컨테이너 생성 및 실행하기: docker run
도커에서 가장 중요하고 강력한 명령어는 바로 docker run입니다. 이 명령어는 도커 이미지(설계도)를 기반으로 격리된 컨테이너(실제 실행 환경)를 생성하고 그 내부의 프로세스를 시작하는 역할을 동시에 수행합니다.
기본 명령어 구조
Bash
docker run [옵션] [이미지_이름] [실행할_명령어]
실무에서 무조건 사용하는 필수 4대 옵션
단순히 docker run만 입력하면 컨테이너가 포그라운드에서 실행되어 터미널 창을 독점하거나, 실행 직후 바로 종료되는 현상이 발생합니다. 이를 제어하기 위해 실무에서는 아래의 옵션들을 조합하여 사용합니다.
-d(Detached 모드 / 백그라운드 실행): 컨테이너를 백그라운드(화면 뒤쪽)에서 보이지 않게 실행합니다. 웹 서버나 데이터베이스처럼 꺼지지 않고 계속 돌려야 하는 정주형 서비스를 띄울 때 필수적인 옵션입니다. 이 옵션을 주면 컨테이너가 켜진 뒤 터미널 제어권이 다시 사용자에게 돌아옵니다.-p(Port Forwarding / 포트 포워딩): 호스트 컴퓨터의 포트와 컨테이너 내부의 포트를 연결해 주는 통로 역할을 합니다. 예를 들어-p 8080:80이라고 지정하면, 외부 사용자가 내 서버의8080포트로 접속했을 때 컨테이너 내부의80포트로 트래픽을 토스해 줍니다.--name(컨테이너 이름 지정): 컨테이너에 사람이 식별하기 쉬운 고유한 이름을 부여합니다. 이 옵션을 생략하면 도커 시스템이 임의의 난해한 영어 이름을 무작위로 붙이기 때문에 관리하기 까안해집니다. (예:--name my-web)--rm(프로세스 종료 시 자동 삭제): 컨테이너 내부의 작업이 종료되면, 사용이 끝난 컨테이너를 디스크에서 자동으로 깔끔하게 삭제해 주는 옵션입니다. 일회성 테스트나 배치 작업을 수행할 때 용량이 쌓이는 것을 막아줍니다.
실무 활용 예시: Nginx 웹 서버 백그라운드 구동
Bash
docker run -d -p 80:80 --name my-nginx nginx
위 명령어를 실행하면, 도커 허브에서 최신 Nginx 이미지를 다운로드하여 my-nginx라는 이름의 컨테이너로 만들고, 외부 80번 포트와 연결하여 백그라운드에서 광속으로 구동합니다.
2. 구동 중인 컨테이너 상태 모니터링 및 파일 확인
컨테이너들을 여러 개 띄웠다면 이들이 에러 없이 잘 돌아가고 있는지 화면에 출력하여 확인해야 합니다.
현재 실행 중인 컨테이너 목록 조회: docker ps
현재 리눅스 서버 메모리 위에서 살아 움직이는 컨테이너들의 목록(아이디, 이름, 포트 상태 등)을 보여줍니다.
Bash
docker ps
만약 에러가 나서 멈췄거나, 작업이 완료되어 종료된(Exited) 과거의 모든 컨테이너 기록까지 싹 다 긁어모아 보고 싶다면 모든 것을 뜻하는 -a(all) 옵션을 붙여줍니다.
Bash
docker ps -a
컨테이너 내부 로그 실시간 확인: docker logs
컨테이너 내부에서 발생하는 표준 출력(에러 로그, 접속 기록 등)을 확인하여 디버깅할 때 사용합니다.
Bash
docker logs my-nginx
로그가 멈춰있지 않고, 웹사이트에 접속자가 들어올 때마다 실시간으로 찍히는 로그를 계속 추적(Follow)하고 싶다면 -f 옵션을 붙여줍니다. 리눅스의 tail -f 명령어와 같은 역할을 합니다.
Bash
docker logs -f my-nginx
3. 실행 중인 컨테이너 내부 터미널 접속: docker exec
가끔 구동 중인 컨테이너 내부에 직접 들어가서 설정 파일을 수정하거나 디렉터리 상태를 확인해야 할 때가 있습니다. 가상머신에 SSH로 원격 접속하듯, 살아있는 컨테이너 내부에 명령어를 찔러 넣는 명령어가 바로 docker exec입니다.
Bash
docker exec -it my-nginx /bin/bash
-it옵션: 상호작용(Interactive)과 터미널 환경(TTY)을 활성화하는 옵션으로, 컨테이너 내부와 내 키보드/모니터를 다이렉트로 연결하여 명령어를 주고받을 수 있게 만듭니다./bin/bash: 컨테이너 내부에서 실행할 쉘 프로그램입니다. 리눅스 배포판에 따라 bash 쉘이 없으면 대신/bin/sh를 입력하여 진입할 수 있습니다.
내부 작업을 모두 마친 후 컨테이너를 끄지 않고 내 PC 화면으로 복귀하려면 터미널에 exit를 입력하고 엔터를 누르면 됩니다.
4. 컨테이너의 중지와 삭제: docker stop 및 docker rm
더 이상 서비스를 구동할 필요가 없거나 설정을 바꾸기 위해 기존 컨테이너를 폐기해야 하는 단계입니다.
컨테이너 안전하게 중지하기: docker stop
구동 중인 프로세스가 작업을 정상적으로 마무리하고 안전하게 안전 정지(Graceful Shutdown)되도록 신호를 보냅니다.
Bash
docker stop my-nginx
중지된 컨테이너 영구 삭제하기: docker rm
중지 상태가 된 컨테이너를 디스크 공간에서 완전히 파괴하여 삭제합니다. 단, 실행 중인 컨테이너는 바로 지울 수 없으므로 반드시 stop을 먼저 해야 합니다.
Bash
docker rm my-nginx
만약 중지 과정을 거치지 않고, 현재 켜져 있는 컨테이너를 강제로 즉시 날려버리고 싶다면 강제 실행 옵션인 -f(force)를 붙여 한 번에 처리할 수 있습니다.
Bash
docker rm -f my-nginx
결론: 컨테이너 생명 주기 제어를 통한 유연한 인프라 관리
도커 컨테이너의 제어 흐름은 결국 run(생성/실행) -> ps(조회) -> logs/exec(모니터링/진입) -> stop(중지) -> rm(삭제)이라는 일련의 생명 주기를 따릅니다.
과거에는 프로그램 하나를 지우려면 시스템 레지스트리와 찌꺼기 파일이 남아 운영체제가 지저분해졌지만, 도커 환경에서는 docker rm 명령어 단 한 줄로 흔적도 없이 깨끗하게 컨테이너 환경을 소멸시킬 수 있습니다. 오늘 배운 기본 명령어와 필수 옵션 조합들을 직접 서버 터미널에 반복해서 입력해 보며, 모던 클라우드 인프라의 핵심인 컨테이너 제어 기술을 완벽하게 내 것으로 만들어 보시기 바랍니다.