Контејнеризирање на апликација Node.js за развој со Docker Compose


Вовед

Ако активно развивате апликација, користењето на Docker може да го поедностави вашиот работен тек и процесот на распоредување на вашата апликација во производство. Работата со контејнери во развој ги нуди следниве придобивки:

  • Околините се конзистентни, што значи дека можете да ги изберете јазиците и зависностите што ги сакате за вашиот проект без да се грижите за системски конфликти.
  • Околините се изолирани, што го олеснува решавањето проблеми и новите членови на тимот.
  • Околините се преносливи, што ви овозможуваат да го пакувате и споделувате вашиот код со други.

Овој туторијал ќе ви покаже како да поставите развојна околина за Docker Compose. Бидејќи оваа апликација работи со Node и MongoDB, вашето поставување ќе го направи следново:

  • Синхронизирајте го кодот на апликацијата на домаќинот со кодот во контејнерот за да ги олесните промените за време на развојот.
  • Погрижете се промените во кодот на апликацијата да функционираат без рестартирање.
  • Создадете корисничка и заштитена со лозинка база на податоци за податоците на апликацијата.
  • Одржувајте ги овие податоци.

На крајот од ова упатство, ќе имате работна апликација за информации за ајкула која работи на контејнерите на Docker:

Предуслови

За да го следите ова упатство, ќе ви треба:

  • Развоен сервер кој работи на Ubuntu 18.04, заедно со корисник кој не е root со привилегии sudo и активен заштитен ѕид. За упатства за тоа како да ги поставите, погледнете го ова упатство за почетно поставување на серверот.
  • Докер е инсталиран на вашиот сервер, следејќи ги Чекорите 1 и 2 од Како да го инсталирате и користите Docker на Ubuntu 18.04.
  • Docker Compose е инсталиран на вашиот сервер, следејќи го Чекор 1 од Како да инсталирате Docker Compose на Ubuntu 18.04.

Чекор 1 - Клонирање на проектот и менување на зависностите

Првиот чекор во изградбата на ова поставување ќе биде клонирање на кодот на проектот и менување на неговите devDependencies, наведувајќи дека ќе го користите за време на развојот. Извршувањето на апликацијата со nodemon осигурува дека таа автоматски ќе се рестартира секогаш кога ќе направите промени во вашиот код.

Прво, клонирајте го Мангусот.

Клонирајте го складиштето во директориум наречен node_project:

  1. git clone https://github.com/do-community/nodejs-mongo-mongoose.git node_project

Одете до директориумот node_project:

  1. cd node_project

Отворете ја датотеката package.json на проектот користејќи nano или вашиот омилен уредувач:

  1. nano package.json

Под зависностите на проектот и над затворачката кадрава заграда, креирајте нов објект devDependencies кој вклучува nodemon:

...
"dependencies": {
    "ejs": "^2.6.1",
    "express": "^4.16.4",
    "mongoose": "^5.4.10"
  },
  "devDependencies": {
    "nodemon": "^1.18.10"
  }    
}

Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето. Ако користите nano, притиснете CTRL+X, потоа Y, потоа ENTER.

Со примена на кодот на проектот и изменети неговите зависности, можете да продолжите на рефакторирање на кодот за контејнеризиран работен тек.

Чекор 2 - Конфигурирање на вашата апликација да работи со контејнери

Измената на вашата апликација за контејнеризиран работен тек значи да го направите вашиот код помодуларен. Контејнерите нудат преносливост помеѓу околините, а вашиот код треба да го одразува тоа со тоа што ќе остане што е можно повеќе одвоен од основниот оперативен систем. За да го постигнете ова, ќе го рефакторирате вашиот код за поголема употреба на својството на Node process.env. Ова враќа објект со информации за вашата корисничка околина при извршување. Можете да го користите овој објект во вашиот код за динамички да доделите информации за конфигурација при извршување со променливи на околината.

