Ако сте били в контакт с най-новите разработки в света на програмирането през последните няколко години, бихте забелязали силното жужене около Docker и Docker контейнерите. Тази популярност на докер не е без основание. Въвеждането на Docker значително промени начина, по който разработчиците подхождат към разработването на приложения.
Кой иска да бъде изоставен, когато подобна революционна технология удари света на програмирането? И така, днес започваме нова поредица от уроци, за да научите как да използвате Docker за разработване на приложения. Ако сте абсолютно начинаещ в Docker, този урок е правилното място за вас да започнете.
В първата статия от нашата серия уроци ние търсим да разберем какво точно е Docker и защо разработчиците толкова много обичат Docker. Също така ще докеризираме просто приложение Node.js, за да ви запознаем с основните концепции на Docker.
Защо да чакаме повече? Нека да започнем!
Docker е инструмент, който се използва за изграждане на приложения; това е да създавате, разгръщате и стартирате приложения през контейнери.
С контейнер всички библиотеки и други зависимости, необходими за стартиране на приложение, са опаковани като един пакет за разполагане.
Основната цел на контейнеризирането на приложение е изолирането им от други приложения, работещи в същата система. Този подход гарантира, че приложенията не пречат на работата помежду си и значително улеснява поддръжката на приложенията.
Въпреки че контейнерите, работещи в една и съща система, са изолирани един от друг при изпълнение, те споделят едно и също ядро на ОС. Следователно контейнерите са по-леки в сравнение с алтернативния избор за изолиране на изпълнението на приложения, виртуални машини.
Контейнеризираното приложение, работещо на вашата операционна система Windows, гарантирано работи без проблем в машината на Windows на друг потребител, въпреки промяната на средата.
Въпреки че контейнерите отдавна се използват преди Docker, представянето на Docker популяризира използването на контейнери в общността на разработчиците. Има два компонента, които се използват при докеризиране на приложение: Докер файл и Изображение на Docker . Нека да разберем какви са те.
Dockerfile е текстов файл, който съдържа набор от команди, необходими за изграждане на образ на докер. Dockerfile съдържа информация за основната операционна система, езика, местоположението на файла и мрежовите портове, наред с други неща.
Когато стартирате командата за изграждане на Docker с докер файл на място, се създава образ на докер въз основа на докер файла. Те действат като шаблони за създаване на последния контейнер за докер. Веднъж създадени, изображенията на докер са статични. Можете да извикате командата за изпълнение на Docker, за да създадете контейнера на докер, като използвате изображение на докер.
В този урок ще докеризираме приложение Node.js. Ще следваме стъпка по стъпка, за да стартираме и задействаме контейнера на Docker.
1 - Създаване на приложението Node.js 2 - Създаване на докер файл 3 - Създаване на изображението на докер 4 - Създаване на контейнера на приложението
Преди да се потопите в докеризацията на нашето приложение, трябва да се уверите, че Docker и Node.js са инсталирани във вашата система
Придвижете се до новата директория на проекта от командния ред и изпълнете следната команда, за да създадете файла package.json, който съдържа информация за зависимостите на приложението и стартовия скрипт.
npm init -y
След това инсталирайте и добавете Express като зависимост към вашето приложение, като изпълните тази команда в командния ред. Ще използваме Express за създаване на приложението.
npm install express --save
Това ще добави експреса като зависимост към нашите package.json
файл.
Сега можем да създадем Node приложение с помощта на Express.
Създайте файл с име app.js
в директорията на проекта и добавете следния код към файла.
const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(3000, () => {
console.log('Node server has started running') })
Горният код създава Node сървър, който слуша входящи заявки на порт 3000. Можете да изпълните тази команда в командния ред, за да стартирате Node сървъра.
node app.js
Сега отидете във вашия браузър и следвайте URL http://localhost:3000
и ще видите текста Hello World!
на страницата.
Изградихме просто приложение Node за нашия проект. Сега нека да преминем към създаването на dockerfile.
В dockerfile предоставяме информация, необходима за изграждането и стартирането на нашето приложение Node в средата на Docker.
Това включва посочване на езика и неговата версия, използвани в приложението, задаване на директорията на нашия проект като работна директория, копиране на всички файлове в работната директория, настройка на мрежовия порт и уточняване кой файл е входната точка на приложението. В по-сложни приложения ще трябва да зададете и променливи на околната среда и URL адреса на базата данни в dockerfile.
FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
package.json
файл.node app.js
.Използвайте следната команда, за да създадете изображение на Docker от докер файла.
docker build -t docker-tutorial .
Docker-tutorial
е името на изображението на Docker. Точката показва пътя на файла към директорията на проекта, където се намираме в момента в командния ред.
Ако изображението на ОС, посочено с ОТ команда, възел: последен , в момента не е във вашето устройство, ще бъде изтеглено от Docker Hub, когато стартирате горната команда.
След издърпване на изображението, всяка команда в докер файла ще се изпълнява една по една.
В края на изпълнението, ако видите съобщението успешно изграден , образът на докер на приложението е изграден успешно. Изпълнете тази команда, за да видите вграденото изображение на докер в локалното хранилище на изображения.
docker images
Резултатът изглежда така
Сега можем да използваме вграденото изображение, за да създадем нашия контейнер Docker. Използвайте командата за стартиране на докер, за да създадете контейнера.
docker run -p 8080:3000 docker-tutorial
Тук числата 8080 и 3000 показват външната и вътрешната страна на контейнера. Външният порт, 8080, е портът, който използваме, за да се свържем с приложението чрез нашия браузър. Вътрешният порт, 3000, е портът, който нашето приложение слуша за входящи заявки. Контейнерът на Docker картографира дадения външен порт към вътрешния порт.
Посетете URL адреса http://localhost:8080
в браузъра и вижте дали ще получите страницата с Hello World!
съобщение, което сте получили при посещение http://localhost:3000
преди. Ако отговорът е да, тогава вашият контейнер на Docker е готов и работи.
Можете да използвате тази команда, за да видите всички работещи контейнери на Docker на вашето устройство.
docker ps
Командата ще ви даде резултат като този. Тук можем да намерим CONTAINER_ID и ИМЕ на работещия контейнер.
Спомняте ли си как споменах, че приложение с променливи на околната среда изисква повече инструкции в докер файла? Стойността на променливата на околната среда се променя в зависимост от средата, в която те работят.
Обърнете внимание как изрично споменахме порта, който нашето приложение Node слуша, когато сървърът работи. Този подход е негъвкав и склонен към грешки. В случай, че изпълним нашето приложение в среда, която не отваря порта 3000 за сървъра Node, нашето приложение спира да работи.
Най-подходящото изпълнение е изваждането на номера на порта от приложението. Вместо това използваме име на променлива вместо номер на порт и задаваме стойност за тази променлива в текущата среда. В нашия случай работещата среда е контейнерът на Docker. И така, трябва да добавим номера на порта към dockerfile като променлива на околната среда.
Нека да видим как можем да направим това.
Първо, добавете променливата на околната среда към нашия докер файл с нейната стойност. Трябва да добавим нова команда към dockerfile, за да постигнем това.
FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']
Използвайки командата ENV, последвана от име на променлива и присвояване на стойност, можем да добавим нова променлива на околната среда към нашия докер файл. Забелязахте ли как е променена командата EXPOSE 3000, за да не се споменава изрично номерът на порта? Вместо това се отнася до създадената променлива PORT, за да получите точния номер на порт. С този подход, ако трябва да променим номера на порта, трябва да сменим само едно място в нашия код, което прави приложението ни лесно за поддръжка.
Сега сме променили dockerfile, следващата стъпка е промяната на app.js, за да се позове на създадената променлива на средата. За целта заместваме номера на порта 3000, използван в метода за слушане, с process.env.PORT.
const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(process.env.PORT, () => {
console.log('Node server has started running') })
Тъй като направихме промени в нашите файлове на приложения и dockerfile, трябва да изградим нов образ за нов контейнер. Но първо трябва да спрем текущия контейнер на Docker, за да постигнем това.
Можем да използваме командата docker stop, за да спрем контейнера.
docker stop f10
Стойността f10, използвана в тази команда, е първите три цифри от идентификатора на контейнера.
Можем да използваме командата docker kill, за да спрем работещия контейнер.
docker kill f10
Разликата между docker kill и docker stop е, че docker stop спира контейнера по-изящно, като освобождава използвайки ресурси и запазва състоянието. docker kill обаче спира контейнера по-рязко, без да освобождава правилно ресурси или да запазва състоянието. За контейнер, работещ в производствена среда, използването на докер-стоп за спиране на контейнера е по-добрият избор.
След като спрете работещ контейнер, не забравяйте да почистите остатъците, оставени от контейнера, от средата на хоста, като използвате следната команда.
Когато се опитате да изпълните горните команди, за да спрете контейнера, ще забележите, че терминалният раздел, който използвахме за създаването на контейнера, не може да се използва за изпълнение на повече команди, освен ако не убием контейнера. Можем да намерим решение за това, като използваме отделен раздел за стартиране на нови команди.
Но има по-добър подход. Можем да стартираме контейнера в демон режим. С режима на демона контейнерът работи във фонов режим, без да използва текущия раздел за показване на изходи.
За да стартирате контейнер в режим на демон, просто трябва да добавите допълнителен флаг -d към командата за стартиране на докер.
docker run -d -p 8080:3000 docker-tutorial
За да стартирате контейнер в интерактивен режим, контейнерът вече трябва да работи. След като влезете в интерактивен режим, можете да изпълнявате команди за добавяне или премахване на файлове в контейнера, списъчни файлове или да изпълнявате други команди за bas, които обикновено използваме.
Използвайте следната команда, за да стартирате контейнера в интерактивен режим.
docker exec -it e37 bash
Тук e37 е идентификаторът на контейнера. Поиграйте с интерактивния режим, като използвате команди bash.
В първия урок от нашата серия уроци на Docker научихте как да създадете контейнер на Docker за просто приложение Node.js. Но можете да направите повече с Docker и контейнери. В предстоящите ни уроци ще видим как да работим с бази данни, томове и да работим с множество контейнери, използвани от приложение, изградено с микроуслуги.