Docker 및 nginx+Nodejs+MongodB 환경 준비
Docker 및 nginx+Nodejs+MongodB 환경 준비
제목과 같이 nginx, Node가 표시됩니다.Docker+Docker Compose를 사용하여 js, MongoDB의 환경을 준비합니다.
모두 공식 이미지를 사용하고 기본적으로 공식 지침에 따라 준비한다.
릴리즈
❯ docker -v
Docker version 20.10.10, build b485636
❯ docker-compose -v
docker-compose version 1.29.2, build 5becea4c
디렉토리 구조
.
├── docker-compose.yml
├── mongo
│ ├── init.js # DB初期化用スクリプト
│ └── mongo-data # データ保存用ディレクトリ(バインドマウント)
├── nginx
│ ├── Dockerfile
│ └── conf
│ └── proxy.conf
└── server
├── Dockerfile
├── node_modules
├── package-lock.json
├── package.json
└── src # アプリケーションコード
MongoDB
공식 이미지.
Docker file을 준비하지 않고 공식 이미지를 사용합니다.
docker-compose.yml(mongo 부분만 해당)
mongo:
image: mongo
container_name: mongo
environment:
MONGO_INITDB_DATABASE: admin
volumes:
- ./mongo/init.js:/docker-entrypoint-initdb.d/init.js:ro
- ./mongo/mongo-data:/data/db
# Start mongo with authentication enabled
command: [mongod, --auth]
MongoDB의 기본 인증이 잘못되었습니다. 따라서 command: [mongod, --auth]
인증을 유효한 시작으로 설정합니다.다음 초기화 스크립트도 준비되어 있습니다.
mongo/init.js
db.createUser({
user: 'echizen',
pwd: 'password',
roles: [
{
role: 'readWrite',
db: 'nginx-node-mongo-docker-example',
},
],
})
이 초기화 스크립트는 컨테이너에 로드되었습니다/docker-entrypoint-initdb.d/
.뭐랄까, 이 공식 이미지 용기는 처음 일어났을 때
/docker-entrypoint-initdb.d/
이하.js
또는 .sh
파일을 실행한다.환경 변수
MONGODB_INITDB_DATABASE
를 사용하여 스크립트를 실행할 때 사용할 데이터베이스를 지정할 수도 있습니다.여기
MONGODB_INITDB_DATABASE
에 admin
(기본 인증 정보용 DB)를 지정하여 사용자echizen
를 만듭니다.또한 환경 변수
MONGODB_INITDB_ROOT_USERNAME
와 MONGODB_INITDB_ROOT_PASSWORD
를 지정하여 초기화할 때admin
데이터베이스에 루트 권한을 만드는 사용자도 사용할 수 있다.자세한 내용은 공식 이미지페이지를 참조하십시오.Node.js
이쪽도 사용공식 이미지.
응용 프로그램 코드
express 및 MongodB 공식 노드.운전사를 사용합니다.( API 문서 )
npm init -y
npm install express
npm install mongodb
ES Modules,Top level await이므로 package.json
의 type
필드에 module
를 지정합니다.server/json
{
"name": "server",
"version": "1.0.0",
"type": "module",
"dependencies": {
"express": "^4.17.3",
"mongodb": "^4.5.0"
}
}
응용 프로그램 코드를 준비합니다.server/src/app.js
import express from 'express'
import { MongoClient } from 'mongodb'
const PORT = 8080
const HOST = '0.0.0.0'
const app = express()
app.get('/', async (req, res) => {
const result = await collection.find({}).toArray()
res.json(result)
})
app.listen(8080, HOST, () => {
console.log(`Listening on port ${PORT}`)
})
const URL = 'mongodb://echizen:password@mongo/nginx-node-mongo-docker-example?authSource=admin'
const client = new MongoClient(URL)
try {
await client.connect()
console.log('Succesfully connected to mongo')
} catch (e) {
console.error(e)
}
const db = client.db()
// Prepare initial data
const doc1 = { name: 'Echizen', age: 24 }
const doc2 = { name: 'Bob', age: 32 }
const collection = db.collection('test-collection')
await collection.insertMany([doc1, doc2])
URLauthSource=admin
에서 방금 초기화 스크립트에서 만든 사용자를 인증하도록 지정합니다.Docker화
그런 다음 참조정부 지침서를 사용하여 Docker화합니다.
server/Dockerfile
FROM node:16
# アプリケーションディレクトリを作成する
WORKDIR /usr/src/app
# キャッシュを利用するために、package.jsonとpackage-lock.jsonのみをコピーし、
# 依存関係を先にインストール
COPY package*.json ./
RUN npm install
# アプリケーションコードをコンテナにコピー
COPY . .
EXPOSE 8080
CMD [ "node", "src/app.js" ]
node_modules
등의 내용을 무시하기 위해 위Dockerfile
와 같은 디렉터리에 .dockerignore
를 만듭니다.server/.dockerignore
node_modules
npm-debug.log
nginx
이쪽도 공식 이미지 사용하고 공식 안내에 따라 준비하세요.
프로파일
기본적으로 용기 안에는
/etc/nginx/nginx.conf
와 /etc/nginx/conf.d/default.conf
두 개가 준비되어 있으며, nginx.conf
부터 읽기default.conf
, 역방향 에이전트를 대체하는 설정 파일을 삭제default.conf
합니다.모두 건너뛰기
server
(Node.js 이동된 용기) 를 요청합니다.nginx/conf/proxy.conf
server {
listen 80;
location / {
proxy_pass http://server:8080/;
}
}
Dockerfile
nginx/Dockerfile
FROM nginx:1.21
# デフォルトの設定を削除
RUN rm /etc/nginx/conf.d/default.conf
# 作成した設定ファイルをコピー
COPY conf/proxy.conf /etc/nginx/conf.d
docker-compose.yml
마지막 준비
docker-compose.yml
.docker-compose.yml
services:
nginx:
build: ./nginx
container_name: nginx
depends_on:
- server
ports:
- 8080:80
server:
build: ./server
container_name: server
depends_on:
- mongo
mongo:
image: mongo
container_name: mongo
environment:
MONGO_INITDB_DATABASE: admin
volumes:
- ./mongo/init.js:/docker-entrypoint-initdb.d/init.js:ro
- ./mongo/mongo-data:/data/db
# Start mongo with authentication enabled
command: [mongod, --auth]
nginx 이외에 대외 공개 포트가 없습니다.docker-compose로 제작된 용기는 기본적으로 전체
<親ディレクトリ名>_default
의 네트워크에 속하며 컨테이너 이름으로 통신할 수 있습니다.시험해 보다
❯ docker-compose up -d
❯ curl http://localhost:8080/ | jq .
[
{
"_id": "625103c4f9d2309deaad919e",
"name": "Echizen",
"age": 24
},
{
"_id": "625103c4f9d2309deaad919f",
"name": "Bob",
"age": 32
},
]
최후
이번 소스 코드는 모두 GitHub에 놓여 있습니다.
아직 공부 중이니까'이게 좋다'는 말이 있으면 꼭 알려주세요.
만약 이 보도가 어떤 참고가 될 수 있다면 매우 좋겠다.
참고 자료
Reference
이 문제에 관하여(Docker 및 nginx+Nodejs+MongodB 환경 준비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/cizneeh/articles/nginx-node-mongo-docker-example텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)