Започнете со app.js, вашата главна влезна точка на апликацијата. Отворете ја датотеката:

  1. nano app.js

Внатре, ќе видите дефиниција за функцијата port listen која ја користи оваа константа за да ја одреди портата на која апликацијата ќе слуша:

...
const port = 8080;
...
app.listen(port, function () {
  console.log('Example app listening on port 8080!');
});

Редефинирајте ја константата port за да овозможите динамично доделување при извршување со користење на објектот process.env. Направете ги следните промени во функцијата константна дефиниција и слуша:

...
const port = process.env.PORT || 8080;
...
app.listen(port, function () {
  console.log(`Example app listening on ${port}!`);
});

Вашата нова константна дефиниција доделува порт динамички користејќи ја вредноста пренесена при извршување или 8080. Слично на тоа, ја препишавте функцијата listen за да користите буквален шаблон, кој ќе ја интерполира вредноста на портата кога слушате врски. Бидејќи ќе ги мапирате вашите порти на друго место, овие ревизии ќе ве спречат постојано да ја ревидирате оваа датотека додека се менува вашата околина.

Кога ќе завршите со уредувањето, зачувајте ја и затворете ја датотеката.

Следно, ќе ги измените информациите за поврзување со базата на податоци за да ги отстраните сите акредитиви за конфигурација. Отворете ја датотеката db.js, која ги содржи овие информации:

  1. nano db.js

Во моментов, датотеката ги прави следниве работи:

  • Го увезува Mongoose, Mapper на објекти на документи (ODM) што го користите за креирање шеми и модели за податоците од вашата апликација.
  • Ги поставува акредитациите на базата на податоци како константи, вклучувајќи ги корисничкото име и лозинката.
  • Се поврзува со базата на податоци користејќи го методот mongoose.connect.

За повеќе информации за датотеката, видете Како да се интегрира MongoDB со вашата апликација Node.

Вашиот прв чекор во менувањето на датотеката ќе биде редефинирање на константите кои вклучуваат чувствителни информации. Во моментов, овие константи изгледаат вака:

...
const MONGO_USERNAME = 'sammy';
const MONGO_PASSWORD = 'your_password';
const MONGO_HOSTNAME = '127.0.0.1';
const MONGO_PORT = '27017';
const MONGO_DB = 'sharkinfo';
...

Наместо хардкодирање на овие информации, можете да го користите објектот process.env за да ги доловите вредностите за време на траење за овие константи. Изменете го блокот за да изгледа вака:

...
const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;
...

Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето.

Во овој момент, го изменивте db.js за да работите со променливите на околината на вашата апликација, но сепак ви треба начин да ги пренесете овие променливи на вашата апликација. Направете датотека .env со вредности што можете да ги пренесете на вашата апликација при извршување.

Отворете ја датотеката:

  1. nano .env

Оваа датотека ќе ги содржи информациите што сте ги отстраниле од db.js: корисничкото име и лозинката за базата на податоци на вашата апликација, како и поставката за портата и името на базата на податоци. Не заборавајте да ги ажурирате корисничкото име, лозинката и името на базата на податоци наведени овде со вашите сопствени информации:

MONGO_USERNAME=sammy
MONGO_PASSWORD=your_password
MONGO_PORT=27017
MONGO_DB=sharkinfo

Забележете дека ја отстранивте поставката за домаќин што првично се појави во db.js. Сега ќе го дефинирате вашиот домаќин на ниво на датотеката Docker Compose, заедно со други информации за вашите услуги и контејнери.

Зачувајте ја и затворете ја оваа датотека кога ќе завршите со уредувањето.

Бидејќи вашата датотека .env содржи чувствителни информации, ќе сакате да се осигурате дека е вклучена во датотеките .dockerignore и .gitignore на вашиот проект, така што не се копира во вашата контрола на верзијата или контејнери.

Отворете ја вашата датотека .dockerignore:

  1. nano .dockerignore

