Docker - 컨테이너와 셸: 초보자를 위한 친절한 가이드

안녕하세요, 미래의 Docker 애호가 여러분! Docker 컨테이너와 셸의 세상으로 여러분을 안내하게 되어 기쁩니다. 컴퓨터 과학을 가르쳐온 경험을 가진 저는 이 주제가처음에는 어려워 보일 수 있지만, 익숙해지면 매우 흥미롭고 즐거운 것을 확신할 수 있습니다. 그麼, 시작해보겠습니다!

Docker - Containers & Shells

Docker 컨테이너 소개

자세한 내용에 들어가기 전에 기본 개념부터 설명해보겠습니다. 여행을 준비할 때를 상상해보세요. 필요한 것은 모두 챙기고 싶지만, 전체 옷장을 싣고 다니고 싶지 않을 것입니다. 그麼, 컨테이너가 유용하게 쓰일 때입니다. 컨테이너는 소프트웨어의 완벽하게 포장된 가방입니다!

Docker 컨테이너란?

Docker 컨테이너는 소프트웨어의 일부를 실행하는 데 필요한 모든 것을 포함한 가벼운, 독립적, 실행 가능한 패키지입니다. 이는 코드, 러닝타임, 시스템 도구, 라이브러리, 설정 등을 포함합니다. 컴퓨터 안의 미니 컴퓨터처럼 보일 수 있지만, 훨씬 효율적이고 이동성이 뛰어납니다.

Docker 셸 이해

이제 컨테이너에 대한 기본 이해를 얻었으므로, 셸에 대해 이야기해보겠습니다. 컨테이너가 가방이라면, 셸은 그 가방의 지퍼로, 내용물을 열어보고 들여다볼 수 있게 해줍니다.

기본 셸

Docker 컨테이너를 시작하면, 일반적으로 기본 셸이 함께 제공됩니다. 이는 기본 명령줄 인터페이스로, 컨테이너 내에서 명령을 실행할 수 있게 합니다. 간단한 예를 시도해보겠습니다:

docker run -it ubuntu /bin/bash

이 명령은 다음과 같은 작업을 수행합니다:

  • docker run: Docker에 새로운 컨테이너를 시작하도록 지시
  • -it: 컨테이너를 상호작용적이고 페스udo-TTY를 할당
  • ubuntu: 사용할 이미지를 지정 (이 경우, Ubuntu)
  • /bin/bash: Docker가 Bash 셸을 시작하도록 지정

이 명령을 실행하면, Ubuntu 컨테이너 내에 들어가서 명령을 실행할 준비가 됩니다!

실행 중인 컨테이너에 접근하기

occasionally, you might need to enter a container that's already running. This is where our star of the show comes in - nsenter!

nsenter란?

nsenter는 다른 프로세스의 네임스페이스에 접근할 수 있게 해주는 강력한 도구입니다. 간단히 말해, 마법의 열쇠처럼 다른 실행 중인 컨테이너로 들어갈 수 있습니다.

nsenter 사용법

nsenter를 사용하여 실행 중인 컨테이너에 접근하는 방법을 살펴보겠습니다:

  1. 먼저, 컨테이너의 PID(Process ID)를 찾아야 합니다:
docker inspect --format {{.State.Pid}} <container_name_or_id>
  1. PID를 얻은 후, nsenter를 사용합니다:
sudo nsenter --target <PID> --mount --uts --ipc --net --pid -- /bin/bash

이 명령은 복잡해 보일 수 있지만, 간단히 설명드리겠습니다:

  • --target <PID>: 대상 프로세스를 지정
  • --mount --uts --ipc --net --pid: 접근하고자 하는 네임스페이스
  • -- /bin/bash: 컨테이너 내에서 실행할 명령 (이 경우, Bash 셸 시작)

그리고 voila! 지금 당신은 실행 중인 컨테이너 내에 있습니다.

실용적인 예제

새로 얻은 지식을 몇 가지 실용적인 예제로 시험해보겠습니다:

예제 1: 웹 서버 컨테이너 탐색

# Nginx 컨테이너 시작
docker run -d --name my_nginx nginx

# PID 찾기
PID=$(docker inspect --format {{.State.Pid}} my_nginx)

# 컨테이너에 접근
sudo nsenter --target $PID --mount --uts --ipc --net --pid -- /bin/bash

# 내부에서 Nginx 설정 파일 확인
cat /etc/nginx/nginx.conf

이 예제는 실행 중인 Nginx 컨테이너에 접근하여 설정 파일을 검토하는 방법을 보여줍니다.

예제 2: Python 애플리케이션 디버깅

# 간단한 Python 애플리케이션을 실행하는 Python 컨테이너 시작
docker run -d --name my_python python:3.9 python -c "while True: print('Hello, Docker!')"

# PID 찾기
PID=$(docker inspect --format {{.State.Pid}} my_python)

# 컨테이너에 접근
sudo nsenter --target $PID --mount --uts --ipc --net --pid -- /bin/bash

# 내부에서 Python 버전과 설치된 패키지 확인
python --version
pip list

이 예제는 실행 중인 Python 컨테이너에 접근하여 환경과 설치된 패키지를 확인하는 방법을 보여줍니다.

최선의 관행과 팁

우리의 여정을 마무리하면서, 기억해 두어야 할 몇 가지 최선의 관행과 팁을 제공합니다:

설명
--rm 플래그 사용 테스트를 위해 컨테이너를 실행할 때, --rm 플래그를 사용하여 컨테이너가 종료되면 자동으로 제거됩니다
컨테이너에 이름 지정 컨테이너에 의미 있는 이름을 지정하여 쉽게 식별할 수 있도록 합니다
docker exec 사용 간단한 작업을 수행할 때, docker execnsenter보다 빠른 대안일 수 있습니다
신중하게 행동 실행 중인 컨테이너에 접근하고 있으므로, 중요한 프로세스를 방해하지 않도록 주의하세요

결론

축하합니다! Docker 컨테이너와 셸의 세상으로 첫 걸음을 뗐습니다. 새로운 기술을 배우는 것은 연습이 필요합니다. 두려워하지 말고 실험하고 실수를 하세요 - 그것이 가장 큰 학습을 가져옵니다!

안녕히 가는 길에, 제 학생 중 한 명의 말을 떠올립니다: "Docker는 요리와 같아요.처음에는 정확히 레시피를 따릅니다. 하지만 곧 자신만의 요리를 만들게 됩니다!" 그麼, Docker 컨테이너를 만들어보세요!

모두에게 행복한 Dockering을 기원합니다!

Credits: Image by storyset