Docker의 개념과 사용 방법

Docker의 개념과 사용 방법

Docker의 개념과 사용 방법에 대해 설명하는 페이지입니다.

Environment

  • OS: Raspberry Pi OS (64 bit)

목차

개요

이번 글에서는 Docker에 대해 설명하겠습니다.

Docker란?

Docker란 컨테이너 기반의 가상화 기술로, 애플리케이션과 그 환경을 이미지(Image)라는 단위로 패키지를 만들어 일관적으로 실행할 수 있도록 합니다. 이를 통해 개발자는 애플리케이션과 필요한 모든 종속성을 포함하는 패키지를 만들 수 있습니다. 이 패키지는 개발 환경, 테스트 환경, 배포 환경 어디서든 일관적으로 실행되므로 배포 환경과 개발 환경 간의 차이로 인한 문제를 줄일 수 있습니다.

Docker의 주요 개념

Docker의 주요 개념은 다음과 같습니다.

  • 이미지(Image)

    애플리케이션과 그 환경을 실행하기 위한 모든 설정, 라이브러리, 코드 등을 포함하는 일종의 템플릿입니다. 이미지는 불변(Immutable)하여 수정되지 않으며, Dockerfile이라는 설정 파일을 통해 정의됩니다. 이미지를 기반으로 컨테이너를 실행할 수 있습니다.

  • 컨테이너(Container)

    이미지를 실행한 상태로, 애플리케이션이 동작하는 독립적인 환경입니다. 여러 컨테이너를 하나의 호스트에서 독립적으로 실행할 수 있으며, 서로 간섭 없이 작동합니다. 컨테이너는 가볍고 빠르게 생성 및 삭제할 수 있으며, 시스템 자원을 더 효율적으로 사용합니다.

  • Dockerfile

    이미지를 만들기 위한 설정 파일로, 특정 환경에서 애플리케이션을 실행하는 데 필요한 명령어를 정의합니다. 이를 통해 개발자는 일관된 환경을 자동으로 구축할 수 있습니다.

  • Docker Hub

    Docker 이미지를 저장하고 공유할 수 있는 Registry로, 공식 이미지나 다른 개발자들이 만들어 공유한 이미지들을 다운로드하거나 사용할 수 있습니다. 예를 들어 docker pull node 명령어를 입력하면 Node.js 공식 이미지를 가져올 수 있습니다.

Docker의 장점

Docker의 장점은 다음과 같습니다.

  • 일관성

    개발, 테스트, 배포 환경에서 동일한 환경을 유지하여 호환성 문제를 줄일 수 있습니다.

  • 빠른 배포와 확장성

    컨테이너를 사용하면 애플리케이션을 쉽게 확장하고 빠르게 배포할 수 있으므로 DevOps와 CI/CD 파이프라인에서 유용합니다.

  • 경량성

    운영 체제 전체를 가상화하는 VM(Virtual Machine, 가상 머신)과 다르게, Docker는 애플리케이션과 필요한 종속성만을 포함하는 가벼운 환경을 제공함으로써 VM보다 가볍고, 자원을 더 효율적으로 사용할 수 있어 성능이 우수합니다.

  • 유연성

    Docker 이미지를 기반으로 여러 개의 컨테이너를 구동할 수 있으며, 각 컨테이너는 독립적으로 동작하므로 다양한 애플리케이션을 쉡게 분리하고 관리할 수 있습니다.

Docker Compose란?

Docker Compose는 여러 Docker 컨테이너를 쉽게 정의하고 함께 관리할 수 있게 해주는 도구입니다. Docker Compose를 사용하면 여러 컨테이너가 필요한 애플리케이션 설정을 YAML 파일로 정의하고, 한 번의 명령으로 애플리케이션 전체를 실행할 수 있습니다.

Docker Compose를 사용하면 좋은 경우는 복수의 컨테이너를 실행해야 하는 경우입니다. 예를 들어, 웹 서버와 데이터베이스가 함께 필요한 애플리케이션에서 웹 서버와 데이터베이스 각각을 별도의 컨테이너로 구성하고 실행하는 경우, Docker Compose를 사용하지 않으면 두 컨테이너 간 통신을 위한 네트워크를 구축하고 각각의 이미지를 docker run 명령어로 실행해야 합니다. 반면에 Docker Compose를 사용하면 docker-compose.yml 파일에 서비스(컨테이너), 네트워크, 볼륨 등의 설정을 정의하고, docker compose up 명령어 하나로 필요한 모든 컨테이너를 한 번에 실행할 수 있습니다.

