반응형
1. 도커 이미지 관련 명령어
- 이미지 다운로드 (기본적으로 :latest 태그가 적용되어 최신 버전의 이미지를 다운) :
$ docker pull [이미지명]
- 특정 버전 다운로드 :
$ docker pull [이미지명]:[태그명]
- 이미지 조회 :
$ docker image ls
- 이미지 삭제 :
$ docker image rm [이미지ID]
- 이미지 강제 삭제 (삭제가 안 되는 경우) :
$ docker image rm -f [이미지ID]
- 이미지 전체 강제 삭제 :
$ docker image rm $(docker images -q)
2. 컨테이너 관련 명령어
- 컨테이너 생성 :
$ docker create [이미지]
(로컬에 없으면 자동으로 이미지를 다운로드 후 컨테이너를 생성)
- 컨테이너 목록 전체 조회 :
$ docker ps -a
- 실행 중인 컨테이너만 조회 :
$ docker ps
- 컨테이너 실행 :
$ docker start [컨테이너ID]
- 컨테이너 생성 및 실행(run) :
$ docker run [이미지명]
(run 명령어는 이미지를 다운로드하고 컨테이너를 생성 및 실행하는 과정을 모두 포함하고있다.)
- 포그라운드, 백그라운드 실행 및 차이
- 포그라운드 : 실행 중인 프로그램의 출력이 화면에 실시간으로 노출되어 확인이 빠르다는 장점
- 백그라운드 : 실해 중인 프로그램의 정보가 화면에 출력되지 않고, 컴퓨터 내부적으로 동작
- 컨테이너 정지(stop):컨테이너를 정상적으로 종료하며, 실행 중인 프로세스를 안전하게 중단.
$ docker stop [컨테이너ID]
- 강제 종료(kill):실행 중인 프로세스를 즉시 종료. (stop 명령어로 컨테이너를 종료할 수 없을 때 사용)
$ docker kill [컨테이너ID]
- 컨테이너 여러 개 동시에 삭제 :
$ docker rm [컨테이너ID1] [컨테이너ID2] [컨테이너ID3]
- 컨테이너 이름을 지정하며 실행 :
$ docker run -d --name [컨테이너이름] [이미지명]
- 호스트 포트와 컨테이너 포트를 매핑하여 실행 :
- 4000은 호스트에서 사용하는 포트 번호이며, 80은 컨테이너 내부에서 사용하는 포트 번호이다.
- 컨테이너 내부의 포트는 Nginx와 같은 서비스의 기본 포트를 사용해야 정상적으로 동작한다.
$ docker run -d -p 4000:80 nginx

2-1. 컨테이너 디버깅
- 컨테이너 조회
$ docker logs [컨테이너ID]
- 컨테이너 최신 로그 10줄 불러오기
$ docker logs -tail 10 [컨테이너ID]
- 실시간 로그 확인
$ docker logs -f [컨테이너ID]
- 현 시점 부로 실시간 로그 조회
$ docker logs --tail 0 -f [컨테이너ID]
- 실행 중인 컨테이너 내부 접속
$ docker exec -it [컨테이너ID] bash
3 작업 디렉토리 지정 (WORKDIR)
WORKDIR의 사용 이유
WORKDIR은 Dockerfile에서 컨테이너 내부의 작업 디렉토리를 설정하는 명령어다. 이 명령어는 이후 명령어들이 실행될 디렉토리를 지정하며, 지정된 디렉토리가 없으면 도커가 자동으로 디렉토리를 생성한다.
- 작업 디렉토리 설정:
- 이후 명령어(RUN, CMD, COPY, ADD 등)가 실행될 기본 디렉토리를 지정한다.
- 명령어마다 디렉토리를 명시하지 않아도 되기 때문에 Dockerfile을 더 간결하고 가독성 있게 작성할 수 있다.
- 동일한 작업 디렉토리 유지:
- 컨테이너 실행 시 동일한 작업 디렉토리를 유지하여 일관성을 제공한다.
- 예를 들어, 애플리케이션이 /app 디렉토리에 저장되고 실행된다면, WORKDIR을 사용해 이를 명확히 지정할 수 있다.
- 명령어 단순화:
- 디렉토리를 명시하지 않고, 상대 경로를 사용할 수 있어 Dockerfile 작성이 간소화된다.
- 예: RUN npm install을 사용하면, 현재 WORKDIR에서 실행된다.
- 코드 이동 시 유연성 제공:
- 프로젝트 디렉토리가 변경되더라도, WORKDIR만 수정하면 다른 명령어는 수정하지 않아도 된다.
# 베이스 이미지 지정
FROM node:16
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY package.json /app
RUN npm install
# 애플리케이션 파일 복사
COPY . /app
# 컨테이너 실행 시 실행될 명령어
CMD ["npm", "start"]
EXPOSE의 사용 이유
EXPOSE는 Dockerfile에서 컨테이너가 외부와 통신하기 위해 사용하는 포트를 명시적으로 선언하는 명령어다. 이를 통해 컨테이너가 어떤 네트워크 포트를 사용할지를 지정하며, 이는 도커 이미지와 컨테이너 간의 문서화 역할을 한다.
EXPOSE의 주요 역할
- 포트 명시 및 문서화:
- EXPOSE는 컨테이너가 사용하는 포트를 명시하여 다른 개발자나 시스템이 해당 컨테이너의 네트워크 구성을 쉽게 이해할 수 있도록 돕는다.
- 예: 웹 서버는 일반적으로 80번 포트를 사용하며, 이를 명시적으로 EXPOSE하면 해당 이미지의 기본 동작을 알기 쉽다.
- 컨테이너와 외부 네트워크 연결 지원:
- EXPOSE는 컨테이너가 외부 네트워크와 통신할 준비가 되었음을 Docker에게 알린다.
- 하지만 EXPOSE만으로는 포트가 호스트와 연결되지는 않는다. 실제 연결은 -p 또는 -P 옵션을 사용해야 한다.
- 기본 네트워크 환경 구성:
- docker run 명령어에서 -P 옵션을 사용하면 EXPOSE로 정의된 포트가 자동으로 호스트의 가용 포트와 매핑된다.
# 베이스 이미지 설정
FROM node:16
# 작업 디렉토리 설정
WORKDIR /app
# 애플리케이션 복사 및 설치
COPY . /app
RUN npm install
# 애플리케이션이 사용할 포트 명시
EXPOSE 3000
# 애플리케이션 실행 명령어
CMD ["npm", "start"]
반응형