AI Engineering Tools

프로그래밍

Docker

Docker 이미지, 컨테이너, Dockerfile, Docker Compose, 포트 연결, 볼륨, 로그 확인, 자주 보는 오류를 이해하기 위한 검색형 가이드입니다.

33 개 항목

기본 개념

Docker

Docker

docker --version

뜻

애플리케이션 실행환경을 컨테이너로 묶고 실행하는 도구입니다.

언제 쓰나

다른 컴퓨터에서도 같은 OS 패키지, 런타임, 의존성으로 앱을 실행하고 싶을 때 사용합니다.

예시

docker --version

요청 예시

이 프로젝트를 Docker로 실행할 수 있는지 설명해줘.

기본 개념

Docker daemon

Docker daemon

Docker 데몬에 연결할 수 없습니다.

뜻

이미지를 빌드하고 컨테이너를 실행하는 백그라운드 서비스입니다.

언제 쓰나

Docker 명령이 연결되지 않으면 Docker Desktop 또는 Docker 서비스가 실행 중인지 확인해야 합니다.

예시

Docker 데몬에 연결할 수 없습니다.

요청 예시

Docker 명령이 데몬에 연결되지 않는 이유를 확인해줘.

기본 개념

이미지

Image

node:20-alpine

뜻

컨테이너를 만들기 위한 재사용 가능한 실행환경 템플릿입니다.

언제 쓰나

이미지는 컨테이너가 어떤 OS, 런타임, 라이브러리, 앱 파일로 시작할지 정의합니다.

예시

node:20-alpine

요청 예시

이 Dockerfile이 어떤 기본 이미지를 쓰는지 알려줘.

기본 개념

컨테이너

Container

docker ps

뜻

이미지에서 만들어진 실행 중이거나 중지된 인스턴스입니다.

언제 쓰나

앱, 데이터베이스, 캐시, worker를 분리된 환경에서 실행할 때 사용합니다.

예시

docker ps

요청 예시

실행 중인 컨테이너를 나열하고 각각 무엇을 하는지 설명해줘.

기본 개념

레지스트리

Registry

docker pull postgres:16

뜻

Docker 이미지를 저장하고 내려받는 서버입니다.

언제 쓰나

Docker Hub and private registries are used to share base images or deployable app images.

예시

docker pull postgres:16

요청 예시

이 이미지가 어디에서 내려받아지는지 설명해줘.

Dockerfile

Dockerfile

Dockerfile

Dockerfile

뜻

Docker 이미지를 어떻게 만들지 정의하는 파일입니다.

언제 쓰나

의존성을 설치하고 앱 파일을 복사하고 앱 시작 명령을 정의할 때 사용합니다.

예시

Dockerfile

요청 예시

이 Dockerfile을 읽고 빌드 단계를 요약해줘.

Dockerfile

FROM

FROM

FROM node:20-alpine

뜻

Dockerfile에서 기본 이미지를 선택하는 명령입니다.

언제 쓰나

시작 OS 계층과 런타임 버전을 결정하는 경우가 많습니다.

주의

기본 이미지를 바꾸면 사용 가능한 명령, 보안 업데이트, 이미지 크기에 영향을 줄 수 있습니다.

예시

FROM node:20-alpine

요청 예시

이 FROM 이미지에 무엇이 포함되는지 설명해줘.

Dockerfile

WORKDIR

WORKDIR

WORKDIR /app

뜻

이후 명령이 실행될 컨테이너 내부 작업 폴더를 설정합니다.

언제 쓰나

COPY, RUN, CMD가 예측 가능한 앱 폴더 기준으로 동작하게 할 때 사용합니다.

예시

WORKDIR /app

요청 예시

이 Dockerfile이 어떤 폴더를 앱 디렉터리로 쓰는지 설명해줘.

Dockerfile

COPY

COPY

COPY package.json package-lock.json ./

뜻

빌드 컨텍스트의 파일을 이미지 안으로 복사합니다.

언제 쓰나

