티스토리 뷰

Docker

Docker는 애플리케이션을 컨테이너 안에서 실행할 수 있게 도와주는 가상화 플랫폼입니다.
소프트웨어를 개발하고 배포하는 과정에서 일관성과 효율성을 보장하기 위해 컨테이너라는 격리된 환경을 제공합니다.
 

 

컨테이너는 애플리케이션과 그 애플리케이션이 실행되기 위해 필요한 모든 라이브러리, 종속성을 하나로 묶은 패키지입니다.

이로 인해 개발 환경에서 테스트한 애플리케이션을 운영 환경으로 옮길 때 환경 불일치 문제를 최소화할 수 있습니다.

 

 

 

  • 이미지(Image): 애플리케이션을 실행하기 위한 모든 코드, 런타임, 라이브러리, 설정 파일 등을 포함한 읽기 전용 템플릿입니다. Docker 이미지는 애플리케이션을 컨테이너로 배포할 수 있는 기반이 됩니다.
  • 컨테이너(Container): 이미지를 기반으로 실행되는 인스턴스입니다. 컨테이너는 가벼운 가상화 환경으로, 동일한 운영체제 커널을 공유하지만 각자 독립적으로 실행됩니다.
  • Dockerfile: 이미지를 생성하기 위해 사용되는 설정 파일입니다. Dockerfile은 어떤 베이스 이미지를 사용할지, 애플리케이션을 어떻게 빌드할지, 필요한 명령어를 어떻게 실행할지를 정의합니다.
  • Docker Hub: Docker 이미지를 공유할 수 있는 공개 레지스트리입니다. 일반적으로 Docker Hub에서 이미지를 가져와 사용하거나, 직접 만든 이미지를 업로드할 수 있습니다.

👉 React와 같은 프론트엔드 애플리케이션도 Docker를 이용해 컨테이너화할 수 있으며, 이를 통해 운영 환경에서도 로컬 환경과 동일한 설정을 사용해 안정성을 높일 수 있습니다.

 

Docker의 동작 과정 예시

출처 : 패스트캠퍼스 - 프론트엔드 웹 개발의 모든 것

  1. 도커 클라이언트 명령 실행
    • 사용자가 Docker 클라이언트에 명령어 (docker run hello-world)를 입력합니다.
    • 이 명령은 **Docker 서버(Docker Daemon)**로 요청을 보냅니다.
  2. 이미지 확인 및 다운로드
    • Docker 서버는 요청받은 이미지(예: hello-world)가 로컬에 캐시되어 있는지 확인합니다.
    • 만약 이미지가 로컬에 없다면, Unable to find image ~라는 메시지를 출력합니다.
    • 그 다음 Docker Hub(또는 지정된 레지스트리)에서 해당 이미지를 다운로드합니다.
    • 다운로드한 이미지는 로컬에 캐시로 보관됩니다.
  3. 컨테이너 생성
    • 이제 로컬에 이미지가 있으므로 Docker 서버는 이 이미지를 사용해 컨테이너를 생성합니다.
  4. 컨테이너 실행
    • 생성된 컨테이너는 이미지에 정의된 설정 및 조건에 따라 프로그램을 실행합니다.
    • 예를 들어 hello-world 이미지의 경우, 간단한 메시지를 출력하는 프로그램을 실행합니다.
특성 Docker 이미지  Docker 컨테이너
성격 정적 템플릿, 읽기 전용 실행 가능한 인스턴스, 가변적
생성 목적 컨테이너를 생성하기 위한 템플릿 이미지를 기반으로 실행되는 애플리케이션
변경 가능성 변경 불가, 재빌드 필요 실행 중에 데이터 수정 가능, 일회성 변경
역할 설치 파일과 같은 역할 실제로 애플리케이션을 실행하는 환경

 

Docker의 이미지 생성 과정

  1. Docker 파일 작성 (Dockerfile 작성)
    • Docker 이미지를 만들기 위해 Dockerfile이라는 설정 파일을 작성합니다. 이 파일에는 컨테이너가 어떻게 구성되고 동작해야 하는지에 대한 모든 설정을 정의합니다.
    • 예를 들어, 어떤 베이스 이미지를 사용할지, 어떤 라이브러리를 설치할지, 애플리케이션을 어떻게 빌드할지 등을 명시합니다.
  2. Docker 클라이언트 명령 실행
    • 터미널에서 사용자가 Docker 클라이언트에 명령어를 입력합니다. 예를 들어, docker build 명령을 사용해서 Docker 이미지를 빌드하도록 요청합니다.
    • 이 명령은 Docker 클라이언트를 통해 **Docker 서버(Docker Daemon)**로 전달됩니다.
  3. Docker 서버 (Docker Daemon)에서 이미지 빌드
    • Docker 서버는 Docker 클라이언트로부터 명령을 받아 Dockerfile을 읽고 이미지를 생성하는 중요한 작업을 수행합니다.
    • 이 과정에서 Docker는 Dockerfile의 지시 사항에 따라 필요한 파일을 복사하고, 패키지를 설치하고, 애플리케이션을 빌드합니다.
    • 빌드가 완료되면 Docker 이미지를 생성하고, 해당 이미지를 로컬 캐시로 보관합니다.
  4. Docker 이미지 생성
    • 빌드 과정을 통해 최종적으로 Docker 이미지가 생성됩니다.
    • 이 이미지는 나중에 컨테이너를 실행할 수 있는 기초 자료가 되며, 여러 번 재사용이 가능합니다.