Додадете ја следнава линија на дното на датотеката:

...
.gitignore
.env

Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето.

Датотеката .gitignore во ова складиште веќе содржи .env, но слободно проверете дали е таму:

  1. nano .gitignore
...
.env
...

Во овој момент, успешно сте извлекле чувствителни информации од кодот на вашиот проект и преземавте мерки за контрола на тоа како и каде се копираат овие информации. Сега можете да го додадете кодот за поврзување во вашата база на податоци за да го оптимизирате за контејнеризиран работен тек.

Чекор 3 - Измена на поставките за поврзување со базата на податоци

Вашиот следен чекор ќе биде да го направите методот за поврзување со базата на податоци поробустен со додавање код што се справува со случаите кога вашата апликација не успева да се поврзе со вашата база на податоци. Воведувањето на ова ниво на еластичност во кодот на вашата апликација е препорачана практика кога работите со контејнери користејќи Compose.

Отворете db.js за уредување:

  1. nano db.js

Забележете го кодот што е додаден претходно, заедно со константата url за URI за поврзување на Mongo и методот connect на Mongoose:

...
const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;

const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`;

mongoose.connect(url, {useNewUrlParser: true});

Во моментов, вашиот метод connect прифаќа опција која му кажува на Mongoose да го користи новиот парсер на URL на Mongo. Можете да додадете опции на овој метод за да ги дефинирате параметрите за обиди за повторно поврзување. Направете го ова со креирање на константа опции која ги вклучува релевантните информации, покрај новата опција за анализатор на URL-то. Под вашите Mongo константи, додадете ја следнава дефиниција за константата опции:

...
const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;

const options = {
  useNewUrlParser: true,
  reconnectTries: Number.MAX_VALUE,
  reconnectInterval: 500, 
  connectTimeoutMS: 10000,
};
...

Опцијата reconnectTries му кажува на Mongoose да продолжи да се обидува да се поврзе на неодредено време, додека reconnectInterval го дефинира периодот помеѓу обидите за поврзување во милисекунди. connectTimeoutMS дефинира 10 секунди како период што ќе го чека двигателот на Mongo пред да не успее обидот за поврзување.

Сега можете да ја користите новата константа опции во методот Mongoose connect за фино да ги прилагодите поставките за поврзување Mongoose. Исто така, ќе додадете ветување за справување со потенцијалните грешки при поврзувањето.

Во моментов, методот Mongoose connect изгледа вака:

...
mongoose.connect(url, {useNewUrlParser: true});

Избришете го постоечкиот метод connect и заменете го со следниот код, кој ја вклучува константата опции и ветувањето:

...
mongoose.connect(url, options).then( function() {
  console.log('MongoDB is connected');
})
  .catch( function(err) {
  console.log(err);
});

Во случај на успешна врска, вашата функција евидентира соодветна порака; инаку ќе фати и ќе ја евидентира грешката, што ќе ви овозможи да решавате проблеми.

Завршената датотека ќе изгледа вака:

const mongoose = require('mongoose');

const {
  MONGO_USERNAME,
  MONGO_PASSWORD,
  MONGO_HOSTNAME,
  MONGO_PORT,
  MONGO_DB
} = process.env;

const options = {
  useNewUrlParser: true,
  reconnectTries: Number.MAX_VALUE,
  reconnectInterval: 500,
  connectTimeoutMS: 10000,
};

const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`;

mongoose.connect(url, options).then( function() {
  console.log('MongoDB is connected');
})
  .catch( function(err) {
  console.log(err);
});

Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето.

Сега додадовте еластичност на кодот на вашата апликација за да се справите со случаи кога вашата апликација може да не се поврзе со вашата база на податоци. Со примена на овој код, можете да продолжите да ги дефинирате вашите услуги со Compose.

Чекор 4 - Дефинирање на услуги со Docker Compose