의존성 파일, 소스 코드, 정적 asset을 이미지에 넣을 때 사용합니다.

예시

COPY package.json package-lock.json ./

요청 예시

이 COPY 단계가 이미지에 어떤 파일을 넣는지 알려줘.

Dockerfile

RUN

RUN

RUN npm ci

뜻

이미지를 빌드하는 중에 명령을 실행합니다.

언제 쓰나

OS 패키지 설치, 의존성 설치, 앱 빌드에 사용합니다.

주의

RUN 은 컨테이너가 시작될 때가 아니라 이미지 빌드 시점에 실행됩니다.

예시

RUN npm ci

요청 예시

Dockerfile의 빌드 시점 명령과 컨테이너 시작 명령을 구분해줘.

Dockerfile

CMD

CMD

CMD ["npm", "run", "start"]

뜻

컨테이너가 시작될 때 기본으로 실행할 명령을 정의합니다.

언제 쓰나

웹 서버, API 서버, worker, 스크립트를 시작할 때 사용합니다.

예시

CMD ["npm", "run", "start"]

요청 예시

이 컨테이너가 어떤 명령으로 시작되는지 알려줘.

Dockerfile

EXPOSE

EXPOSE

EXPOSE 3000

뜻

컨테이너 안의 앱이 어떤 포트를 사용할 것으로 기대되는지 문서화합니다.

언제 쓰나

힌트로 사용하고 실제 공개는 docker run -p 또는 compose ports로 설정합니다.

주의

EXPOSE 만으로는 애플리케이션이 브라우저에서 접근 가능하게 되지 않습니다.

예시

EXPOSE 3000

요청 예시

이 EXPOSE 포트가 실제로 공개되는지 설명해줘.

Dockerfile

.dockerignore

.dockerignore

node_modules

뜻

Docker 빌드 컨텍스트에서 제외할 경로를 지정하는 파일입니다.

언제 쓰나

로컬 의존성, 빌드 결과물, 비밀값, 임시 파일이 이미지 빌드에 들어가지 않게 할 때 사용합니다.

예시

node_modules

요청 예시

이 .dockerignore가 위험하거나 불필요한 파일을 제외하는지 확인해줘.

Dockerfile

빌드 컨텍스트

Build context

docker build -t my-app .

뜻

이미지를 빌드할 때 Docker에 전달되는 폴더입니다.

언제 쓰나

docker build 마지막의 점은 보통 현재 폴더를 빌드 컨텍스트로 쓴다는 뜻입니다.

주의

컨텍스트가 크면 빌드가 느려지고 개인 파일이 실수로 포함될 수 있습니다.

예시

docker build -t my-app .

요청 예시

이 Docker 빌드에서 어떤 파일을 사용할 수 있는지 설명해줘.

Docker Compose

Docker Compose

Docker Compose

docker compose up

뜻

하나의 YAML 파일로 여러 Docker 서비스를 함께 실행하는 도구입니다.

언제 쓰나

앱, 데이터베이스, 캐시, worker 같은 로컬 개발 구성을 함께 실행할 때 사용합니다.

예시

docker compose up

요청 예시

이 compose 파일이 어떤 서비스를 시작하는지 설명해줘.

Docker Compose

services

services

services: web: db:

뜻

compose 파일에서 이름 붙여 정의하는 앱 구성 단위입니다.

언제 쓰나

web 서비스는 앱을 실행하고 db 서비스는 PostgreSQL을 실행하는 식으로 구성합니다.

예시

services: web: db:

요청 예시

이 compose 파일의 services를 나열하고 각각 무엇을 하는지 설명해줘.

Docker Compose

docker compose up

docker compose up

docker compose up -d

뜻

compose 파일에 정의된 서비스를 시작합니다.

언제 쓰나

서비스를 백그라운드에서 실행하려면 -d 옵션을 사용합니다.

예시

docker compose up -d

요청 예시

compose 서비스를 시작하고 어떤 서비스가 실행 중인지 보여줘.