Dockerfile 생성 순서

Docker 이미지를 생성하기 위한 설정 파일로, Dockerfile을 사용해 애플리케이션을 컨테이너화하고 이미지로 빌드할 수 있습니다. React 애플리케이션과 같은 경우도 Dockerfile을 통해 이미지로 만들 수 있다.
  1. 베이스 이미지 선택 (FROM)
    • Dockerfile의 첫 번째 명령은 어떤 베이스 이미지를 사용할지를 지정하는 것입니다.
    • React 애플리케이션의 경우, 일반적으로 Node.js를 베이스 이미지로 사용합니다.
    • 예: FROM node:16
  2. 작업 디렉토리 설정 (WORKDIR)
    • 애플리케이션을 실행하거나 빌드할 작업 디렉토리를 설정합니다.
    • 예: WORKDIR /app
  3. 필요한 파일 복사 (COPY)
    • 애플리케이션의 종속성을 설치하기 위해 필요한 파일(package.json과 package-lock.json)을 컨테이너로 복사합니다.
    • 예: COPY package.json ./ COPY package-lock.json ./
  4. 의존성 설치 (RUN)
    • npm install 또는 yarn install을 통해 애플리케이션의 의존성을 설치합니다.
    • 예: RUN npm install
  5. 애플리케이션 파일 복사 (COPY)
    • 애플리케이션의 전체 소스 코드를 컨테이너로 복사합니다.
    • 예: COPY . ./
  6. 애플리케이션 빌드 (RUN)
    • React 애플리케이션을 빌드합니다.
    • 예: RUN npm run build
  7. 정적 파일 서빙 설정 (Nginx 또는 다른 서버 사용)
    • 빌드된 파일을 서빙하기 위해 웹 서버를 설정합니다.
    • 일반적으로 Nginx를 사용하여 정적 파일을 서빙합니다.
    • 이를 위해 빌드한 결과물을 복사하는 단계가 필요합니다.
    • 예: COPY --from=build /app/build /usr/share/nginx/html
  8. 포트 설정 (EXPOSE)
    • 컨테이너가 어떤 포트에서 서비스할 것인지 설정합니다.
    • 예: EXPOSE 80
  9. 기본 명령 설정 (CMD)
    • 컨테이너가 실행될 때 실행할 기본 명령을 지정합니다.
    • 예: CMD ["nginx", "-g", "daemon off;"]
# 1. Node.js 이미지 사용 (빌드 단계)
FROM node:16 AS build

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 패키지 파일 복사 및 의존성 설치
COPY package.json ./
COPY package-lock.json ./
RUN npm install

# 4. 소스 코드 복사 및 애플리케이션 빌드
COPY . ./
RUN npm run build

# 5. 빌드된 파일을 서빙하기 위한 Nginx 이미지 사용 (프로덕션 단계)
FROM nginx:alpine

# 6. 빌드 결과물을 Nginx 기본 정적 파일 위치로 복사
COPY --from=build /app/build /usr/share/nginx/html

# 7. Nginx가 사용할 포트 공개
EXPOSE 80

# 8. Nginx 실행
CMD ["nginx", "-g", "daemon off;"]
    1. 빌드 이미지 선택 및 작업 디렉토리 설정
      • FROM node:16 AS build는 Node.js 이미지(버전 16)를 사용해 빌드 환경을 구성합니다.
      • WORKDIR /app은 컨테이너 안에서 /app이라는 디렉토리를 작업 디렉토리로 설정합니다.
    2. 패키지 설치
      • COPY package.json ./과 COPY package-lock.json ./을 사용해 package.json 파일을 컨테이너로 복사하고, RUN npm install로 종속성을 설치합니다.
    3. 애플리케이션 빌드
      • 소스 코드를 복사한 후(COPY . ./), RUN npm run build로 React 애플리케이션을 빌드합니다. 빌드된 결과물은 /app/build 디렉토리에 생성됩니다.
    4. 프로덕션 설정
      • FROM nginx:alpine은 Nginx를 사용하여 빌드된 정적 파일을 서빙합니다.
      • COPY --from=build /app/build /usr/share/nginx/html로 빌드된 결과물을 Nginx의 기본 웹 루트(/usr/share/nginx/html)로 복사합니다.
      • EXPOSE 80은 컨테이너 외부로 포트 80을 공개합니다.
      • CMD ["nginx", "-g", "daemon off;"]는 Nginx를 실행하여 정적 파일을 서비스합니다.

Dockerfile로 이미지 빌드 및 실행

  1. 이미지 빌드
docker build ./ 또는 docker build -t my-react-app
    • 터미널에서 프로젝트 폴더로 이동한 후 명령어로 이미지를 빌드합니다.
    • my-react-app은 생성될 이미지의 이름입니다.
  1. 컨테이너 실행

docker run -p 3000:80 my-react-app
    • 이미지를 기반으로 컨테이너를 실행합니다.
    • -p 3000:80은 호스트의 포트 3000을 컨테이너의 포트 80에 매핑하여 웹 브라우저에서 http://localhost:3000으로 접속할 수 있도록 합니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함