Docker Compose의 주요 개념

Docker Compose의 주요 개념은 다음과 같습니다.

  • 서비스(Services)

    각각의 컨테이너를 구성하는 부분을 의미합니다.

  • 네트워크(Networks)

    서비스들간의 통신을 정의하는 가상 네트워크를 의미합니다. 각 컨테이너는 기본적으로 서로 다른 네트워크에 있기 때문에, 명시적으로 네트워크를 설정하면 서로 쉽게 통신할 수 있습니다.

  • 볼륨(Volumns)

    데이터 영속성을 위해 호스트 시스템과 컨테이너 간의 파일 시스템을 공유하는 공간을 의미합니다. 볼륨을 설정하면 컨테이너가 중지되거나 삭제되더라도 데이터가 유지됩니다.

Step 1 - Docker 설치하기

먼저 다음 명령어를 입력하여 Docker를 설치합니다.

curl -fsSL https://get.docker.com | sh

Docker가 잘 설치되었는지 다음 명렁어를 입력해서 Docker 버전을 확인합니다.

docker -v
sudo systemctl status docker

pic1

pic2

Step 2 - Docker 그룹에 사용자 추가하기

Docker 명령어는 항상 root 권한으로 실행해야 합니다. 따라서 일반 계정에서 Docker 명령어를 입력할 때 항상 sudo를 사용해야 합니다.

sudo를 입력하지 않고 Docker 명령어를 사용하려면 사용자 계정을 Docker 그룹에 추가해야 합니다. 다음 명령어를 입력하여 Docker 그룹에 사용자를 추가합니다.

sudo usermod -aG docker $USER

이후 Docker 그룹 변경 사항을 적용하기 위해 시스템을 재부팅합니다.

sudo reboot now

재부팅 이후 다음 명령어를 입력하여 Docker 그룹에 추가되었는지 확인합니다.

groups $USER

pic3

Step 3 - Docker Compose 설치하기

심볼릭 링크 생성하기

먼저 /usr/local/bin/docker-compose가 시스템 경로에 있는지 확인합니다. 없는 경우 /usr/local/bin 디렉토리를 생성한 후 아래 명령어를 입력하여 심볼릭 링크를 생성합니다.

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Docker Compose 설치하기

다음 명령어를 입력하여 Docker Compose를 설치합니다.

sudo curl -SL "https://github.com/docker/compose/releases/download/latest/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

이후 Docker Compose 바이너리 파일에 실행 권한을 부여합니다.

sudo chmod +x /usr/local/bin/docker-compose

Docker Compose가 잘 설치되었는지 다음 명렁어를 입력해서 Docker Compose 버전을 확인합니다.

docker compose --version

Step 4 - Docker 명령어 사용하기

아래의 명령어는 모두 Step 2 - Docker 그룹에 사용자 추가하기 과정을 거쳤다고 가정한 상태로 작성되었습니다.

docker search 명령어를 입력하여 Docker Hub에서 이미지를 검색할 수 있습니다. 아래 예시는 node 관련 이미지를 검색한 예시입니다.

docker search node

pic4

이미지 다운로드 - docker pull

docker pull [이미지 이름] 명령어를 입력하여 Docker Hub에서 이미지를 다운로드할 수 있습니다. 아래 예시는 node.js 공식 이미지를 다운로드받는 예시입니다.

docker pull node

이미지 목록 확인 - docker images

docker images 명령어를 입력하여 로컬에 저장된 모든 이미지 목록을 확인할 수 있습니다.

docker images

pic5

이미지 삭제 - docker rmi

docker rmi [이미지 이름] 명령어를 입력하여 특정 이미지를 삭제할 수 있습니다.

docker rmi node

이미지 빌드 - docker build

docker build -t [이미지 이름] . 명령어를 입력하여 Dockerfile을 기반으로 이미지를 빌드할 수 있습니다. 아래 예시는 현재 디렉토리에 있는 Dockerfile로 my-app이라는 이름의 최신 태그를 가진 이미지를 생성하는 예시입니다.

docker build -t my-app:latest .

컨테이너 실행 - docker run

