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의 차이
| 항목 | Bash | sh |
|---|---|---|
| 기능 | 풍부함 | 기본 기능 |
| 자동완성 | 지원 | 제한적 |
| 스크립트 기능 | 다양 | 기본 수준 |
| 사용 환경 | Ubuntu, Debian | Alpine, 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 exec | docker 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에 접속하여 파일, 환경 변수, 프로세스, 네트워크 상태를 직접 확인할 수 있으며, 운영 환경의 장애 분석과 유지보수에서 매우 자주 활용됩니다.