Docker가 개발 중(Node.js 사용)

이 문서는 docker를 설정하는 방법을 알려 줍니다. 그러면 노드 개발 환경에서 docker를 쉽게 사용할 수 있습니다.번거롭지 않아요!
우리는 먼저 Docker 볼륨의 기초 지식을 배운 다음에 개발 단계에서 볼륨을 어떻게 사용하는지 배울 것이다!

Volumes are the preferred mechanism for persisting data generated by and used by Docker containers.



권의 기초 지식
dockercreate 명령을 사용하여 볼륨을 만드는 것은 매우 간단합니다
$ docker volume create myvol
우리는 또한remove 명령을 사용하여 이 볼륨을 직접 삭제할 수 있다
$ docker volume remove myvol
list 명령을 사용하여 시스템의 볼륨을 나열하여 볼륨이 생성되었는지 확인할 수도 있습니다.
$ docker volume ls
DRIVER    VOLUME NAME
local     88b0dd3439a42b08ab161dfb718b1fdcb548d776521f0e008a0e6b002ecd1ee7
local     96a6b003a662d7461c100e3bef816322f036adba8eef1483755551aa463ba7b4
local     myvol
보시다시피 볼륨myvol은 로컬 드라이버로 만들어졌습니다.우리는 또한 inspect 명령을 계속 사용하여 볼륨에 대한 더 많은 정보를 얻을 수 있다
$ docker inspect myvol
[
    {
        "CreatedAt": "2021-09-13T18:20:00Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvol/_data",
        "Name": "myvol",
        "Options": {},
        "Scope": "local"
    }
]
다른 정보에서, 이 명령은 볼륨 데이터의 마운트 지점 /var/lib/docker/volumes/myvol/_data 을 표시합니다.우리는 이 디렉터리에 잘 들어가서 볼륨의 데이터를 볼 수 있다.이러한 데이터는 코드 라이브러리, 메타데이터 또는 볼륨에 저장된 기타 모든 데이터일 수 있습니다.