docker run [옵션] [이미지 이름] 명령어를 입력하여 특정 이미지를 기반으로 컨테이너를 생성하고 실행할 수 있습니다. 아래 예시는 openvidu/openviud-dev:2.30.0 이미지를 기반으로 컨테이너를 생성하고 실행하는 예시입니다.

docker run -p 4443:4443 --rm -e OPENVIDU_SECRET=MY_SECRET openvidu/openvidu-dev:2.30.0

컨테이너 실행 시 사용할 수 있는 주요 옵션은 다음과 같습니다.

옵션설명
-d백그라운드에서 실행하는 옵션입니다. (Detached 모드)
-p [호스트 포트]:[컨테이너 포트]호스트와 컨테이너의 포트를 매핑합니다.
--rm컨테이너가 종료되면 자동으로 삭제되도록 설정하는 옵션입니다. 개발 및 테스트 환경에서 유용하게 사용할 수 있는 옵션입니다.
--restart always컨테이너가 중단되었을 때 자동으로 재시작합니다. 서비스가 안정적으로 유지되어야 하는 배포 환경에서 유용하게 사용할 수 있는 옵션입니다.
--restart unless-stopped수동으로 컨테이너를 중지하는 경우를 제외한 모든 경우에 대해서 자동으로 재시작합니다.
--name컨테이너의 이름을 지정합니다.
-e [환경 변수 이름]:[환경 변수 값]컨테이너에 환경 변수를 설정하는 옵션입니다.
-v [호스트 디렉토리]:[컨테이너 디렉토리]호스트와 컨테이너의 디렉토리를 매핑합니다. (볼륨)

컨테이너 목록 확인 - docker ps

docker ps 명령어를 입력하여 현재 실행 중인 컨테이너 목록을 확인할 수 있습니다. -a 옵션을 사용하면 정지된 컨테이너도 확인할 수 있습니다.

docker ps

컨테이너 정지 - docker stop

docker stop [컨테이너 이름] 명령어를 입력하여 실행 중인 특정 컨테이너를 정지할 수 있습니다.

docker stop my-app:latest

모든 컨테이너를 정지하려면 다음 명령어를 입력합니다.

docker stop $(docker ps -a -q)

컨테이너 재시작 - docker restart

docker restart [컨테이너 이름] 명령어를 입력하여 정지된 컨테이너를 재시작할 수 있습니다.

docker restart my-app

컨테이너 삭제 - docker rm

docker rm [컨테이너 이름] 명령어를 입력하여 정지된 컨테이너를 삭제할 수 있습니다.

docker rm my-app

모든 컨테이너를 삭제하려면 다음 명령어를 입력합니다.

docker rm $(docker ps -a -q)

컨테이너 로그 확인 - docker logs

docker logs [컨테이너 이름] 명령어를 입력하여 특정 컨테이너의 로그를 확인할 수 있습니다.

docker logs my-app

Step 4 - Docker Compose 명령어 사용하기

Compose 실행 - docker compose up

docker compose up [옵션] 명령어를 입력하여 현재 디렉토리에 있는 docker-compose.yml 파일을 기반으로 모든 서비스를 실행할 수 있습니다.

docker compose up

만약 특정 서비스만 실행하고 싶다면 docker compose [서비스 이름] 명령어를 입력하면 됩니다.

docker compose up my-service

Compose 확인 - docker compose ps

docker compose ps 명령어를 입력하여 현재 실행 중인 서비스를 확인할 수 있습니다.

docker compose ps

Compose 종료 - docker compose down

docker compose down 명령어를 입력하여 실행 중인 모든 Compose 서비스를 중지하고, 네트워크나 볼륨 등을 정리할 수 있습니다.

docker compose down

Compose 로그 확인 - docker compose logs

docker compose logs 명령어를 입력하여 Compose로 실행된 서비스들의 로그를 확인할 수 있습니다.

docker compose logs

Step 5 - Docker 이미지 빌드하기

Docker 이미지를 빌드하기 위해선 먼저 Dockerfile을 작성해야 합니다. 저는 제가 현재 진행하고 있는 Next.js 애플리케이션을 기준으로 Docker 이미지를 생성하겠습니다.

.dockerignore 생성하기

.dockerignore 파일은 Docker가 이미지를 빌드할 때 복사하지 말아야 할 파일이나 디렉토리를 지정하는 파일입니다. 이 파일은 Docker Context 내에 불필요한 파일들이 빌드 이미지에 포함되는 것을 방지하여, 빌드 속도를 높이고 이미지 크기를 줄이는 데 중요한 역할을 합니다.

