Docker가 개발 중(Node.js 사용)
12451 단어 javascriptcontainerdockernode
우리는 먼저 Docker 볼륨의 기초 지식을 배운 다음에 개발 단계에서 볼륨을 어떻게 사용하는지 배울 것이다!
Volumes are the preferred mechanism for persisting data generated by and used by Docker containers.
권의 기초 지식
docker
create
명령을 사용하여 볼륨을 만드는 것은 매우 간단합니다$ 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
키를 누르면 존재할 수 있습니다.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 응용 프로그램!
🥳 🥳 🥳
Reference
이 문제에 관하여(Docker가 개발 중(Node.js 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/akshaydotsh/docker-in-development-with-node-js-454k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)