Docker를 사용하여 노드의 단계별 가이드 설정하기

Docker 컨테이너에서 Node JS를 설정하는 방법 이해


본문의 목표

  • 단일 작업 노드 JS 어플리케이션
  • 오류 시 프로세스가 종료되지 않도록 하기 위해
  • 노드 응용 프로그램을 탄력적으로
  • 코드 변경 시 서버를 자동으로 재부팅하여 노드 애플리케이션을 쉽게 사용할 수 있음
  • Docker 활용:
  • 생산과 같은 개발 환경을 신속하게 구축한다.
  • 로컬과 서버에서 노드 버전을 쉽게 전환할 수 있음
  • Docker
  • 의 모든 기타benefits

    선결 조건

  • Docker
  • 설치
  • 최소 노드 및 NPM에 대한 엔트리 레벨 지식
  • 만약 당신이 최종 결과만 보고 싶은 사람이라면github 환매 협의가 당신에게 더 적합할 것입니다

    Itmayzii / 개발자 노드 docker 설정



    dev.to 기사의 환매 협의
    View on GitHub

    1. 간단한 노드 응용 프로그램 설치


    우리가 Express를 사용하는 이유는 설정이 매우 간단하고 프레임워크가 매우 유행하기 때문이다.
    깨끗한 디렉터리에서 NPM을 초기화하는 것부터 시작하여 이 명령을 계속 실행하고 알림에 따라 조작합시다. (알림에 입력한 내용은 이 안내서에 중요하지 않습니다.)
    npm init
    
    Express 설치
    npm install --save-prod express
    
    기본 퀵 서버를 설치합니다.다음 파일은 노드 프로세스를 시작하고 포트 3000을 감청하며 Hello World를 사용합니다!노선으로 올라가다.
    src/index.js
    const express = require('express')
    const app = express()
    const port = 3000
    
    app.get('/', (req, res) => res.send('Hello World!'))
    
    app.listen(port, () => {console.log(`Example app listening on port ${port}!`))
    

    2. Docker를 설치하여 노드 응용 프로그램을 실행합니다.


    docker compose를 사용할 것입니다.yml 파일로 긴 Docker 명령을 입력하는 대신 Docker 컨테이너를 시작하고 중지합니다.이 파일을 여러 Docker 컨테이너의 구성 파일로 볼 수 있습니다.
    docker 작성.yml
    version: "3"
    services:
      app:
        container_name: app # How the container will appear when listing containers from the CLI
        image: node:10 # The <container-name>:<tag-version> of the container, in this case the tag version aligns with the version of node
        user: node # The user to run as in the container
        working_dir: "/app" # Where to container will assume it should run commands and where you will start out if you go inside the container
        networks:
        - app # Networking can get complex, but for all intents and purposes just know that containers on the same network can speak to each other
        ports:
        - "3000:3000" # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost
        volumes:
        - ./:/app # <host-directory>:<container-directory> this says map the current directory from your system to the /app directory in the docker container
        command: "node src/index.js" # The command docker will execute when starting the container, this command is not allowed to exit, if it does your container will stop
    
    networks:
      app:
    
    
    이 명령으로 도커 용기를 시작할 준비가 되어 있습니다.이것은 시작 프로필에 정의된 용기를 의미하며, 백엔드에서 실행됩니다. (- d)
    docker-compose up -d
    
    이제 브라우저에서 localhost:3000로 이동하여 Hello World!를 볼 수 있습니다.

    실행할 수 있어야 합니다
    docker ps
    
    실행 중인 docker 용기의 목록을 출력해야 합니다. 예를 들어

    이 용기를 관리하는 데 사용되는 docker 명령


    실행 중인 모든 컨테이너 나열
    docker ps
    
    실행 중이든 안 하든 모든 용기를 보여 줍니다.
    docker ps -a
    
    docker compose에서 용기를 만듭니다.같은 디렉터리의yml 파일
    docker-compose up -d
    
    용기가 부두 노동자의 손에서 조립되는 것을 막다.같은 디렉터리의yml 파일
    docker-compose stop
    
    docker compose에서 용기를 다시 시작합니다.같은 디렉터리의yml 파일
    docker-compose restart
    
    docker 컨테이너의 로그 파일 보기
    docker-compose logs -f
    

    3. 어플리케이션의 탄력성


    이전에 Node를 사용한 적이 있다면, 포획되지 않은 이상과 같은 프로그램에서 오류가 발생하면 노드 프로세스를 닫는다는 것을 알 수 있습니다.이것은 우리에게 정말 나쁜 소식이다. 왜냐하면 우리의 코드에 틀림없이 버그가 있을 뿐만 아니라, 우리의 코드가 100% 오류가 없다는 것을 보장할 수 없기 때문이다.이 문제의 해결 방안은 보통 다른 프로세스로 우리의 노드 프로그램을 감시하고 종료할 때 다시 시작합니다.많은 해결 방안이 있는데 예를 들면 linux의 슈퍼visord, 영구 NPM 패키지와 PM2 등등이다.우리는 이 안내서를 위해 하나만 선택할 수 있다.
    나는 PM2를 중점적으로 소개할 것이다. 왜냐하면 나는 그것에 대해 가장 익숙하기 때문에 절차 관리 이외의 다른 기능, 예를 들어 문서 감시를 덧붙인다. 이것은 우리의 다음 절에 도움이 될 것이다.
    PM2 설치
    npm install --save-prod pm2
    
    PM2는 명령줄에서 사용할 수 있지만, docker compose처럼 간단한 프로필을 설정할 것입니다.긴 명령을 반복하지 않도록 yml 파일
    생태계.배치하다.js
    const path = require('path')
    
    module.exports = {
      apps: [{
        name: 'app',
        script: 'src/index.js', // Your entry point
        instances: 1,
        autorestart: true, // THIS is the important part, this will tell PM2 to restart your app if it falls over
        max_memory_restart: '1G'
      }]
    }
    
    지금 우리는 부두 노동자를 바꿔야 한다.yml 파일은 색인에서 직접 시작하지 않고 PM2를 사용하여 프로그램을 시작합니다.js.
    docker 작성.yml(명령 옵션만 변경됨)
    version: "3"
    services:
      app:
        container_name: app # How the container will appear when listing containers from the CLI
        image: node:10 # The <container-name>:<tag-version> of the container, in this case the tag version aligns with the version of node
        user: node # The user to run as in the container
        working_dir: "/app" # Where to container will assume it should run commands and where you will start out if you go inside the container
        networks:
        - app # Networking can get complex, but for all intents and purposes just know that containers on the same network can speak to each other
        ports:
        - "3000:3000" # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost
        volumes:
        - ./:/app # <host-directory>:<container-directory> this says map the current directory from your system to the /app directory in the docker container
        command: "npx pm2 start ecosystem.config.js --no-daemon" # The command docker will execute when starting the container, this command is not allowed to exit, if it does your container will stop
    
    networks:
      app:
    
    주의해야 할 것은 docker 구성 요소를 바꾸는 것입니다.yml 파일은 이미 실행된 용기에 영향을 주지 않습니다.변경 사항을 진행하기 위해서 용기를 다시 시작해야 합니다
    docker-compose restart
    
    좋습니다. locahost:3000 작업 프로그램으로 돌아가야 하지만, 현재 우리의 프로그램은 오류가 발생할 때 붕괴되지 않습니다.

    4. 우리의 응용 프로그램을 개발하기 쉽게 하다


    노드 프로세스가 시작되면 노드 프로세스를 다시 시작하기 전에 코드 변경은 사실상 아무것도 하지 않습니다. 변경할 때마다 Docker 용기를 다시 시작하는 것과 관련이 있습니다.듣자니 엉망진창이다.만약 우리가 코드를 변경할 때 노드 프로세스를 자동으로 다시 시작할 수 있다면, 이것은 이상적일 것이다.과거에 나는 파일 감시 유틸리티를 도입하고 이 파일 감시 유틸리티를 사용해서 파일이 바뀔 때 Docker를 다시 시작하거나, Nodemon을 사용하지만, Docker를 사용할 때 주의사항을 덧붙인 적이 있다.최근에 나는 PM2를 사용하여 파일이 바뀔 때 나의 노드 프로세스를 다시 시작하고 있다. 왜냐하면 우리는 이미 이전 단계에서 그것을 끌어올렸기 때문에 다른 의존항을 설치할 필요가 없다.
    생태계.배치하다.js (watch 옵션만 추가)**
    const path = require('path')
    
    module.exports = {
        apps: [{
            name: 'app',
            script: 'src/index.js',
            instances: 1,
            autorestart: true,
            watch: process.env.NODE_ENV !== 'production' ? path.resolve(__dirname, 'src') : false,
            max_memory_restart: '1G'
        }]
    }
    
    NODE ENV 환경 변수를 production으로 설정하지 않으면 위의 구성 파일이 src 디렉토리를 모니터링합니다.너는 색인을 바꾸어 그것을 테스트할 수 있다.Hello World! 이외의 내용을 브라우저에서 인쇄할 수 있도록 js 파일!다시 시작하기 전에 Docker 용기를 다시 시작해야 합니다. PM2가 용기를 실행하는 방식을 바꿨기 때문입니다.
    docker-compose restart
    
    노드 프로세스를 다시 시작하려면 1초가 걸릴 수 있습니다. 노드 프로세스가 언제 완료되는지 보려면 Docker 로그를 보고 PM2가 노드 프로세스를 다시 시작할 때를 결정할 수 있습니다.
    docker-compose logs -f
    
    프로세스를 다시 시작할 때 비슷한 상황을 볼 수 있습니다

    마무리

  • 우리의 목표 중 하나는 노드 버전을 쉽게 변경할 수 있는 것입니다. docker compose의 이미지 옵션을 변경하여 실현할 수 있습니다.yml 파일.
  • 로컬 NPM 및 노드 버전을 사용하여 로컬 종속성을 설치합니다. 로컬 버전이 Dockers와 다르면 충돌이 발생할 수 있습니다.동일한 Docker 컨테이너를 사용하여 종속 항목을 설치하는 것이 더 안전합니다.이 명령을 사용하면 용기에 의존항을 설치한 다음 삭제할 수 있습니다
  • docker run --rm -i -v <absolute-path-to-your-project-locally>:/app -w /app node:10 npm install 
    
  • 위에서 설명한 대로 노드의 로컬 버전이 Docker가 실행 중인 버전과 다르면 문제가 발생할 수 있습니다.일관성을 유지하기 위해서는 컨테이너 내에서 명령을 실행하는 것이 좋습니다.
    너는 그것을 가지고 용기에 들어갈 수 있다
  • docker exec -it app bash
    
    위의 명령은 용기에 넣습니다. 그러면 npm run start 또는 npm run test 명령을 계속 실행할 수 있습니다.
    용기 내부에 들어가지 않으려면 다음 명령을 실행할 수 있습니다
    docker exec -t app bash -c "npm run start"
    

    좋은 웹페이지 즐겨찾기