Контејнеризирање на апликација 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
:
- git clone https://github.com/do-community/nodejs-mongo-mongoose.git node_project
Одете до директориумот node_project
:
- cd node_project
Отворете ја датотеката package.json
на проектот користејќи nano
или вашиот омилен уредувач:
- 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
, вашата главна влезна точка на апликацијата. Отворете ја датотеката:
- 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
, која ги содржи овие информации:
- 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
со вредности што можете да ги пренесете на вашата апликација при извршување.
Отворете ја датотеката:
- 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
:
- nano .dockerignore
Додадете ја следнава линија на дното на датотеката:
...
.gitignore
.env
Зачувајте ја и затворете ја датотеката кога ќе завршите со уредувањето.
Датотеката .gitignore
во ова складиште веќе содржи .env
, но слободно проверете дали е таму:
- nano .gitignore
...
.env
...
Во овој момент, успешно сте извлекле чувствителни информации од кодот на вашиот проект и преземавте мерки за контрола на тоа како и каде се копираат овие информации. Сега можете да го додадете кодот за поврзување во вашата база на податоци за да го оптимизирате за контејнеризиран работен тек.
Чекор 3 - Измена на поставките за поврзување со базата на податоци
Вашиот следен чекор ќе биде да го направите методот за поврзување со базата на податоци поробустен со додавање код што се справува со случаите кога вашата апликација не успева да се поврзе со вашата база на податоци. Воведувањето на ова ниво на еластичност во кодот на вашата апликација е препорачана практика кога работите со контејнери користејќи Compose.
Отворете db.js
за уредување:
- 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
:
- 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 "$@"
Зачувајте ја и затворете ја датотеката кога ќе завршите со додавање на кодот.
Направете го скриптата извршна:
- chmod +x wait-for.sh
Следно, отворете ја датотеката docker-compose.yml
:
- 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 ќе ги повлече најдобрите практики на Dockerfile4.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
во позадина:- docker-compose up -d
Излезот потврдува дека вашите услуги се создадени:
Output... Creating db ... done Creating nodejs ... doneМожете исто така да добиете подетални информации за процесите на стартување со прикажување на излезот од дневникот од услугите:
- 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
:- docker-compose ps
Излезот покажува дека вашите контејнери работат:
OutputName 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
во прелистувачот:Кликнете на копчето Добијте информации за ајкулата за да влезете во страница со формулар за влез каде што можете да поднесете име на ајкула и опис на општиот карактер на таа ајкула:
Во форма, додадете ајкула по ваш избор. За целите на оваа демонстрација, додадете
Мегалодон ајкула
во полето Име на ајкула иАнтичка
во полето Клик на ајкула:Кликнете на копчето Поднеси и ќе ви се прикаже страница со овие информации за ајкулата:
Како последен чекор, тестирајте дали податоците што штотуку сте ги внеле ќе останат ако го отстраните контејнерот со базата на податоци.
Назад на вашиот терминал, напишете ја следнава команда за да ги запрете и отстраните контејнерите и мрежата:
- docker-compose down
Забележете дека не ја вклучувате опцијата
--volumes
; оттука, вашиот волуменdbdata
не е отстранет.Следниот излез потврдува дека вашите контејнери и мрежа се отстранети:
OutputStopping nodejs ... done Stopping db ... done Removing nodejs ... done Removing db ... done Removing network node_project_app-networkПовторно креирајте ги контејнерите:
- docker-compose up -d
Сега вратете се на формуларот за информации за ајкула:
Внесете нова ајкула по ваш избор. Овој пример ќе користи
Кит ајкула
иГолема
:Откако ќе кликнете на Поднеси, ќе забележите дека новата ајкула е додадена во збирката на ајкули во вашата база на податоци без губење на податоците што веќе сте ги внеле:
Вашата апликација сега работи на контејнери на Docker со овозможена упорност на податоци и синхронизација на код.
Заклучок
Следејќи го ова упатство, создадовте развојно поставување за вашата апликација Node користејќи контејнери на Docker. Го направивте вашиот проект помодуларен и пренослив со извлекување чувствителни информации и раздвојување на состојбата на вашата апликација од кодот на апликацијата. Конфигуриравте и датотека
docker-compose.yml
на boilerplate што може да ја ревидирате како што се менуваат вашите развојни потреби и барања.Како што се развивате, можеби ќе бидете заинтересирани да дознаете повеќе за дизајнирање апликации за контејнеризирани и модернизирање на апликации за Kubernetes за повеќе информации за овие теми.
За да дознаете повеќе за кодот што се користи во ова упатство, видете Како да се обезбеди контејнеризирана апликација Node.js со Nginx, Let’s Encrypt и Docker Compose.
- Првата е монтажа за поврзување што го монтира кодот на вашата апликација на домаќинот во директориумот