그런데 함정이 하나 있어!!
맥 사용자예요?만약 당신이 맥 사용자가 아니라면, 이 부분을 뛰어넘을 수 있지만, 만약 당신이 맥 사용자라면, 이것은 도움이 될 수 있습니다.만약 cd를/docker 폴더에 직접 넣으려고 시도한다면, 이 폴더에 넣을 수 없습니다
$ cd /var/lib/docker
cd: no such file or directory: /var/lib/docker
왜?!
Docker Desktop(mac에서)가 실제로 백엔드에서 가상 머신을 실행하기 때문이다. Docker의 제조 방식이 맥과 직접 호환되지 않기 때문이다.그러나 일부 방법은 가상 기기의 밑바닥 데이터에 접근할 수 있다.
  • 한 가지 옵션은 cd 로그인 셸을 사용합니다
  • $ nc -U ~/Library/Containers/com.docker.docker/Data/debug-shell.sock
    
    
    그리고 cd를 데이터 디렉터리에 기록할 수 있습니다
    / # cd /var/lib/docker/volumes
    
    케이스는 netcat 명령을 입력하거나 키보드의 exit 키를 누르면 존재할 수 있습니다.
  • 또 다른 옵션은 특권 용기에서nsenter를 사용하는 것이다. 아래와 같다.
  • docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
    
    이것은 첫 번째 옵션과 같은 방식으로 케이스를 열 것입니다.
    Bret Fishergist에서 자세히 보기:)
    주의: 윈도우즈 사용자에게 docker 작업은 ctrl+c 에서 찾을 수 있습니다.만약 이것이 작용하지 않는다면, 나는 Stackoverflow와 docker 포럼 (예: here) 에서 데이터를 어떻게 접근하는지 토론할 것을 건의합니다.
    쿨!이제 우리는 권의 기초 지식을 완성했다🎉 코드로 뛰어올라갑시다!

    하나의 노드.js Express API
    express 프로그램을 빠르게 설정합니다.우리는 이곳에서 너무 많은 시간을 낭비하지 않을 것이다. 우리는express에서 'Hello World' 예시를 추출할 것이다.js 사이트
    $ mkdir node_docker_demo
    $ cd node_docker_demo
    $ yarn init -y
    $ yarn add express
    $ touch index.js
    
    \\wsl$\docker-desktop-data\version-pack-data\community\docker\에서 다음 예시 코드를 붙여넣겠습니다.
    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 at http://localhost:${port}`)
    })
    
    현재 실행 중인express 프로그램이 있습니다.우리 Dockerfile을 쓰자!!

    Dockerfile 설정
    등록표에서 추출한 이미지 index.js 로부터 시작할 것입니다. (우리의 예에서 등록표에서 추출한 버전은 중요하지 않습니다. 이것은 간단한express 프로그램이기 때문입니다. 그러나, 호환성 문제를 해결하기 위해 버전을 계속 사용하거나 node.js와 의존항을 업그레이드하기를 원할 수도 있습니다.)
    FROM node:latest
    
    그림에 작업 디렉터리를 설정하면 매번 절대 경로를 언급할 필요가 없습니다
    WORKDIR /app
    
    다음은 이미지에 노드 모듈을 설치합니다. 이를 위해 node:latest 및 이미지에 있는 package.json 또는 yarn.lock 파일이 필요합니다.
    COPY ["package.json", "yarn.lock", "./"]
    
    RUN yarn install
    
    이것은 두 개의 가방을 복사할 것이다.실을 타다.현재 작업 디렉토리에 잠깁니다package-lock.json.
    참고: 현재 작업 디렉토리가 ./로 설정되었습니다.
    이후 Thread install 을 실행하면 node 모듈에 필요한 모든 종속성 설치
    현재 그림의 디렉터리 구조는 다음과 같다
    app
     |_ package.json
     |_ yarn.lock
     |_ node_modules
    
    다음은 프로젝트의 모든 다른 내용을 복사합니다
    COPY . .
    
    이렇게 하면 호스트의 현재 작업 디렉토리/app에서 이미지의 작업 디렉토리.로 복제됩니다.
    남은 건 쓰는 거예요.
    RUN ["node", "index.js"]
    
    결론적으로 EMC Dockerfile은 다음과 같습니다.
    FROM node:latest
    
    # setting work dir
    WORKDIR /app
    
    ## Following steps are done before copying the remaining file
    ## to make use of docker's caching capabilities
    # copying files required to install node modules
    COPY ["package.json", "yarn.lock", "./"]
    
    # install node_modules 
    RUN yarn install
    
    # copy everything else
    COPY . .
    
    # mention the port which we'll expose with port-mapping 
    EXPOSE 3000
    
    # run server
    RUN ["node", "index.js"]
    
    알겠습니다!다른 파일을 복사하기 전에 Thread install을 사용하여 노드 모듈을 설치하고 있지만, 이렇게 할 때 . 노드 모듈을 이미지에 다시 복사합니다.이러한 상황을 방지하기 위해서, 우리는 COPY . . 파일을 만들고, 도커에게 그림의 데이터를 복사할 때 노드 모듈을 무시하라고 알려 줍니다..dockerignore
    node_modules
    
    .dockerignore 명령으로 구축하고 실행합시다
    $ docker build -t myapp .
    $ docker run -it --rm -p 3000:300 --name myapp_container myapp
    Example app listening at http://localhost:3000
    
    우리는 지금 이미 노드를 상자에 포장하는 데 성공했다.하지만 우리에게 문제가 하나 있다.
    만약 우리가 코드 라이브러리에서 어떤 변경을 한다면, 개발 과정에서 수십만 번을 한 것처럼, 이미지를 재구성하고 용기를 다시 실행해야 한다. (수십만 번)
    이것은 좋은 책략이 아니다.더 좋은 방법이 있을 거야.
    천만에요, 확실히 있어요!말아!😍
    이 용례에서, 우리는 귀속 마운트를 사용할 것입니다.기본적으로 우리는 호스트의 현재 작업 디렉터리를 이미지의 작업 디렉터리 ((docker build 에 연결하고 파일 뷰어 (예: /app 를 추가해서 개발 중인 변경 사항을 저장할 때 이 변경 사항이 이미지로 전파될 수 있도록 합니다. (볼륨 때문에!)그래서 nodemon은 이러한 변화를 감지하고 우리의 노드를 다시 불러옵니다.js 서버
    컨테이너를 실행할 때 귀속 마운트를 설정할 수 있습니다
    $ docker run -it --rm \
      -p 3000:300 \
      -v $(pwd):/app \
      --name myapp_container \
      myapp
    
    nodemon 현재 작업 디렉토리를/app에 마운트합니다.다른 방법은 -v $(pwd):/app 로고를 사용하는 것이다
    $ docker run -it --rm \
      -p 3000:3000 \
      --mount type=bind,source=$(pwd),target=/app \
      --name myapp_container 
      myapp
    
    이것은 매우 좋지만, 아직 부족하다!우리는 앞에서 논의한 것처럼 파일 감시 프로그램을 설정해야 한다.file watcher를 제외하고 또 하나 기억해야 할 것은 우리가 현재 사용하고 있는 것은 귀속 마운트이기 때문에 실제적으로 로컬 호스트에서 이미지까지의 어떤 내용도 필요하지 않다는 것이다!!그래서 삭제하고 nodemon을 그림에 추가해서 어떻게 되는지 봅시다
    FROM node:latest
    
    # setting work dir
    WORKDIR /app
    
    # added nodemon globally
    RUN npm i -g nodemon
    
    # run the server with watcher
    CMD ["nodemon", "index.js"]
    
    이렇게!!이 파일을 구축하고 실행합시다
    $ docker build -t myapp .
    $ docker run -it --rm \
      -p 3000:300 \
      -v $(pwd):/app \
      --name myapp_container \
      myapp
    
    현재, 우리가 코드를 변경할 때, 관찰자는 그것을 감지하고 노드를 다시 시작할 것이다.js 서버 자동 실행!
    이것이 바로 노드를 개발하는 방법이다.docker의 js 응용 프로그램!
    🥳 🥳 🥳

    좋은 웹페이지 즐겨찾기