Dockerfile을 작성하기 전에 프로젝트 최상단 디렉토리에서 .dockerignore 파일을 생성하고 다음과 같이 작성합니다.

# Node.js 환경
node_modules

# Git 관련 파일
.git
.gitignore

# 환경 설정 파일
.env

# Next.js 빌드 결과물
.next

위의 내용을 설명하자면 다음과 같습니다.

  • node_modules

    Node.js의 의존성 파일이 저장된 디렉토리로, 보통 컨테이너 안에서 생성하므로 복사할 필요가 없습니다.

  • .git.gitignore

    Git 관련 파일을 컨테이너 안에 포함할 필요가 없습니다.

  • .env

    환경 변수 정보는 보통 보안 상의 이유로 컨테이너 이미지에 포함하지 않는 것이 좋습니다.

  • 빌드 결과물

    빌드 후 생성되는 파일이 저장된 디렉토리로, 보통 컨테이너 안에서 빌드 과정이 필요한 경우 컨테이너 안에서 생성하므로 복사할 필요가 없습니다.

.dockerignore 파일을 사용했을 때의 장점은 다음과 같습니다.

  • 속도 향상

    불필요한 파일을 제외함으로써 Docker 빌드 Context 크기가 작아져 빌드 속도가 빨라집니다.

  • 이미지 최적화

    불필요한 파일을 제외함으로써 이미지 크기를 줄일 수 있습니다.

  • 보안 강화

    민감한 정보를 포함하는 파일을 이미지에서 제외함으로써 보안을 강화할 수 있습니다.

Dockerfile 작성하기

Docker 이미지를 생성하기 위해선 먼저 Dockerfile을 작성해야 합니다. VSCode에서 Dockerfile을 쉽게 작성하기 위해 다음과 같이 VSCode에서 Docker extensions를 설치합니다.

pic6

이후 프로젝트 최상단 디렉토리에서 Dockerfile 파일을 생성합니다. 다음은 Next.js 애플리케이션을 빌드하고 실행하는 Dockerfile 예시입니다.

# 1. 빌드 단계
# 생성할 Docker 이미지의 베이스가 되는 이미지를 지정합니다.
FROM node:20-alpine AS build

# 1-1. 작업 디렉토리 설정
# 애플리케이션 파일을 저장하고 실행할 기본 작업 디렉토리를 지정합니다.
# /app 디렉토리가 자동으로 생성되며, 이후의 모든 명령어가 이 디렉토리에서 실행됩니다.
WORKDIR /app

# 1-2. 의존성 파일 복사
COPY package.json package-lock.json ./

# 1-3. 의존성 설치
# 컨테이너 안에서 명령어를 실행하고 이미지를 빌드합니다.
RUN npm install --force

# 1-4. 애플리케이션 코드 복사
# 현재 디렉토리의 모든 파일을 /app 디렉토리로 복사합니다.
COPY . .

# 1-5. 환경 변수 설정
ENV NEXT_PUBLIC_BACKEND_URL=https://mafiacamp.p-e.kr

# 1-6. 애플리케이션 빌드
RUN npm run build

# 2. 런타임 단계
FROM node:20-alpine

# 2-1. 빌드 결과물과 필요한 파일만 복사
WORKDIR /app
COPY --from=build /app/.next ./.next
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/public ./public

# 2-2. 포트 설정
# 컨테이너가 사용하는 포트를 명시적으로 지정하는 명령어로, 호스트와 통신할 포트를 설정합니다.
EXPOSE 3000

# 2-3. 애플리케이션 실행
# 컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다.
# CMD는 Dockerfile에서 한 번만 사용할 수 있습니다.
CMD [ "npm", "run", "start" ]

Dockerfile을 작성한 후 다음 명령어를 입력하여 Docker 이미지를 빌드합니다.

docker build -t mafiacamp-fe .

각 단계를 자세히 설명하자면 다음과 같습니다.

1. 빌드 단계

# 1. 빌드 단계
# 생성할 Docker 이미지의 베이스가 되는 이미지를 지정합니다.
FROM node:20-alpine AS build

