도커로 리액트 실행하기

도커로 리액트 실행하기

01. 도커(Docker)를 사용하는 이유

= 어떠한 프로그램을 다운 받는 과정을 굉장히 간단하게 만들기 위함

일반적인 프로그램 다운 받는 과정

  1. 인스톨러 내려받기
  2. 인스톨러 실행
  3. 프로그램 설치 완료

하지만.. 현실은..

  1. 인스톨러 내려받기
  2. 인스톨러 실행
  3. 프로그램 설치 완료 = 에러...

갖고 있는 서버와 패키지 버전, 운영체제 등에 따라서 프로그램을 설치하는 과정 중에 많은 에러가 발생하게 되고, 이는 설치 과정을 복잡하게 만든다.

도커 없이 다운 받는 방식 vs 도커를 이용해서 다운 받는 방식

상황 : Redis 라는 프로그램을 다운로드 받아야함

도커 없이 다운로드

$ wget http://download.redis.io/release/redis-6.0.4.tar.gz $ tar xzf redis-6.0.4.tar.gz $ cd redis-6.0.4 $ make

  1. wget 명령어를 통해서 다운로드 진행가능
  2. wget 명령어가 실행이 안됨
  3. wget 패키지를 다운로드 받은 후 다시 Redis 설치 진행

도커를 이용한 다운로드

docker run -it redis 끝!


02. 도커란 무엇인가?

컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.

일반적인 컨테이너 개념

물건을 넣고, 운송 수단으로 쉽게 옮길 수 있음

서버(도커)에서의 컨테이너의 개념

컨테이너 안에 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 일반 컨테이너의 개념에서의 물건을 손쉽게 운송 해준다는 개념처럼 서버(도커)에서의 컨테이너 개념에서는 프로그램을 손쉽게 이동 배포 관리할 수 있게 해준다.

클라우드 서비스들에서도 사용할 수 있다.


03. 맥(Mac)에서 도커 설치

  1. Docker 사이트 이동 (링크)
  2. Get Started
  3. 다운로드 도커 installer
  4. 설치진행
  5. Docker 회원가입
  6. Docker 로그인

04. 도커 사용 흐름 감잡기

도커를 사용할 때는 ..

  1. 먼저 도커 CLI에 커맨드를 입력
  2. 도컨 서버 (도커 Daemon)이 해당 커맨드를 받아서 그것에 따라 이미지를 생상하든 컨테이너를 실행하든 모든 작업을 하게 된다.

    [도커 클라이언트] -> [도커 서버(데몬)]

Command 실행

$ docker run hello-world

  1. 도커 클라이언트에 커맨드를 입력하니 클라이언트에서 도커 서버로 요청을 보냄
  2. 서버에는 hello-world라는 이미지가 이미 로컬에 cache가 되어있는지 확인
  3. 없다면(최초에는) Unable to find image ~ 라는 문구가 표시
  4. Docker Hub라는 이미지가 저장되어 있는 곳에 가서 이미지를 가져오고 로컬 Cachedp 저장
  5. 다시 $ docker run hello-world실행 시, 이제는 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성
  6. 이미지로 생성된 컨테이너는 이미지에서 받은 설정이나 조건에 따라 프로그램을 실행

05. 도커 이미지로 컨테이너 만들기

이미지는 응용프로그램을 실행하는데 필요한 모든 것을 포함한다.

이미지는 다음을 포함한다.

  1. 시작시 실행할 명령어
  2. 파일 스냅샷
    * 파일 스냅샷 : 디렉토리나 파일을 카피한 것
    

이미지로 컨테이너를 만드는 순서

  1. Docker 클라이언트에 docker run <이미지> 입력
  2. Docker 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮기기
  3. 이미지에서 가지고 있는 명령어 (컨테이너가 실행될 때 사용될 명령어)를 이용해서 응용 프로그램 실행시켜줌

06. 도커 이미지 생성하는 순서 (도커 이미지 직접 생성하기)

도커 이미지를 직접 만들어서 사용할 수도 있고, DockerHub에 공유하여 다른 사람들이 사용할 수 있도록 할 수도 있다.

도커 이미지를 통해서 컨테이너를 생성하는 방법 docker create <이미지 이름>

도커 이미지 생성 순서

1 2 3 4
도커 파일 작성도커 클라이언트도커 서버이미지 생성
도커 파일이란 도커 이미지를 만들기 위한 설정 파일 입니다. 컨테이너가 어떻게 행동해야 하는지에 대한 설정을 정의합니다. 도커 파일에 입력된 명령들이 도커 클라이언트에 전달되어야 합니다. 도커 클라이언트에 전달된 모든 중요한 작업들을 하는 곳  

Dockerfile 만들기

도커 파일 : 도커 이미지를 만들기 위한 설정 파일, 컨테이너가 어떻게 행동해야할지 대한 설정을 정의해주는 곳

