Engineering Tools for AI

프로그래밍

Docker

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

33 개 항목

기본 개념

Docker

Docker

docker --version

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

언제 쓰나

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

예시

docker --version

요청 예시

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

기본 개념

Docker 데몬

Docker daemon

Cannot connect to the Docker daemon

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

언제 쓰나

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

예시

Cannot connect to the Docker daemon

요청 예시

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

기본 개념

이미지

Image

node:20-alpine

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

언제 쓰나

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

예시

node:20-alpine

요청 예시

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

기본 개념

컨테이너

Container

docker ps

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

언제 쓰나

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

예시

docker ps

요청 예시

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

기본 개념

레지스트리

Registry

docker pull postgres:16

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

언제 쓰나

Docker Hub나 사설 레지스트리는 기본 이미지 또는 배포용 앱 이미지를 공유할 때 사용합니다.

예시

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

요청 예시

이 이미지를 실행하고 브라우저 접속 주소를 설명해줘.

명령어

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 관리 저장소입니다.

언제 쓰나

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

주의

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

예시

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

Bind for 0.0.0.0:3000 failed: port is already allocated

다른 프로세스나 컨테이너가 이미 쓰는 호스트 포트를 Docker가 공개하려고 해서 실패한 상황입니다.

언제 쓰나

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

예시

Bind for 0.0.0.0:3000 failed: port is already allocated

요청 예시

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

문제 해결

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

container name is already in use

Conflict. The container name "/my-app" is already in use

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

언제 쓰나

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

예시

Conflict. The container name "/my-app" is already in use

요청 예시

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

문제 해결

빌드 캐시

Build cache

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

Docker는 이전 빌드 레이어를 재사용해 빌드를 빠르게 할 수 있습니다.

언제 쓰나

변경이 반영되지 않는 것 같으면 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 정리 전에 무엇이 제거되고 어떤 데이터가 안전한지 보여줘.