기본 개념
Docker
Docker
docker --version뜻
애플리케이션 실행환경을 컨테이너로 묶고 실행하는 도구입니다.
언제 쓰나
다른 컴퓨터에서도 같은 OS 패키지, 런타임, 의존성으로 앱을 실행하고 싶을 때 사용합니다.
예시
docker --version요청 예시
이 프로젝트를 Docker로 실행할 수 있는지 설명해줘.
프로그래밍
Docker 이미지, 컨테이너, Dockerfile, Docker Compose, 포트 연결, 볼륨, 로그 확인, 자주 보는 오류를 이해하기 위한 검색형 가이드입니다.
33 개 항목
기본 개념
Docker
docker --version애플리케이션 실행환경을 컨테이너로 묶고 실행하는 도구입니다.
다른 컴퓨터에서도 같은 OS 패키지, 런타임, 의존성으로 앱을 실행하고 싶을 때 사용합니다.
docker --version이 프로젝트를 Docker로 실행할 수 있는지 설명해줘.
기본 개념
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:16Docker 이미지를 저장하고 내려받는 서버입니다.
Docker Hub and private registries are used to share base images or deployable app images.
docker pull postgres:16이 이미지가 어디에서 내려받아지는지 설명해줘.
Dockerfile
Dockerfile
DockerfileDocker 이미지를 어떻게 만들지 정의하는 파일입니다.
의존성을 설치하고 앱 파일을 복사하고 앱 시작 명령을 정의할 때 사용합니다.
Dockerfile이 Dockerfile을 읽고 빌드 단계를 요약해줘.
Dockerfile
FROM
FROM node:20-alpineDockerfile에서 기본 이미지를 선택하는 명령입니다.
시작 OS 계층과 런타임 버전을 결정하는 경우가 많습니다.
기본 이미지를 바꾸면 사용 가능한 명령, 보안 업데이트, 이미지 크기에 영향을 줄 수 있습니다.
FROM node:20-alpine이 FROM 이미지에 무엇이 포함되는지 설명해줘.
Dockerfile
WORKDIR
WORKDIR /app이후 명령이 실행될 컨테이너 내부 작업 폴더를 설정합니다.
COPY, RUN, CMD가 예측 가능한 앱 폴더 기준으로 동작하게 할 때 사용합니다.
WORKDIR /app이 Dockerfile이 어떤 폴더를 앱 디렉터리로 쓰는지 설명해줘.
Dockerfile
COPY
COPY package.json package-lock.json ./빌드 컨텍스트의 파일을 이미지 안으로 복사합니다.
의존성 파일, 소스 코드, 정적 asset을 이미지에 넣을 때 사용합니다.
COPY package.json package-lock.json ./이 COPY 단계가 이미지에 어떤 파일을 넣는지 알려줘.
Dockerfile
RUN
RUN npm ci이미지를 빌드하는 중에 명령을 실행합니다.
OS 패키지 설치, 의존성 설치, 앱 빌드에 사용합니다.
RUN 은 컨테이너가 시작될 때가 아니라 이미지 빌드 시점에 실행됩니다.
RUN npm ciDockerfile의 빌드 시점 명령과 컨테이너 시작 명령을 구분해줘.
Dockerfile
CMD
CMD ["npm", "run", "start"]컨테이너가 시작될 때 기본으로 실행할 명령을 정의합니다.
웹 서버, API 서버, worker, 스크립트를 시작할 때 사용합니다.
CMD ["npm", "run", "start"]이 컨테이너가 어떤 명령으로 시작되는지 알려줘.
Dockerfile
EXPOSE
EXPOSE 3000컨테이너 안의 앱이 어떤 포트를 사용할 것으로 기대되는지 문서화합니다.
힌트로 사용하고 실제 공개는 docker run -p 또는 compose ports로 설정합니다.
EXPOSE 만으로는 애플리케이션이 브라우저에서 접근 가능하게 되지 않습니다.
EXPOSE 3000이 EXPOSE 포트가 실제로 공개되는지 설명해줘.
Dockerfile
.dockerignore
node_modulesDocker 빌드 컨텍스트에서 제외할 경로를 지정하는 파일입니다.
로컬 의존성, 빌드 결과물, 비밀값, 임시 파일이 이미지 빌드에 들어가지 않게 할 때 사용합니다.
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 up하나의 YAML 파일로 여러 Docker 서비스를 함께 실행하는 도구입니다.
앱, 데이터베이스, 캐시, worker 같은 로컬 개발 구성을 함께 실행할 때 사용합니다.
docker compose up이 compose 파일이 어떤 서비스를 시작하는지 설명해줘.
Docker Compose
services
services: web: db:compose 파일에서 이름 붙여 정의하는 앱 구성 단위입니다.
web 서비스는 앱을 실행하고 db 서비스는 PostgreSQL을 실행하는 식으로 구성합니다.
services: web: db:이 compose 파일의 services를 나열하고 각각 무엇을 하는지 설명해줘.
Docker Compose
docker compose up
docker compose up -dcompose 파일에 정의된 서비스를 시작합니다.
서비스를 백그라운드에서 실행하려면 -d 옵션을 사용합니다.
docker compose up -dcompose 서비스를 시작하고 어떤 서비스가 실행 중인지 보여줘.
Docker Compose
docker compose down
docker compose downcompose가 만든 컨테이너를 중지하고 제거합니다.
로컬 개발 구성을 다 사용한 뒤 정리할 때 사용합니다.
명시적으로 볼륨을 제거하지 않으면 named volume은 보통 남습니다.
docker compose down영구 데이터를 삭제하지 않고 이 compose 구성을 중지해줘.
명령어
docker build
docker build -t my-app .Dockerfile과 컨텍스트를 사용해 Docker 이미지를 만듭니다.
Dockerfile을 만들었거나 앱 의존성을 바꾼 뒤 사용합니다.
docker build -t my-app .이 Docker 이미지를 빌드하고 오류가 있으면 요약해줘.
명령어
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 -a를 사용합니다.
docker ps실행 중인 컨테이너와 공개된 포트를 보여줘.
명령어
docker stop
docker stop my-app실행 중인 컨테이너를 중지합니다.
컨테이너를 제거하거나 포트를 비우기 전에 사용합니다.
docker stop my-app3000 포트를 쓰는 컨테이너를 중지해줘.
명령어
docker logs
docker logs my-app컨테이너의 로그를 출력합니다.
컨테이너가 종료되거나 앱이 응답하지 않을 때 확인합니다.
docker logs my-app이 컨테이너 로그를 읽고 첫 번째 오류를 찾아줘.
명령어
docker exec
docker exec -it my-app sh이미 실행 중인 컨테이너 안에서 명령을 실행합니다.
컨테이너 내부 파일, 환경변수, 설치 도구를 확인할 때 사용합니다.
컨테이너 안에서 수동으로 바꾼 내용은 컨테이너를 다시 만들면 사라질 수 있습니다.
docker exec -it my-app sh이 컨테이너 안에서 shell을 열고 환경변수를 확인해줘.
포트와 네트워크
ports
3000:3000내 컴퓨터의 포트를 컨테이너 내부 포트에 연결합니다.
브라우저가 컨테이너 안에서 실행 중인 웹앱에 접속할 수 있게 할 때 사용합니다.
왼쪽은 내 컴퓨터 포트이고 오른쪽은 컨테이너 내부 포트입니다.
3000:3000이 ports 설정에서 어떤 URL로 접속해야 하는지 설명해줘.
포트와 네트워크
localhost in Docker
host.docker.internalDocker 안에서 실행되는 코드의 localhost는 내 컴퓨터가 아니라 컨테이너 자신을 뜻할 수 있습니다.
compose 네트워크에서는 서비스 이름을 쓰고, 컨테이너가 호스트에 접근해야 할 때는 host.docker.internal을 고려합니다.
host.docker.internal이 컨테이너에서 localhost로 데이터베이스에 접근되지 않는 이유를 설명해줘.
파일과 데이터
Volume
db-data:/var/lib/postgresql/dataDocker-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
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중지된 컨테이너, 사용하지 않는 네트워크, dangling 이미지 같은 불필요한 Docker 데이터를 제거합니다.
Docker가 디스크를 많이 사용할 때 제거 대상을 이해한 뒤 사용합니다.
추가 옵션을 붙이면 필요한 이미지나 볼륨까지 삭제될 수 있습니다.
docker system pruneDocker 정리 전에 무엇이 제거되고 어떤 데이터가 안전한지 보여줘.