Docker Compose

docker compose down

docker compose down

docker compose down

뜻

compose가 만든 컨테이너를 중지하고 제거합니다.

언제 쓰나

로컬 개발 구성을 다 사용한 뒤 정리할 때 사용합니다.

주의

명시적으로 볼륨을 제거하지 않으면 named volume은 보통 남습니다.

예시

docker compose down

요청 예시

영구 데이터를 삭제하지 않고 이 compose 구성을 중지해줘.

명령어

docker build

docker build

docker build -t my-app .

뜻

Dockerfile과 컨텍스트를 사용해 Docker 이미지를 만듭니다.

언제 쓰나

Dockerfile을 만들었거나 앱 의존성을 바꾼 뒤 사용합니다.

예시

docker build -t my-app .

요청 예시

이 Docker 이미지를 빌드하고 오류가 있으면 요약해줘.

명령어

docker run

docker run

docker run --name my-app -p 3000:3000 my-app

뜻

이미지에서 컨테이너를 만들고 시작합니다.

언제 쓰나

compose 없이 컨테이너 하나를 직접 시작하고 싶을 때 사용합니다.

예시

docker run --name my-app -p 3000:3000 my-app

요청 예시

이 이미지를 실행하고 브라우저 URL을 설명합니다.

명령어

docker ps

docker ps

docker ps

뜻

실행 중인 컨테이너 목록을 보여줍니다.

언제 쓰나

중지된 컨테이너까지 보려면 docker ps -a를 사용합니다.

예시

docker ps

요청 예시

실행 중인 컨테이너와 공개된 포트를 보여줘.

명령어

docker stop

docker stop

docker stop my-app

뜻

실행 중인 컨테이너를 중지합니다.

언제 쓰나

컨테이너를 제거하거나 포트를 비우기 전에 사용합니다.

예시

docker stop my-app

요청 예시

3000 포트를 쓰는 컨테이너를 중지해줘.

명령어

docker logs

docker logs

docker logs my-app

뜻

컨테이너의 로그를 출력합니다.

언제 쓰나

컨테이너가 종료되거나 앱이 응답하지 않을 때 확인합니다.

예시

docker logs my-app

요청 예시

이 컨테이너 로그를 읽고 첫 번째 오류를 찾아줘.

명령어

docker exec

docker exec

docker exec -it my-app sh

뜻

이미 실행 중인 컨테이너 안에서 명령을 실행합니다.

언제 쓰나

컨테이너 내부 파일, 환경변수, 설치 도구를 확인할 때 사용합니다.

주의

컨테이너 안에서 수동으로 바꾼 내용은 컨테이너를 다시 만들면 사라질 수 있습니다.

예시

docker exec -it my-app sh

요청 예시

이 컨테이너 안에서 shell을 열고 환경변수를 확인해줘.

포트와 네트워크

ports

ports

3000:3000

뜻

내 컴퓨터의 포트를 컨테이너 내부 포트에 연결합니다.

언제 쓰나

브라우저가 컨테이너 안에서 실행 중인 웹앱에 접속할 수 있게 할 때 사용합니다.

주의

왼쪽은 내 컴퓨터 포트이고 오른쪽은 컨테이너 내부 포트입니다.

예시

3000:3000

요청 예시

이 ports 설정에서 어떤 URL로 접속해야 하는지 설명해줘.

포트와 네트워크

Docker에서 localhost

localhost in Docker

host.docker.internal

뜻

Docker 안에서 실행되는 코드의 localhost는 내 컴퓨터가 아니라 컨테이너 자신을 뜻할 수 있습니다.

언제 쓰나

compose 네트워크에서는 서비스 이름을 쓰고, 컨테이너가 호스트에 접근해야 할 때는 host.docker.internal을 고려합니다.

예시

host.docker.internal

요청 예시

이 컨테이너에서 localhost로 데이터베이스에 접근되지 않는 이유를 설명해줘.

파일과 데이터

볼륨

Volume

