Docker - 지시 명령어

안녕하세요, 미래의 Docker 마법사 여러분! Docker 명령어의 세계를 함께 탐험하게 되어 기쁩니다. 컴퓨터 과학을 가르치고 있는 저로서는 Docker가 개발자에게 마법의 지팡이似的 존재라고 말씀드릴 수 있습니다. 우리의 삶을 훨씬 더 쉽게 만들어 줍니다! 그럼 손을 dirt고 Docker 지시 명령어의 fascineting 세계로 뛰어들어 보겠습니다.

Docker - Commands

CMD 지시 명령어

CMD 지시 명령어는 영화 속 주인공처럼 - Docker 컨테이너에서는 별이 되는 명령어입니다. 컨테이너가 시작될 때 Docker에게 어떤 명령어를 실행할지 알려줍니다.

기본 문법

CMD ["executable", "param1", "param2"]

간단한 예제로 설명해 보겠습니다:

FROM ubuntu
CMD ["echo", "Hello, Docker World!"]

이 경우, 컨테이너를 실행할 때 "Hello, Docker World!"를 콘솔에 출력합니다. 컨테이너가 깨어나자마자 인사를 보내는 것 같아요!

여러 개의 CMD 지시 명령어

여기에 궁금한 질문이 있습니다: Dockerfile에 여러 개의 CMD 지시 명령어가 있다면 어떻게 되나요?

FROM ubuntu
CMD ["echo", "First command"]
CMD ["echo", "Second command"]

두 명령어 모두 실행된다고 짐작했나요? 그렇다면 안타깝게도 흔한 함정에 빠지셨습니다! 사실, 마지막 CMD 지시 명령어만 실행됩니다. 연극에서처럼 - 마지막 액트만 중요합니다!

Shell 형식 vs. Exec 형식

CMD는 두 가지 형식으로 작성할 수 있습니다:

  1. Shell 형식: CMD command param1 param2
  2. Exec 형식: CMD ["executable", "param1", "param2"]

Exec 형식을 사용하는 것이 좋습니다. 더 명확하고 셸 파싱 문제를 피할 수 있습니다.

ENTRYPOINT

CMD가 주인공이라면, ENTRYPOINT는 우리 Docker 영화의 감독입니다. 컨테이너가 시작될 때 무결하게 유지되는 컨테이너의 주요 명령어를 설정합니다.

기본 문법

ENTRYPOINT ["executable", "param1", "param2"]

예제를 보겠습니다:

FROM ubuntu
ENTRYPOINT ["echo", "Hello from"]
CMD ["Docker"]

이 컨테이너를 실행하면 "Hello from Docker"를 출력합니다. 하지만 여기서 더 흥미로운 점이 있습니다! 컨테이너를 추가 인자와 함께 실행하면, 그들은 CMD를 대체하지만 ENTRYPOINT는 대체되지 않습니다.

docker run myimage World

이 명령어는 "Hello from World"를 출력합니다. ENTRYPOINT는 무대를 설정하고, CMD(또는 실행 시간 인자)는 그 위에서 공연하는 배우입니다!

ENV

ENV는 우리 Docker 제작의 의상 부서처럼 - 컨테이너 전체에서 사용할 수 있는 환경 변수를 설정합니다.

기본 문법

ENV key=value

실용적인 예제를 보겠습니다:

FROM ubuntu
ENV MY_NAME="Docker Enthusiast"
CMD ["sh", "-c", "echo Hello, $MY_NAME!"]

이 컨테이너를 실행하면 "Hello, Docker Enthusiast!"를 출력합니다. 컨테이너에 이름 태그를 달아주는 것 같아요!

여러 개의 ENV 지시 명령어

CMD와 달리, 여러 개의 ENV 지시 명령어를 작성할 수 있으며, 모두 효과를 발생시킵니다:

FROM ubuntu
ENV MY_NAME="Docker Enthusiast"
ENV MY_DOG=Rex MY_CAT=Fluffy
CMD ["sh", "-c", "echo Hello, $MY_NAME! Your pets are $MY_DOG and $MY_CAT."]

이 컨테이너는 여러분을 환영하고 애완 동물을 소개합니다!

WORKDIR

WORKDIR은 우리 Docker 제작의 세트 디자이너처럼 - Dockerfile에서 이어지는 모든 명령어에 대한 작업 디렉토리를 설정합니다.

기본 문법

WORKDIR /path/to/directory

작동 방법을 보겠습니다:

FROM ubuntu
WORKDIR /app
COPY . .
CMD ["ls", "-l"]

이 Dockerfile은 작업 디렉토리를 /app로 설정하고, 현재 디렉토리의 내용을 복사한 후 컨테이너가 실행될 때 내용을 목록에 보여줍니다. 컨테이너에게 "이 디렉토리에서 편안하게 지내!"라고 말하는 것과 같습니다!

여러 개의 WORKDIR 지시 명령어

WORKDIR을 여러 번 사용하여 디렉토리를 변경할 수 있습니다:

FROM ubuntu
WORKDIR /app
WORKDIR src
WORKDIR scripts
RUN pwd

이 명령어는 /app/src/scripts를 출력합니다. 컨테이너가 새로운 집을 둘러보는 것 같아요!

모든 것을 함께

이제 우리가 만난 모든 Docker 지시 명령어를 실제 사례에서 어떻게 함께 사용하는지 보겠습니다. 간단한 Python 웹 애플리케이션을 만들어 보겠습니다:

FROM python:3.9-slim

# 환경 변수 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 설치
COPY requirements.txt .
RUN pip install -r requirements.txt

# 프로젝트 복사
COPY . .

# 애플리케이션 실행 명령어
ENTRYPOINT ["python"]
CMD ["app.py"]

이 Dockerfile은 Python 환경을 설정하고, 의존성을 설치하고, 애플리케이션 코드를 복사하고, 애플리케이션을 실행하는 방법을 지정합니다. Python 애플리케이션에 완벽한 환경을 만드는 레시피입니다!

명령어 요약

여기에 우리가 다룬 명령어의 빠른 참조 표입니다:

명령어 설명 예제
CMD 컨테이너가 시작할 때 실행할 명령어 지정 CMD ["python", "app.py"]
ENTRYPOINT 컨테이너의 주요 명령어 설정 ENTRYPOINT ["python"]
ENV 환경 변수 설정 ENV MY_VAR=value
WORKDIR 작업 디렉토리 설정 WORKDIR /app

이 명령어들은 Docker 컨테이너의 빌딩 블록입니다. 이를 조합하여 애플리케이션에 적합한 환경을 만들어 보세요!

그리고 여러분, 우리는 Docker 지시 명령어의 세계를 함께 탐험했습니다. CMD에서 별이 되는 주인공부터 감독의 역할을 하는 ENTRYPOINT, 의상 부서인 ENV, 세트 디자이너인 WORKDIR까지. 이 가이드가 여러분의 Docker 여정을 밝혀주길 바랍니다. 연습이 완벽을 이루는 것처럼, 이 명령어들을 자유롭게 실험해 보세요. 행복한 Docker 사용을 기원합니다!

Credits: Image by storyset