먼저 Docker의 멀티 스테이지 빌드 방식을 적용하기 위해 AS build로 이 이미지 단계를 build라는 이름으로 별칭을 지정하고, 나중에 다른 단계에서 이 단계의 결과물을 참조할 수 있도록 설정하였습니다. 여기서 멀티 스테이지 빌드란 여러 단계에서 빌드 작업을 진행하고, 최종 이미지에는 필요한 파일만 포함하여 이미지 크기를 최적화하는 방법을 의미합니다. 특히 빌드가 완료된 파일만 최종 프로덕션 이미지에 포함하고, 불필요한 빌드 도구나 라이브러리를 제외하여 이미지 크기를 줄일 수 있습니다.

다음으로 FROM 명령어는 생성할 Docker 이미지의 베이스가 되는 이미지를 지정합니다. Next.js 애플리케이션은 Node.js 상에서 실행되므로 node.js 20 버전을 사용하기 위해 node:20-alpine 이미지를 사용하여 가벼운 Node.js 환경을 설정합니다.

참고로 node 이미지는 개발 편의성 및 다양한 도구가 포함된 이미지로, 개발 환경이나 복잡한 빌드 작업에 적합합니다. 반면에 node:alpine 이미지는 크기가 작고 가벼운 이미지로, 프로덕션 환경이나 리소스가 제한된 환경에 적합합니다. 따라서 이미지 크기를 최소화해야 하기 위해 node:alpine 이미지를 선택하였습니다.


1-1. 작업 디렉토리 설정

# 1-1. 작업 디렉토리 설정
# 애플리케이션 파일을 저장하고 실행할 기본 작업 디렉토리를 지정합니다.
# /app 디렉토리가 자동으로 생성되며, 이후의 모든 명령어가 이 디렉토리에서 실행됩니다.
WORKDIR /app

WORKDIR는 애플리케이션 파일을 저장하고 실행할 작업 디렉토리를 지정하는 명령어입니다.


1-2. 의존성 파일 복사

# 1-2. 의존성 파일 복사
COPY package.json package-lock.json ./

COPYCOPY [source] [dest] 형식으로 사용하며, 호스트 파일 시스템의 파일이나 폴더를 컨테이너의 파일 시스템으로 복사하는 명령어입니다. 위의 예시에서는 package.jsonpackage-lock.json 파일을 먼저 복사하여 의존성 설치 준비를 마칩니다.


1-3. 의존성 설치

# 1-3. 의존성 설치
# 컨테이너 안에서 명령어를 실행하고 이미지를 빌드합니다.
RUN npm install --force

RUN은 컨테이너 안에서 명령어를 실행할 때 사용하는 명령어입니다. 위의 예시에서는 npm install 명령어로 package.json에 지정된 의존성을 설치합니다.

참고로 --force 옵션을 사용한 이유는 Next.js v15.0.2를 기준으로 React 19 RC를 사용하고 있기 때문에 라이브러리 설치가 안되는 문제를 방지하기 위해 추가하였습니다. 불필요한 경우 --force 옵션을 제외하면 됩니다.


1-4. 애플리케이션 코드 복사

# 1-4. 애플리케이션 코드 복사
# 현재 디렉토리의 모든 파일을 /app 디렉토리로 복사합니다.
COPY . .

애플리케이션의 소스 코드를 모두 복사하는 부분입니다.


1-5. 환경 변수 설정

# 1-5. 환경 변수 설정
ENV NEXT_PUBLIC_BACKEND_URL=https://mafiacamp.p-e.kr

ENV는 환경 변수를 설정하는 명령어입니다. 위에서 생성한 .dockerignore 파일에는 .env 파일을 제외하도록 설정하였기 때문에 애플리케이션 빌드 전에 필요한 환경 변수를 설정해야 합니다.


1-6. 애플리케이션 빌드

# 1-6. 애플리케이션 빌드
RUN npm run build

애플리케이션을 빌드하는 부분입니다.


2. 런타임 단계

# 2. 런타임 단계
FROM node:20-alpine

빌드가 완료된 후 불필요한 빌드 도구를 제외하고 필요한 파일만 이미지에 포함시킬 수 있도록 별칭을 사용하지 않는 새로운 node:20-alpine 이미지를 기반으로 런타임 단계를 시작합니다.


2-1. 빌드 결과물과 필요한 파일만 복사

# 2-1. 빌드 결과물과 필요한 파일만 복사
WORKDIR /app
COPY --from=build /app/.next ./.next
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/public ./public

--from=build라는 옵션을 사용하여 build 단계에서 생성된 파일 중에서 애플리케이션을 실행하는 데 필요한 파일들만 복사합니다.