도커 파일 만드는 순서
  1. 베이스 이미지를 명시해준다. (파일 스냅샷 해당)
  2. 추가적으로 필요한 파일을 다운 받기 위한 몇 가지 명령어를 명시해준다. (파일 스냅샷에 해당함)
  3. 컨테이너 시작 시 실행될 명령어를 명시해준다. (시작 시 실행될 명령어에 해당함)

베이스 이미지란?

  • 도커 이미지는 여러 개의 레이어들로 구성되어 있는데, 베이스 이미지는 이 이미지들의 기반이 된다.
  • 베이스 이미지는 OS(Operating System)이라고 생각하면 된다.
  • 어떤 이미지에 무엇인가 추가한다고 하면, 레이어가 이미지에 추가되는 것이고, 이것을 레이어 캐싱이라고 한다.
Dockerfile 생성 실습 : Hello 출력하기
  1. 폴더 생성
  2. dockerfile 생성 (<파일명>이 dockerfile)
  3. 기본적인 토대 명시
# 베이스 이미지를 명시해준다.
FROM baseImage

# 추가적으로 필요한 파일들을 다운로드 받는다.
RUN command

# 컨테이너 시작 시 실행 될 명령어를 명시해준다.
CMD [ "executable"]

FROM - 이미지 생성시 기반이 되는 이미지 레이어, <이미지 이름="">:<태그> 형식으로 작성 Ex) ubuntu:14.04 (*태그 없을 시 최신 버전) **RUN** - 도커가 생성되기 전에 수행할 쉘 명령어 **CMD** - 컨테이너 시작되었을 때, 실행할 실행 파일 또는 셸 스크립트. Dockerfile에 한 번만 쓸 수 있음.

  1. 베이스 이미지부터 실제 값으로 추가하기
  2. 베이스 이미지는 ubuntu, centos 등 쓸 수 있지만 이 실습의 목표인 Hello 출력에는 큰 베이스 이미지를 사용할 필요가 없어서 작은 사이즈의 alpine 베이스 이미지 사용
  3. hello 문자 출력을 위해 echo 를 사용하는데, 이미 alpine 안에 echo를 사용할 수 있는 파일이 있기 떄문에 RUN 부분은 생략한다.
  4. 컨테이너 시작 시 실행될 명령어 echo hello를 CMD에 작성

Dockerfile 완성

# 베이스 이미지를 명시해준다.
FROM alpine

# 추가적으로 필요한 파일들을 다운로드 받는다.
# RUN command

# 컨테이너 시작 시 실행 될 명령어를 명시해준다.
CMD [ "echo", "hello" ]

도커 파일로 이미지 만들기

도커 파일로 이미지를 생성하기 위해서는 도커 파일에 입력한 것들이 도커 클라이언트에 전달되고 도커 서버가 인식하게 해야하는데, 그렇기 위해서는 다음과 같은 빌드 명령이 필요하다. docker build ./ 또는 docker build .

Build 명령어
- 해당 디렉토리 내에서 dockerfile이라는 파일을 찾아서 도커 클라이언트에 전달시켜준다.
- docker build 뒤에 ./ 와 . 는 둘 다 현재 디렉토리를 가리키나 ./ 가 좀 더 정확한 표현임
Build 과정 들여다보기
  • 위에서 작성한 dockerfile을 기준으로 설명
  1. Apline 이미지 가져오기
  2. 임시 컨테이너 생성 후 그 컨테이너에 시작 시 사용할 명령어 포함시키기, 이후에 방금 생성한 임시 컨테이너를 지우고 새로운 이미지 만들기
결론

베이스 이미지에서 다른 종속성이나 새로운 커맨드를 추가할 때에는 임시 컨테이너를 만든 후 컨테이너를 토대로 새로운 이미지를 만든다. 그리고 그 임시 컨테이너는 지워준다.

완성된 이미지 실행

$ docker run <이미지>


07. 리액트를 위한 도커 파일 작성하기

도커 파일 작성 유형은 두 가지

  1. 개발 환경의 도커 파일 : dockerfile.dev
  2. 운영 환경의 도커 파일 : dockerfile
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "run", "start"]

FROM : node 이미지를 베이스 이미지로 사용 WORKDIR : 작업 디렉토리 경로 설정 COPY : package.json을 컨테이너 디렉토리에 복사 RUN : npm install 을 이용해서 package.json에 명시되어 있는 모듈들 install COPY : 현재 전체 디렉토리의 내용을 컨테이너 디렉토리에 복사 CMD : 리액트 앱 실행 명령어


08. 도커에서 리액트 실행시 포트 맵핑

docker run <이미지 이름> 으로 컨테이너를 실행하는데 이렇게 실행할 경우에는 리액트가 컨테이너 내에서 실행되고 Local 브라우저에서 접근할 수가 없다.

따라서 다음과 같이 실행한다. docker run -p 3000:3000 <이미지 이름>

Local 3000과 컨테이너 3000 포트를 맵핑


© 2021. All rights reserved.