컨테이너 기반 오픈소스 가상화 플랫폼으로
라이브러리, 시스템 도구, 코드, 런타임을 포함한 소프트웨어를 컨테이너로 패키징하기 위한 도구이다.

기존 Virtual Machine 가상화는 Hipervisor 위에 Guest OS가 구동된다.
별도의 VM과 OS를 필요로 하기 때문에 자원의 비효율성이 존재할 수 밖에 없다.
반면 Container 가상화의 경우 Docker 엔진을 통해 각 App이 실행에 필요한 자원만 OS 자원에 직접 접근하여 사용한다.
특정 프로세스를 실행하기 위한(즉, 컨테이너 생성 및 실행에 필요한) 모든 파일과 설정값을 지닌 것으로, 더이상의 의존성 파일을 컴파일하거나 설치할 필요 없는 상태의 파일을 의미한다.
Image를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징(캡슐화)하여 격리된 공간에서 프로세스를 동작시키는 기술이다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMEND] [ARG...]
사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(PULL)한 후 컨테이너를 생성하고 시작해준다.
예를 들어 redis 컨테이너를 다운로드하고 실행하려면 다음과 같다.
(docker run -d -p 6379:6379 redis)
docker start/stop/rm {CONTAINER ID}
권한 문제로 거절시 sudo aa-remove-unknown 후 위 명령어 입력
docker ps [OPTIONS]
docker logs {CONTAINER ID}
docker exec -it {CONTAINER ID} bash
도커 이미지를 생성하기 위한 명령어를 포함하는 스크립트 파일.
즉 미리 짜여진 이미지를 사용하는 것이 아니라 이미지를 커스텀하여 만드는 것이라 볼 수 있다.
도커 이미지를 생성할 base 이미지 지정
Shell의 cd 명렁어처럼 컨테이너 상에서 작업 디렉터리로 전환을 위해 사용된다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 이후 등장하는 명령어를 해당 디렉터리를 기준으로 실행된다.
FROM으로 생성된 이미지내에서 실행할 명령어 지정.
보통 이미지 안에 특정 소프트웨어를 설치하기 위해 사용된다.
(npm, apt, pip 등)
Docker Image로부터 외부로 노출할 TCP 또는 UDP 포트 번호 지정
default는 TCP 포트이고, UDP 포트를 지정하기 위한 예는 다음과 같다
ex. EXPOSE 9999/UDP
** 주의
EXPOSE 명령문으로 지정된 포트는 해당 컨테이너 내부에서만 유효하다.
따라서 호스트 컴퓨터에서 컨테이너의 지정 포트로 접근을 허용하려면
DOCKER RUN 커멘드에서 -p 옵션을 통해 포트 포워딩 처리를 해주어야 한다.
이미지를 컨테이너로 띄울 때 항상 실행되어야 하는 커맨드를 지정할 때 사용된다.
ex. ENTRYPOINT ["java", "-jar", "app.jar"]
호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해 사용된다.
ex. COPY package.json package.json
환경 변수를 설정하기 위해 사용된다.
ENV 명령문으로 설정된 환경 변수는 이미지 빌드 시에도 사용되고, 해당 컨테이너에서 돌아가는 애플리케이션에서도 접근할 수 있다.
ex. ENV NODE_ENV production
컨테이너 안에 있는 데이터는 컨테이너를 삭제하면 모든 데이터가 같이 삭제된다.
따라서 데이터를 보존하기 위해 VOLUME을 사용하고, VOLUME 명령은 설정된 컨테이너의 데이터를 호스트 OS에 저장하거나, 컨테이너들 간의 데이터 공유를 가능하게 한다.
(즉 볼륨으로 지정된 호스트os 경로와, 컨테이너 경로가
FROM amazoncorretto:17-alpine-jdk AS builder
LABEL authors="seungsu"
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootJar
FROM amazoncorretto:17-alpine-jdk
ARG JAR_FILE_PATH=build/libs/*.jar
COPY --from=builder ${JAR_FILE_PATH} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
작성이 완료된 Dockerfile을 빌드하려면 다음 명령어를 입력한다.
docker build -t {image-name} --file {Dockerfile-name} {working-dir}
ex. docker build -t test --file Dockerfile .
docker images
docker run -d -p 8080:8080 {image-name}
컨테이너 실행 후 localhost:8080 접속해보기