Со рефакториран код, подготвени сте да ја напишете датотеката docker-compose.yml со дефинициите на вашите услуги. услугата во Compose е контејнер што работи, а дефинициите на услугата - кои ќе ги вклучите во вашата датотека docker-compose.yml - содржат информации за тоа како ќе работи секоја слика од контејнер. Алатката Compose ви овозможува да дефинирате повеќе услуги за да изградите апликации со повеќе контејнери.

Пред да ги дефинирате вашите услуги, ќе додадете алатка во вашиот проект наречена netcat за да испитате дали одреден хост и порта прифаќаат TCP конекции. Користењето ви овозможува да ги контролирате обидите на вашата апликација да се поврзе со вашата база на податоци со тестирање дали базата на податоци е подготвена да прифаќа врски.

Иако Compose ви овозможува да наведете зависност помеѓу услугите користејќи ги препораките во документацијата Состави.

Отворете датотека наречена wait-for.sh:

  1. nano wait-for.sh

Внесете го следниов код во датотеката за да ја креирате функцијата за гласање:

#!/bin/sh

# original script: https://github.com/eficode/wait-for/blob/master/wait-for

TIMEOUT=15
QUIET=0

echoerr() {
  if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
}

usage() {
  exitcode="$1"
  cat << USAGE >&2
Usage:
  $cmdname host:port [-t timeout] [-- command args]
  -q | --quiet                        Do not output any status messages
  -t TIMEOUT | --timeout=timeout      Timeout in seconds, zero for no timeout
  -- COMMAND ARGS                     Execute command with args after the test finishes
USAGE
  exit "$exitcode"
}

wait_for() {
  for i in `seq $TIMEOUT` ; do
    nc -z "$HOST" "$PORT" > /dev/null 2>&1
    
    result=$?
    if [ $result -eq 0 ] ; then
      if [ $# -gt 0 ] ; then
        exec "$@"
      fi
      exit 0
    fi
    sleep 1
  done
  echo "Operation timed out" >&2
  exit 1
}

while [ $# -gt 0 ]
do
  case "$1" in
    *:* )
    HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
    PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
    shift 1
    ;;
    -q | --quiet)
    QUIET=1
    shift 1
    ;;
    -t)
    TIMEOUT="$2"
    if [ "$TIMEOUT" = "" ]; then break; fi
    shift 2
    ;;
    --timeout=*)
    TIMEOUT="${1#*=}"
    shift 1
    ;;
    --)
    shift
    break
    ;;
    --help)
    usage 0
    ;;
    *)
    echoerr "Unknown argument: $1"
    usage 1
    ;;
  esac
done

if [ "$HOST" = "" -o "$PORT" = "" ]; then
  echoerr "Error: you need to provide a host and port to test."
  usage 2
fi

wait_for "$@"

Зачувајте ја и затворете ја датотеката кога ќе завршите со додавање на кодот.

Направете го скриптата извршна:

  1. chmod +x wait-for.sh

Следно, отворете ја датотеката docker-compose.yml:

  1. nano docker-compose.yml

Прво, дефинирајте ја услугата за апликација nodejs со додавање на следниов код во датотеката:

version: '3'

services:
  nodejs:
    build:
      context: .
      dockerfile: Dockerfile
    image: nodejs
    container_name: nodejs
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=db
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DB=$MONGO_DB 
    ports:
      - "80:8080"
    volumes:
      - .:/home/node/app
      - node_modules:/home/node/app/node_modules
    networks:
      - app-network
    command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js