db-data:/var/lib/postgresql/data

뜻

Docker-managed storage that can persist data outside a container's lifecycle.

언제 쓰나

컨테이너를 다시 만들어도 남아야 하는 데이터베이스 데이터 등에 사용합니다.

주의

볼륨을 제거하면 영구 데이터가 삭제될 수 있습니다.

예시

db-data:/var/lib/postgresql/data

요청 예시

이 compose 설정에서 어떤 볼륨이 영구 데이터를 저장하는지 알려줘.

파일과 데이터

바인드 마운트

Bind mount

./src:/app/src

뜻

내 컴퓨터의 폴더를 컨테이너 내부 경로에 직접 연결합니다.

언제 쓰나

개발 중 내 컴퓨터의 코드 수정이 컨테이너 안에 바로 보이게 할 때 사용합니다.

주의

바인드 마운트는 같은 경로에 이미지로 복사된 파일을 가릴 수 있습니다.

예시

./src:/app/src

요청 예시

이 volume 설정이 named volume인지 바인드 마운트인지 설명해줘.

파일과 데이터

environment

environment

DATABASE_URL=postgres://db:5432/app

뜻

컨테이너에 전달하는 설정값입니다.

언제 쓰나

데이터베이스 URL, 포트, 모드, 기능 플래그, 런타임 설정에 사용합니다.

주의

비밀값을 공개 이미지에 넣거나 실제 비밀값을 커밋하면 안 됩니다.

예시

DATABASE_URL=postgres://db:5432/app

요청 예시

이 컨테이너에 필요한 환경변수를 확인해줘.

문제 해결

포트가 이미 사용 중

port is already allocated

0.0.0.0:3000에 바인딩 실패: 포트가 이미 할당되었습니다.

뜻

Docker cannot publish a host port because another process or container is already using it.

언제 쓰나

해당 포트를 쓰는 프로세스나 컨테이너를 찾고 중지하거나 다른 호스트 포트를 선택합니다.

예시

0.0.0.0:3000에 바인딩 실패: 포트가 이미 할당되었습니다.

요청 예시

이 Docker 포트를 무엇이 쓰고 있는지 찾고 안전한 해결책을 제안해줘.

문제 해결

컨테이너 이름이 이미 사용 중

container name is already in use

충돌. 컨테이너 이름 "/my-app"이 이미 사용 중입니다.

뜻

같은 이름의 컨테이너가 이미 존재한다는 뜻입니다.

언제 쓰나

기존 컨테이너 목록을 확인한 뒤 재사용, 제거, 이름 변경 중 하나를 선택합니다.

예시

충돌. 컨테이너 이름 "/my-app"이 이미 사용 중입니다.

요청 예시

예상치 못한 데이터 삭제 없이 이 컨테이너 이름 충돌을 해결해줘.

문제 해결

빌드 캐시

Build cache

docker build --no-cache -t my-app .

뜻

Docker can reuse previous build layers to make builds faster.

언제 쓰나

변경이 반영되지 않는 것 같으면 Dockerfile 순서를 확인하거나 진단 목적으로 캐시 없이 빌드합니다.

주의

--no-cache는 빌드를 느리게 만들 수 있으므로 의도적으로 사용해야 합니다.

예시

docker build --no-cache -t my-app .

요청 예시

Docker 빌드 캐시가 내 변경을 가리고 있을 수 있는지 설명해줘.

안전 작업

docker system prune

docker system prune

docker system prune

뜻

중지된 컨테이너, 사용하지 않는 네트워크, dangling 이미지 같은 불필요한 Docker 데이터를 제거합니다.

언제 쓰나

Docker가 디스크를 많이 사용할 때 제거 대상을 이해한 뒤 사용합니다.

주의

추가 옵션을 붙이면 필요한 이미지나 볼륨까지 삭제될 수 있습니다.

예시

docker system prune

요청 예시

Docker 정리 전에 무엇이 제거되고 어떤 데이터가 안전한지 보여줘.