2-2. 포트 설정

# 2-2. 포트 설정
# 컨테이너가 사용하는 포트를 명시적으로 지정하는 명령어로, 호스트와 통신할 포트를 설정합니다.
EXPOSE 3000

EXPOSE는 컨테이너가 사용하는 포트를 명시적으로 지정하는 명령어로, 호스트와 통신할 포트를 설정합니다. 위의 예시에서는 3000 포트를 노출하여 외부에서 애플리케이션에 접근 가능하도록 설정합니다.


2-3. 애플리케이션 실행

# 2-3. 애플리케이션 실행
# 컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다.
# CMD는 Dockerfile에서 한 번만 사용할 수 있습니다.
CMD [ "npm", "run", "start" ]

CMD는 컨테이너가 시작될 때 실행할 명령어를 지정하는 명령어입니다. CMD는 하나의 Dockerfile 안에서 한 번만 사용할 수 있습니다. 위의 예시에서는 npm run start 명령어를 실행하여 Next.js 애플리케이션을 실행합니다.


이미지 빌드하기

Dockerfile이 있는 디렉토리에서 터미널을 열고 다음 명령어를 입력하여 Docker 이미지를 빌드합니다.

docker build -t mafiacamp-fe .

아래 결과는 위의 Dockerfile을 기반으로 Docker 이미지를 빌드한 결과 예시입니다.

PS C:\Users\user\문\vscode\web12-MafiaCamp\FE> docker build -t mafiacamp-fe .
[+] Building 140.9s (15/15) FINISHED                                                                                           docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                           0.0s
 => => transferring dockerfile: 1.93kB                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/node:20-alpine                                                                              1.8s
 => [internal] load .dockerignore                                                                                                              0.0s
 => => transferring context: 174B                                                                                                              0.0s
 => [build 1/6] FROM docker.io/library/node:20-alpine@sha256:c13b26e7e602ef2f1074aef304ce6e9b7dd284c419b35d89fcf3cc8e44a8def9                  0.0s
 => => resolve docker.io/library/node:20-alpine@sha256:c13b26e7e602ef2f1074aef304ce6e9b7dd284c419b35d89fcf3cc8e44a8def9                        0.0s
 => [internal] load build context                                                                                                              0.0s
 => => transferring context: 6.29kB                                                                                                            0.0s
 => CACHED [build 2/6] WORKDIR /app                                                                                                            0.0s
 => CACHED [build 3/6] COPY package.json package-lock.json ./                                                                                  0.0s
 => CACHED [build 4/6] RUN npm install --force                                                                                                 0.0s
 => [build 5/6] COPY . .                                                                                                                       0.2s
 => [build 6/6] RUN npm run build                                                                                                             77.1s
 => [stage-1 3/6] COPY --from=build /app/.next ./.next                                                                                         1.2s
 => [stage-1 4/6] COPY --from=build /app/node_modules ./node_modules                                                                           4.5s
 => [stage-1 5/6] COPY --from=build /app/package.json ./package.json                                                                           0.2s
 => [stage-1 6/6] COPY --from=build /app/public ./public                                                                                       0.1s
 => exporting to image                                                                                                                        45.0s
 => => exporting layers                                                                                                                       33.8s
 => => exporting manifest sha256:1cbf4b5bee24744bfe02047906dab35edfd26e2d7e859d2d48126d5976948c26                                              0.0s
 => => exporting config sha256:d667149ae2af3795ca5b414568d640435664cb894727eb73af12f28b220ae24e                                                0.0s
 => => exporting attestation manifest sha256:a445a77eb5e50e332d06b5145d3437746bcb35a2f7f3596b9b277c089bab4dad                                  0.0s
 => => exporting manifest list sha256:d3e238644af5f4a6d2a27b9fc4051e83d1fb8f133120608debaebc30f9f8c0a2                                         0.0s
 => => naming to docker.io/library/mafiacamp-fe:latest                                                                                         0.0s
 => => unpacking to docker.io/library/mafiacamp-fe:latest                                                                                     11.0s

Step 6 - 컨테이너 실행하기

Docker 이미지가 빌드된 후 다음 명령어를 입력하여 컨테이너를 실행합니다.

docker run -p 3000:3000 --rm mafiacamp-fe

컨테이너를 실행한 결과는 다음과 같습니다.

pic7

참고 자료

Comments