튜토리얼

Docker 컨테이너에 SSH 하는 방법(그리고 docker exec가 진짜 답인 이유)

컨테이너는 SSH 서버를 실행하지 않습니다 ── 표준 패턴은 호스트에 SSH 한 다음 docker exec -it bash(또는 sh)입니다. 흔한 오류, Compose 버전, 컨테이너 내 sshd가 정당한 경우, 그리고 휴대폰에서 하는 방법.

CC Chen Chen· 창업자·2026년 6월 24일·5분 분량

짧은 답변

보통은 Docker 컨테이너에 직접 SSH 하지 않습니다 ── 호스트에 SSH 한 다음 docker exec로 컨테이너 안에서 셸을 엽니다. 컨테이너는 기본적으로 SSH 서버를 실행하지 않습니다(그리고 일반적으로 실행해서도 안 됩니다: 이미지를 비대하게 만들고 공격 표면을 넓힙니다). 노트북에서든 휴대폰에서든 표준 패턴은 동일합니다: 호스트에 SSH → docker exec -it <container> bash. 이 글에서는 그 흐름, 컨테이너 내 SSH가 정당한 예외, 그리고 흔한 오류를 다룹니다.

표준 방법: SSH 위의 docker exec

# 1. SSH into the Docker host
ssh user@host

# 2. find the container
docker ps

# 3. open a shell inside it
docker exec -it mycontainer bash
# minimal images may not have bash:
docker exec -it mycontainer sh

이게 전부입니다 ── 컨테이너 안에 SSH 서버 없이, 컨테이너 내부 셸에 들어와 있습니다. exit로 호스트로 돌아갑니다. 일회성 명령이라면 셸을 열 필요조차 없습니다: docker exec mycontainer cat /etc/nginx/nginx.conf.

휴대폰에서 Docker 호스트로의 SSH 세션
휴대폰에서도 같은 두 단계입니다: 호스트에 SSH 한 다음 docker exec -it로 컨테이너에 들어갑니다. 컨테이너 안에 SSH 서버는 필요 없습니다.

누구나 겪는 두 가지 오류

  • OCI runtime exec failed: "bash": executable file not found ── 이미지에 bash가 없습니다(Alpine과 distroless 이미지). 대신 sh를 사용하세요. 정말 최소한/distroless 이미지에는 셸이 아예 없을 수도 있습니다.
  • container ... is not running ── exec는 실행 중인 컨테이너에만 작동합니다. docker ps -a를 확인하고, 종료되었다면 먼저 docker logs mycontainer로 이유를 읽으세요.

Docker Compose에서

docker compose exec api sh      # service name, not container name
docker compose logs -f api      # and the logs, while you're there

휴대폰에 더 친화적인 Docker 워크플로우는 휴대폰에서 Docker 관리하기를 참고하세요.

컨테이너 내 SSH가 실제로 정당한 경우

몇 가지 실제 사례가 존재합니다: 컨테이너 자체가 SSH 서비스 경우(git 서버, sftp 엔드포인트, 포트 2222로 노출하는 개발 환경 컨테이너), 또는 exec 접근이 불가능한 플랫폼. 그럴 때는 이미지 안에서 sshd를 실행하고 포트를 게시하며(-p 2222:22), 다른 서버와 똑같이 다룹니다: 키 인증만, root 로그인 금지. 그 외 모든 경우에는 docker exec가 더 간단하고 안전합니다.

휴대폰에서, 타이핑을 줄여서

컨테이너 이름과 exec 플래그는 바로 휴대폰에서 입력하기 성가신 종류입니다. 두 가지가 도움이 됩니다: docker ps / docker exec -it … sh를 스니펫으로 저장하기, 그리고 어시스턴트에게 묻기 ── "postgres 컨테이너에서 셸 열어줘" ── TermAI가 지금 있는 호스트에 맞춰 정확한 명령을 제안합니다(최근 출력을 보고 있으므로 마지막 docker ps의 실제 컨테이너 이름을 알고 있습니다).

Run 버튼과 함께 docker exec 명령을 제안하는 TermAI
자연어로 설명하면 Run 버튼이 달린 정확한 docker exec를 얻습니다 ── 어시스턴트는 최근 docker ps 출력을 보고 있어 실제 컨테이너 이름을 사용합니다.

자주 묻는 질문

Docker 컨테이너에 어떻게 SSH 하나요?
보통은 하지 않습니다 ── Docker 호스트에 SSH 한 다음 docker exec -it container bash(또는 sh)를 실행합니다. 컨테이너는 기본적으로 SSH 서버를 실행하지 않습니다.

왜 docker exec가 "bash: executable file not found"라고 하나요?
이미지에 bash가 포함되어 있지 않습니다(Alpine에서 흔합니다). docker exec -it container sh를 사용하세요.

중지된 컨테이너에 exec 할 수 있나요?
아니요 ── exec에는 실행 중인 컨테이너가 필요합니다. docker logs로 종료 이유를 확인하거나, 셸을 엔트리포인트로 한 새 컨테이너를 docker run 하여 이미지를 살펴보세요.

컨테이너에 sshd를 설치해야 하나요?
일반적으로 아니요 ── 이미지를 비대하게 만들고 공격 표면을 늘립니다. 예외는 목적이 SSH 서비스인 컨테이너거나, exec 접근이 없는 플랫폼입니다.

핵심 요약

  • 표준 패턴: 호스트에 SSH → docker exec -it <name> bash(또는 sh)
  • bash가 없다? Alpine/최소 이미지: sh 사용
  • 실행 중이 아니다? exec에는 살아 있는 컨테이너가 필요 ── 먼저 docker logs
  • 컨테이너 내 sshd: 컨테이너의 역할이 SSH 서비스일 때만
Try TermAI

Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.

CC
Chen Chen — Founder of TermAI

Writes about mobile DevOps, terminal UX, and the surprising depth of "boring" infrastructure.

Was this useful? ← Back to blog