개요
이전 글에서 자바스크립트로 개발된 프로젝트를 리액트 환경으로 지원될 수 있도록 진행한 프로젝트를 끝 마쳤다고 했다. 이번에는 리액트 환경도 지원을 하면서 도커 환경에서도 실행해야 하는 임무를 맡게 되었다..
도커의 ㄷ과 docker의 d을 모르는 나에겐 걱정스럽기만한 임무여서 스프린트 일정을 짜는 것 자체가 너무 어려웠다.
뭘 알아야 스프린트 일정을 짜겠는데 모르겠어서 옆 팀의 백엔드 개발자 분들의 바짓가랑이를 붙잡고 물어봤고
겨우 계획을 세웠다. 도와주신 분들에게 감사.. 압도적 감사다.
도커(docker)란 ?
도커의 개요
도커란 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
도커는 소프트웨어 컨테이너라는 표준화된 유닛으로 패키징 하며, 이 컨테이너에는 라이브러리, 시스템도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든 것이 포함되어 있다.
도커를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있다.
도커 플랫폼
도커는 느슨하게 격리된 상태에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공한다.
격리 및 보안을 통해 많은 컨테이너를 지정된 호스트에서 동시에 사용할 수 있다.
도커는 컨테이너의 수명 주기를 관리하기 위한 도구와 플랫폼을 제공한다.
- 컨테이너를 사용하여 응용 프로그램 및 지원 구성 요소를 개발한다.
- 컨테이너는 응용 프로그램을 배포하고 테스트하기 위한 단위이다.
도커는 무엇에 사용할 수 있을까?
빠르고 일관된 애플리케이션 제공
도커는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 하여 개발 수명 주기를 간소화한다.
컨테이너는 지속적인 통합과 지속적인 전달(CI/CD)에 적합하다.
아래와 같이 사용 예시가 존재할 수 있다.
- 개발자는 로컬에서 코드를 작성하고 Docker 컨테이너를 사용하여 동료와 작업을 공유할 수 있다.
- Docker를 사용하여 애플리케이션을 테스트 환경에 푸시하고 자동화 및 수동 테스트를 실행할 수 있다.
- 개발자는 버그를 발견하면 개발 환경에서 이를 수정하고 테스트 및 검증을 위해 테스트 환경에 재배포할 수 있다.
- 테스트가 완료되면 업데이트된 이미지를 프로덕션 환경에 푸시하는 것만큼 간단하게 고객에게 수정 사항을 제공할 수 있다.
반응형 배포 및 확장
Docker의 컨테이너 기반 플랫폼은 이식성이 뛰어난 워크로드를 허용한다.
(워크로드란?)
워크로드는 컴퓨팅 리소스가 작업 완료 또는 결과 도출을 위해 수행하는 처리 작업의 유형과 양을 의미합니다.
Docker 컨테이너는 개발자의 로컬 노트북, 데이터 센터의 물리적 또는 가상 머신, 클라우드 공급자 또는 혼합된 한경에서 실행될 수 있다.
Docker의 이식성과 가벼운 특성 덕분에 워크로드를 동적으로 관리하고 비즈니스 요구에 따라 애플리케이션과 서비스를 거의 실시간으로 확장하거나 축소할 수 있다.
도커 아키텍처
Docker는 클라이언트 - 서버 아키텍터를 사용한다.
Docker 클라이언트는 Docker 컨테이너를 구축, 실행 및 배포하는 무거운 작업을 수행하는 Docker 데몬과 통신한다.
Docker 클라이언트와 데몬은 동일한 시스템에서 실행될 수 있다. 또는 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있다.
도커 이미지
도커 컨테이너를 생성하기 위한 읽기 전용 템플릿이다.
이미지는 일부 추가 사용자 정의가 포함된 다른 이미지를 기반으로 한다.
자신만의 이미지를 만들 수도 있고, 다른 사람이 만들고 레지스트리에 게시한 이미지만 사용할 수 있다.
자신만의 이미지를 빌드하려면 이미지를 생성하고 실행하는데 필요한 단계를 정의하기 위한 간단한 구문을 사용하여 도커파일을 생성한다.
도커파일의 각 명령은 이미지에 레이어를 생성하고 도커파일을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드된다.
도커 컨테이너
컨테이너는 실행 가능한 이미지 인스턴스이다.
도커 API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제할 수 있다.
컨테이너를 하나 이상의 네트워크에 연결하거나 컨테이너에 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 생성할 수 있다.
도커를 윈도우 OS에서 사용하기 위한 방법
Linux 를 제외한 OS에서 도커를 사용하기 위해서는 Linux 가상 머신이 필요하다.
도커 데스크탑은 컨테이너화 된 애플리케이션과 마이크로서비스를 구축, 공유 및 실행할 수 있는 Mac, Linux 또는 Windows 환경을 위한 설치 애플리케이션이다.
컨테이너, 애플리케이션, 이미지를 머신에서 직접 관리할 수 있는 간단한 GUI를 제공한다.
도커에서 실행시킬 프로젝트 만들기
프로젝트 폴더 내에 Dockerfile을 생성한다.
Dockerfile은 도커 이미지를 구성하기 위해 사용되는 파일이다.
도커 엔진에게 이미지를 생성하는 방법과 필요한 설정, 종속성, 명령어 등을 명시적으로 작성할 수 있다.
#From <베이스 이미지>
From node:18-alpine
#Working Directory
WORKDIR /app
COPY package.json package-lock.json ./
#Install dependencies
RUN npm ci
COPY . .
#Build the app
RUN npm run build
# Expose the port the app runs in
EXPOSE 3030
CMD ["node", "dist/server.js"]
- From
Dockerfile의 첫 번째 줄은 FROM 지시어를 사용하여 베이스가 될 이미지를 지정한다.
node:20-alpine은 공식적으로 제공되는 Node.js 이미지 가운데 하나로 경량화된 Alpine Linux 이미지를 의미한다. - WORKDIR
Docker 컨테이너 내에서 작업 디렉토리의 기준점을 설정한다.
/app으로 설정할 수 있으며 이후의 명령어들은 모두 이 디렉토리를 기준으로 실행된다. - COPY
호스트 머신의 현재 디렉토리에서 package.json과 package-lock.json 파일을 컨테이너의 현재 작업 디렉토리(/app)로 복사한다. - RUN
Docker 이미지를 빌드하는 동안 컨테이너 내부에서 실행할 명령어를 지정한다.
주로 패키지 설치, 의존성 설치, 파일 생성, 환경 설정 등을 위해 사용된다.
npm ci 명령어를 실행하여 애플리케이션의 의존성 패키지들을 설치한다.
npm build 명령어를 실행하여 애플리케이션을 빌드한다. - CMD
컨테이너가 시작될 때 실행되는 기본 명령어를 지정한다.
CMD 명령어는 Dockerfile에서 한 번만 사용할 수 있으며 마지막에 사용된 CMD 명령어가 유효하다.
Node.js로 dist/server.js 파일을 실행하는 명령어를 지정한다.
즉, 컨테이너가 시작되면 /app/dist/server.js 파일이 Node.js로 실행된다.
도커 이미지 생성하기
// docker build -t <이미지 이름>
docker build -t docker-test .
생성된 이미지는 터미널에서 docker images 입력하거나 도커 데스크탑 이미지 페이지에서 확인할 수 있다.
해당 이미지를 통해서 컨테이너를 생성할 수 있다.
// docker run --name <컨테이너 이름> -d -p <host port>:<container port> <사용할 이미지>
docker run -p 3030:3030 docker-test
- --name
컨테이너 이름을 지정할 때 사용한다. 지정하지 않으면 랜덤 한 이름으로 생성된다. - -d
detached의 약자로 컨테이너를 백그라운드로 실행한다. 컨테이너의 출력을 터미널에 표시하지 않고 백그라운드에서 실행되도록 한다. - -p
호스트와 컨테이너 간의 포트 매핑을 설정한다. 3030 : 3030 은 호스트와 3030번 포트와 컨테이너의 3030번 포트를 연결한다.
로컬 호스트 3030번 포트로 접속하면 hello DockerWorld 가 출력되는 것을 확인할 수 있다.
+
webpack-dev-server를 사용할 경우, package.json에서 derserver의 port를 localhost 대신 0.0.0.0으로 바꾸는 걸 잊지 말자
docker 컨테이너는 0.0.0.0에 바인딩 해야 외부에서 접근가능하기 때문이다.
레퍼런스
'개발 > ETC' 카테고리의 다른 글
크로미움 브라우저에서 p 내부 span을 삭제할 때 span이 날아간다면 ? (0) | 2024.08.17 |
---|---|
[CSS] border Trick, Customized Dashed Border (1) | 2024.01.03 |
[Classic ASP] Url parser EUC-KR 한글 깨짐 해결 (0) | 2021.12.27 |
[JSP] setCharacterEncoding , setContentType (0) | 2021.11.10 |
CSS,HTML 과 CSS3 HTML5 (0) | 2021.01.06 |