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_DATABASEadmin(기본 인증 정보용 DB)를 지정하여 사용자echizen를 만듭니다.
또한 환경 변수MONGODB_INITDB_ROOT_USERNAMEMONGODB_INITDB_ROOT_PASSWORD를 지정하여 초기화할 때admin 데이터베이스에 루트 권한을 만드는 사용자도 사용할 수 있다.자세한 내용은 공식 이미지페이지를 참조하십시오.

Node.js


이쪽도 사용공식 이미지.

응용 프로그램 코드


express 및 MongodB 공식 노드.운전사를 사용합니다.( API 문서 )
npm init -y
npm install express
npm install mongodb
ES Modules,Top level await이므로 package.jsontype 필드에 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에 놓여 있습니다.
아직 공부 중이니까'이게 좋다'는 말이 있으면 꼭 알려주세요.
만약 이 보도가 어떤 참고가 될 수 있다면 매우 좋겠다.

참고 자료

  • LukeMwila/multi-container-nginx-react-node-mongo
  • [Mongodb] Mongodb의 Docker 용기를 시작할 때 인증용 사용자 만들기 - Qita
  • 좋은 웹페이지 즐겨찾기