Docker Exec 사용법 총정리! 실행 중인 컨테이너 접속과 Bash·Shell 활용 방법

Docker 컨테이너를 운영하다 보면 내부 파일을 확인하거나 설정을 수정하고, 실행 중인 프로세스를 점검해야 하는 경우가 자주 있습니다.

이럴 때 사용하는 명령어가 바로 docker exec입니다.

docker exec를 사용하면 실행 중인 컨테이너 내부에서 Bash나 Shell을 실행하거나 원하는 명령어를 직접 수행할 수 있습니다.

이번 글에서는 Docker Exec의 개념부터 Bash 접속, 파일 확인, 프로세스 조회, 환경 변수 확인, 실무 활용법까지 자세히 알아보겠습니다.

Docker Exec란?

docker exec실행 중인 컨테이너 내부에서 새로운 프로세스를 실행하는 명령어입니다.

이미 실행 중인 컨테이너를 중지하지 않고도 원하는 작업을 수행할 수 있습니다.

구조는 다음과 같습니다.

Docker Host

↓

Running Container

↓

docker exec

↓

새로운 Process 실행

기존 컨테이너는 그대로 유지되며 추가 프로세스만 실행됩니다.

Docker Exec가 필요한 이유

운영 중인 컨테이너에서는 다음과 같은 작업이 자주 필요합니다.

  • 설정 파일 확인
  • 로그 확인
  • 환경 변수 확인
  • 프로그램 테스트
  • 네트워크 확인
  • 디렉터리 이동
  • 패키지 설치(테스트 목적)

이러한 작업을 위해 컨테이너 내부에 직접 접속합니다.

실행 중인 컨테이너 확인

먼저 접속할 컨테이너를 확인합니다.

docker ps

예시

CONTAINER ID

IMAGE

STATUS

NAMES

여기서 컨테이너 이름 또는 ID를 사용합니다.

Bash로 접속하기

Ubuntu 기반 컨테이너라면 다음 명령을 사용합니다.

docker exec -it web bash

의미

-i

표준 입력 유지

-t

터미널 연결

bash

Bash 실행

접속 후에는 일반 Linux 서버와 동일하게 사용할 수 있습니다.

Shell(sh)로 접속하기

Alpine Linux처럼 Bash가 없는 경우가 있습니다.

이때는

docker exec -it alpine sh

를 사용합니다.

대부분의 경량 이미지는 sh를 제공합니다.

Bash와 Shell의 차이

항목Bashsh
기능풍부함기본 기능
자동완성지원제한적
스크립트 기능다양기본 수준
사용 환경Ubuntu, DebianAlpine, BusyBox

실무에서는 이미지에 따라 적절한 Shell을 사용합니다.

컨테이너 내부 현재 위치 확인

pwd

예시

/

또는

/app

현재 작업 디렉터리를 확인할 수 있습니다.

파일 목록 확인

ls -al

출력 예시

app.py

config.yml

logs

tmp

애플리케이션 파일이 정상적으로 복사되었는지 확인할 수 있습니다.

디렉터리 이동

cd /app

이후

ls

로 파일을 확인합니다.

환경 변수 확인

env

또는

printenv

출력 예시

PATH=/usr/local/bin

JAVA_HOME=/usr/lib/jvm

MYSQL_HOST=mysql

Docker Compose의 환경 변수도 확인할 수 있습니다.

특정 환경 변수 조회

echo $PATH

또는

echo $MYSQL_HOST

환경 변수가 올바르게 설정되었는지 확인할 수 있습니다.

실행 중인 프로세스 확인

Ubuntu 기반

ps -ef

Alpine 기반

ps

현재 실행 중인 프로세스를 확인합니다.

네트워크 확인

IP 주소 확인

ip addr

또는

hostname -i

컨테이너의 네트워크 설정을 확인할 수 있습니다.

DNS 확인

cat /etc/resolv.conf

DNS 서버가 정상적으로 설정되었는지 확인합니다.

Hosts 파일 확인

cat /etc/hosts

Docker가 자동 생성한 Hosts 정보를 볼 수 있습니다.

실행 중인 명령어 확인

top

또는

htop

설치되어 있다면 CPU와 메모리 사용량을 확인할 수 있습니다.

파일 내용 확인

cat config.yml

또는

less config.yml

설정 파일을 확인할 수 있습니다.

로그 파일 확인

tail -f app.log

실시간 로그를 확인할 수 있습니다.

다만 대부분의 Docker 애플리케이션은 STDOUT으로 로그를 출력하므로 일반적으로는 docker logs 사용을 권장합니다.

컨테이너 안에서 명령만 실행하기

Shell에 접속하지 않고 명령만 실행할 수도 있습니다.

docker exec web ls

또는

docker exec web pwd

명령 실행 후 바로 종료됩니다.