Дефиницијата на услугата nodejs ги вклучува следните опции:

  • build: Ова ги дефинира опциите за конфигурација, вклучувајќи ги context и dockerfile, кои ќе се применат кога Compose ќе ја изгради сликата на апликацијата. Ако наместо тоа, сакате да користите постоечка слика од регистар како што е инструкцијата image, со информации за вашето корисничко име, складиште и ознака со слика.
  • контекст: Ова го дефинира контекстот на изградбата за изградбата на сликата - во овој случај, тековниот директориум на проектот.
  • dockerfile: ова го одредува Dockerfile во вашиот тековен директориум на проекти како што датотеката Compose ќе ја користи за да ја изгради сликата на апликацијата. За повеќе информации за оваа датотека, видете Како да изградите апликација Node.js со Docker.
  • слика, container_name: тие ги применуваат имињата на сликата и контејнерот.
  • рестартирање: Ова ја дефинира политиката за рестартирање. Стандардно е не, но сте го поставиле контејнерот да се рестартира освен ако не е запрен.
  • env_file: ова му кажува на Compose дека би сакале да додадете променливи на животната средина од датотека наречена .env, сместена во контекстот на вашата изградба.
  • околина: Користењето на оваа опција ви овозможува да ги додадете поставките за поврзување Mongo што ги дефиниравте во датотеката .env. Имајте предвид дека не поставувате NODE_ENV на развој, бидејќи ова е овозможување на кеширање приказ и помалку описни пораки за грешки. Исто така, имајте предвид дека сте го навеле контејнерот за базата на податоци db како домаќин, како што беше дискутирано во чекор 2.
  • порти: ова го мапира портот 80 на домаќинот до портата 8080 на контејнерот.
  • томови: овде вклучувате два вида монтирања:
    • Првата е монтажа за поврзување што го монтира кодот на вашата апликација на домаќинот во директориумот /home/node/app на контејнерот. Ова ќе го олесни брзиот развој, бидејќи сите промени што ќе ги направите во кодот на вашиот домаќин ќе бидат веднаш пополнети во контејнерот.
    • Вториот е именуван директориум node_modules на контејнерот кој ги вклучува пакетите потребни за извршување на апликацијата. Сепак, монтажата за врзување што штотуку ја создадовте ќе го скрие овој новосоздаден директориум node_modules. Бидејќи node_modules на домаќинот е празен, врската ќе мапира празен директориум во контејнерот, префрлајќи го новиот директориум node_modules и спречувајќи ја вашата апликација да стартува. Именуваниот волумен node_modules го решава овој проблем така што ја опстојува содржината на директориумот /home/node/app/node_modules и го монтира во контејнерот, криејќи ја врската.

    Имајте ги на ум следниве точки кога го користите овој пристап:

    • Вашиот bind ќе ја монтира содржината на директориумот node_modules на контејнерот до домаќинот и овој директориум ќе биде во сопственост на root, бидејќи именуваниот волумен е создаден од Docker.
    • Ако имате веќе постоечки директориум node_modules на домаќинот, тој ќе го отфрли директориумот node_modules создаден на контејнерот. Поставувањето што го создавате во ова упатство претпоставува дека не имате веќе постоечки директориум node_modules и дека нема да работите со npm на вашиот домаќин. Ова е во согласност со пристапот од дванаесет фактори за развој на апликации, кој ги минимизира зависностите помеѓу околините за извршување.

    • мрежи: ова одредува дека вашата апликација за услуга ќе се приклучи на мрежата app-network, која ќе ја дефинирате на дното на датотеката.
    • команда: оваа опција ви овозможува да ја поставите командата што треба да се изврши кога Compose ќе ја изврши сликата. Имајте предвид дека ова ќе ја отфрли инструкцијата CMD што сте ја поставиле во нашата апликација Dockerfile. Овде, ја извршувате апликацијата користејќи ја скриптата wait-for, која ќе ја испита услугата db на портата 27017 за да тестира дали услугата за базата на податоци е подготвена. Откако тестот за подготвеност ќе успее, скриптата ќе ја изврши командата што сте ја поставиле, /home/node/app/node_modules/.bin/nodemon app.js, за да ја стартува апликацијата со nodemon. Ова ќе осигури дека сите идни промени што ќе ги направите во вашиот код се повторно вчитани без да мора да ја рестартирате апликацијата.

    Следно, креирајте ја услугата db со додавање на следниов код под дефиницијата на услугата за апликација:

    ...
      db:
        image: mongo:4.1.8-xenial
        container_name: db
        restart: unless-stopped
        env_file: .env
        environment:
          - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
          - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
        volumes:  
          - dbdata:/data/db   
        networks:
          - app-network  
    

    Некои од поставките дефинирани за услугата nodejs остануваат исти, но ги направивте и следните промени на сликата, околината и дефиниции за томови:

    • слика: за да се создаде оваа услуга, Compose ќе ги повлече најдобрите практики на Dockerfile 4.1.8-xenial.
    • MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD: сликата mongo ги прави овие root корисници на примерот на базата на податоци, со пристап до сите административни и оперативни привилегии на таа улога. Кога работите во производство, ќе сакате да креирате посветен корисник на апликација со соодветни привилегии.

    Забелешка: Имајте на ум дека овие променливи нема да стапат на сила ако го стартувате контејнерот со постоечки директориум со податоци.

    • dbdata:/data/db: именуваниот волумен dbdata ќе ги опстојува податоците зачувани во стандардниот директориум со податоци на Mongo, /data/db . Ова ќе се погрижи да не ги изгубите податоците во случаи кога запирате или отстранувате контејнери.

    Услугата db исто така беше додадена на мрежата app-network со опцијата networks.

    Како последен чекор, додајте ја јачината на звукот и дефинициите на мрежата на дното на датотеката:

    ...
    networks:
      app-network:
        driver: bridge
    
    volumes:
      dbdata:
      node_modules:  
    

    Мрежата за мост дефинирана од корисникот апликација-мрежа овозможува комуникација помеѓу вашите контејнери бидејќи тие се на истиот Докер демон-домаќин. Ова го насочува сообраќајот и комуникацијата во апликацијата, бидејќи ги отвора сите пристаништа помеѓу контејнерите на истата мрежа на мост, а притоа не изложува никакви пристаништа на надворешниот свет. Така, вашите контејнери db и nodejs можат да комуницираат едни со други и треба само да ја изложите портата 80 за преден пристап до апликацијата .

    Вашето копче volumes од највисоко ниво ги дефинира томовите dbdata и node_modules. Кога Docker создава томови, содржината на волуменот се складира во дел од датотечниот систем на домаќинот, /var/lib/docker/volumes/, управуван од Docker. Содржината на секој том се чува во директориум под /var/lib/docker/volumes/ и се монтира во кој било контејнер што ја користи јачината на звукот. На овој начин, податоците за информациите за ајкулата што ќе ги создадат вашите корисници ќе останат во волуменот dbdata дури и ако го отстраните и повторно креирате контејнерот db.

    Завршената датотека docker-compose.yml ќе изгледа вака:

    version: '3'
    
    services:
      nodejs:
        build:
          context: .
          dockerfile: Dockerfile
        image: nodejs
        container_name: nodejs
        restart: unless-stopped
        env_file: .env
        environment:
          - MONGO_USERNAME=$MONGO_USERNAME
          - MONGO_PASSWORD=$MONGO_PASSWORD
          - MONGO_HOSTNAME=db
          - MONGO_PORT=$MONGO_PORT
          - MONGO_DB=$MONGO_DB
        ports:
          - "80:8080"
        volumes:
          - .:/home/node/app
          - node_modules:/home/node/app/node_modules
        networks:
          - app-network
        command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js 
    
      db:
        image: mongo:4.1.8-xenial
        container_name: db
        restart: unless-stopped
        env_file: .env
        environment:
          - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
          - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
        volumes:     
          - dbdata:/data/db
        networks:
          - app-network  
    
    networks:
      app-network:
        driver: bridge
    
    volumes:
      dbdata:
      node_modules:  
    

    Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето.

    Со воспоставени дефиниции за услуги, подготвени сте да ја стартувате апликацијата.

    Чекор 5 - Тестирање на апликацијата

    Со вашата датотека docker-compose.yml на место, можете да ги креирате вашите услуги со docker-compose down.

    Прво, изградете ги сликите на контејнерот и креирајте ги услугите со извршување на docker-compose up со знамето -d, кое потоа ќе го изврши nodejs и Контејнери db во позадина:

    1. docker-compose up -d

    Излезот потврдува дека вашите услуги се создадени:

    Output
    ... Creating db ... done Creating nodejs ... done

    Можете исто така да добиете подетални информации за процесите на стартување со прикажување на излезот од дневникот од услугите:

    1. docker-compose logs

    Ако сè започна правилно, следниот е излезот:

    Output
    ... nodejs | [nodemon] starting `node app.js` nodejs | Example app listening on 8080! nodejs | MongoDB is connected ... db | 2019-02-22T17:26:27.329+0000 I ACCESS [conn2] Successfully authenticated as principal sammy on admin

    Можете исто така да го проверите статусот на вашите контејнери со docker-compose ps:

    1. docker-compose ps

    Излезот покажува дека вашите контејнери работат:

    Output
    Name Command State Ports ---------------------------------------------------------------------- db docker-entrypoint.sh mongod Up 27017/tcp nodejs ./wait-for.sh db:27017 -- ... Up 0.0.0.0:80->8080/tcp

    Кога вашите услуги работат, можете да го посетите http://your_server_ip во прелистувачот:

    Кликнете на копчето Добијте информации за ајкулата за да влезете во страница со формулар за влез каде што можете да поднесете име на ајкула и опис на општиот карактер на таа ајкула:

    Во форма, додадете ајкула по ваш избор. За целите на оваа демонстрација, додадете Мегалодон ајкула во полето Име на ајкула и Античка во полето Клик на ајкула:

    Кликнете на копчето Поднеси и ќе ви се прикаже страница со овие информации за ајкулата:

    Како последен чекор, тестирајте дали податоците што штотуку сте ги внеле ќе останат ако го отстраните контејнерот со базата на податоци.

    Назад на вашиот терминал, напишете ја следнава команда за да ги запрете и отстраните контејнерите и мрежата:

    1. docker-compose down

    Забележете дека не ја вклучувате опцијата --volumes; оттука, вашиот волумен dbdata не е отстранет.

    Следниот излез потврдува дека вашите контејнери и мрежа се отстранети:

    Output
    Stopping nodejs ... done Stopping db ... done Removing nodejs ... done Removing db ... done Removing network node_project_app-network

    Повторно креирајте ги контејнерите:

    1. docker-compose up -d

    Сега вратете се на формуларот за информации за ајкула:

    Внесете нова ајкула по ваш избор. Овој пример ќе користи Кит ајкула и Голема:

    Откако ќе кликнете на Поднеси, ќе забележите дека новата ајкула е додадена во збирката на ајкули во вашата база на податоци без губење на податоците што веќе сте ги внеле:

    Вашата апликација сега работи на контејнери на Docker со овозможена упорност на податоци и синхронизација на код.

    Заклучок

    Следејќи го ова упатство, создадовте развојно поставување за вашата апликација Node користејќи контејнери на Docker. Го направивте вашиот проект помодуларен и пренослив со извлекување чувствителни информации и раздвојување на состојбата на вашата апликација од кодот на апликацијата. Конфигуриравте и датотека docker-compose.yml на boilerplate што може да ја ревидирате како што се менуваат вашите развојни потреби и барања.

    Како што се развивате, можеби ќе бидете заинтересирани да дознаете повеќе за дизајнирање апликации за контејнеризирани и модернизирање на апликации за Kubernetes за повеќе информации за овие теми.

    За да дознаете повеќе за кодот што се користи во ова упатство, видете Како да се обезбеди контејнеризирана апликација Node.js со Nginx, Let’s Encrypt и Docker Compose.