기본 개념
Docker
Docker
docker --version뜻
애플리케이션 실행환경을 컨테이너로 묶고 실행하는 도구입니다.
언제 쓰나
다른 컴퓨터에서도 같은 OS 패키지, 런타임, 의존성으로 앱을 실행하고 싶을 때 사용합니다.
예시
docker --version요청 예시
이 프로젝트를 Docker로 실행할 수 있는지 설명해줘.
프로그래밍
Docker 이미지, 컨테이너, Dockerfile, Docker Compose, 포트 연결, 볼륨, 로그 확인, 자주 보는 오류를 이해하기 위한 검색형 가이드입니다.
33 개 항목
기본 개념
Docker
docker --version애플리케이션 실행환경을 컨테이너로 묶고 실행하는 도구입니다.
다른 컴퓨터에서도 같은 OS 패키지, 런타임, 의존성으로 앱을 실행하고 싶을 때 사용합니다.
docker --version이 프로젝트를 Docker로 실행할 수 있는지 설명해줘.
기본 개념
Docker daemon
Cannot connect to the Docker daemon이미지를 빌드하고 컨테이너를 실행하는 백그라운드 서비스입니다.
Docker 명령이 연결되지 않으면 Docker Desktop 또는 Docker 서비스가 실행 중인지 확인해야 합니다.
Cannot connect to the Docker daemonDocker 명령이 데몬에 연결되지 않는 이유를 확인해줘.
기본 개념
Image
node:20-alpine컨테이너를 만들기 위한 재사용 가능한 실행환경 템플릿입니다.
이미지는 컨테이너가 어떤 OS, 런타임, 라이브러리, 앱 파일로 시작할지 정의합니다.
node:20-alpine이 Dockerfile이 어떤 기본 이미지를 쓰는지 알려줘.
기본 개념
Container
docker ps이미지에서 만들어진 실행 중이거나 중지된 인스턴스입니다.
앱, 데이터베이스, 캐시, worker를 분리된 환경에서 실행할 때 사용합니다.
docker ps실행 중인 컨테이너를 나열하고 각각 무엇을 하는지 설명해줘.
기본 개념
Registry
docker pull postgres:16Docker 이미지를 저장하고 내려받는 서버입니다.
Docker Hub나 사설 레지스트리는 기본 이미지 또는 배포용 앱 이미지를 공유할 때 사용합니다.
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이 이미지를 실행하고 브라우저 접속 주소를 설명해줘.
명령어
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/data컨테이너 생명주기 밖에서도 데이터를 보관할 수 있는 Docker 관리 저장소입니다.
컨테이너를 다시 만들어도 남아야 하는 데이터베이스 데이터 등에 사용합니다.
볼륨을 제거하면 영구 데이터가 삭제될 수 있습니다.
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
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중지된 컨테이너, 사용하지 않는 네트워크, dangling 이미지 같은 불필요한 Docker 데이터를 제거합니다.
Docker가 디스크를 많이 사용할 때 제거 대상을 이해한 뒤 사용합니다.
추가 옵션을 붙이면 필요한 이미지나 볼륨까지 삭제될 수 있습니다.
docker system pruneDocker 정리 전에 무엇이 제거되고 어떤 데이터가 안전한지 보여줘.