여러 명령 실행

docker exec web sh -c "pwd && ls -al"

한 번에 여러 명령을 실행할 수 있습니다.

Root 사용자로 접속

docker exec -u root -it web bash

관리 작업이 필요한 경우 사용합니다.

다른 사용자로 접속

docker exec -u nginx -it web sh

특정 사용자 권한으로 테스트할 수 있습니다.

MySQL 컨테이너 접속

예를 들어

docker exec -it mysql mysql -uroot -p

MySQL 콘솔이 실행됩니다.

비밀번호를 입력하면 데이터베이스에 접속합니다.

PostgreSQL 컨테이너 접속

docker exec -it postgres psql -U postgres

PostgreSQL 콘솔을 실행합니다.

Redis 컨테이너 접속

docker exec -it redis redis-cli

Redis 명령을 실행할 수 있습니다.

Python 컨테이너 확인

docker exec web python --version

Python 버전을 확인합니다.

Java 버전 확인

docker exec app java -version

Java 런타임을 점검할 수 있습니다.

Node.js 버전 확인

docker exec node node -v

Node.js 버전을 확인합니다.

Docker Compose에서 Exec 사용

서비스 이름으로 실행합니다.

docker compose exec web bash

또는

docker compose exec mysql mysql -uroot -p

Compose 환경에서는 컨테이너 이름 대신 서비스 이름을 사용하는 것이 일반적입니다.

docker exec와 docker attach 차이

항목docker execdocker attach
새 프로세스 실행가능불가능
기존 프로세스 연결아니오
Bash 실행가능제한적
실무 활용매우 많음거의 없음

실무에서는 대부분 docker exec를 사용합니다.

자주 사용하는 옵션

옵션설명
-i표준 입력 유지
-t터미널 연결
-u사용자 지정
-e환경 변수 전달
-w작업 디렉터리 지정

예시

docker exec -it -w /app web bash

접속과 동시에 /app에서 시작합니다.

실무에서 자주 사용하는 명령어

컨테이너 접속

docker exec -it web bash

Shell 접속

docker exec -it alpine sh

현재 위치

docker exec web pwd

파일 확인

docker exec web ls -al

환경 변수

docker exec web env

프로세스 확인

docker exec web ps -ef

현재 사용자

docker exec web whoami

Root 접속

docker exec -u root -it web bash

실무 사례

쇼핑몰 애플리케이션이 데이터베이스에 연결되지 않는 상황을 가정해 보겠습니다.

운영자는 먼저 애플리케이션 컨테이너에 접속합니다.

docker exec -it shop-app bash

환경 변수를 확인합니다.

echo $DB_HOST

결과가 mysql-db가 아니라 localhost로 설정되어 있는 것을 발견했습니다.

이어 /app/config.yml 파일을 확인해 잘못된 설정을 수정한 뒤 컨테이너를 재배포하여 문제를 해결합니다.

또 다른 상황에서는 docker exec shop-app ps -ef 명령으로 애플리케이션 프로세스가 정상적으로 실행 중인지 확인하고, curl http://localhost:8080/health 명령으로 헬스 체크를 수행할 수도 있습니다.

이처럼 docker exec는 실행 중인 컨테이너 내부를 직접 점검하고 문제를 해결하는 데 가장 많이 사용하는 명령어 중 하나입니다.

자주 묻는 질문

docker exec가 실행되지 않는 이유는 무엇인가요?

docker exec는 실행 중인 컨테이너에서만 사용할 수 있습니다. 종료된 컨테이너에서는 먼저 컨테이너를 시작해야 합니다.

Bash가 없다는 오류가 발생합니다.

Alpine Linux와 BusyBox 기반 이미지는 Bash가 설치되어 있지 않은 경우가 많습니다. 이때는 sh를 사용하면 됩니다.

docker exec와 docker run의 차이는 무엇인가요?

docker run은 새로운 컨테이너를 생성하고 실행하는 명령이고, docker exec는 이미 실행 중인 컨테이너 내부에서 새로운 프로세스를 실행하는 명령입니다.

docker exec로 수정한 내용은 영구 저장되나요?

컨테이너 내부에서 수정한 내용은 해당 컨테이너에는 유지되지만, 컨테이너를 삭제하고 새로 생성하면 사라질 수 있습니다. 지속적으로 유지해야 하는 설정은 Dockerfile, Volume 또는 이미지 빌드 과정에서 관리하는 것이 좋습니다.

마무리

docker exec는 실행 중인 컨테이너 내부를 확인하고 문제를 진단하는 가장 중요한 명령어 중 하나입니다. Bash나 Shell에 접속하여 파일, 환경 변수, 프로세스, 네트워크 상태를 직접 확인할 수 있으며, 운영 환경의 장애 분석과 유지보수에서 매우 자주 활용됩니다.

댓글 남기기