Поиск по сайту:

Как создать приложение Node.js с помощью Docker


Введение

Платформа Docker позволяет разработчикам упаковывать и запускать приложения как контейнеры. Контейнер — это изолированный процесс, который работает в общей операционной системе и предлагает более легкую альтернативу виртуальным машинам. Хотя контейнеры не новы, они предлагают ряд преимуществ, включая изоляцию процессов и стандартизацию среды, важность которых возрастает по мере того, как все больше разработчиков используют архитектуры распределенных приложений.

При создании и масштабировании приложения с помощью Docker отправной точкой обычно является создание образа для вашего приложения, которое затем можно запустить в контейнере. Образ включает код вашего приложения, библиотеки, файлы конфигурации, переменные среды и среду выполнения. Использование образа гарантирует, что среда в вашем контейнере стандартизирована и содержит только то, что необходимо для сборки и запуска вашего приложения.

В этом руководстве вы создадите образ приложения для статического веб-сайта, который использует Docker Hub для будущего использования. Наконец, вы извлечете сохраненный образ из репозитория Docker Hub и создадите еще один контейнер, демонстрируя, как вы можете воссоздать и масштабировать свое приложение.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 18.04, настроенный в соответствии с этим руководством по начальной настройке сервера.
  • Docker установлен на вашем сервере в соответствии с шагами 1 и 2 инструкции по установке и использованию Docker в Ubuntu 18.04.
  • Установлены Node.js и npm, следуя этим инструкциям по установке с помощью PPA, управляемого NodeSource.
  • Учетная запись Docker Hub. Общие сведения о том, как это настроить, см. в этом введении, посвященном началу работы с Docker Hub.

Шаг 1 — Установка зависимостей вашего приложения

Чтобы создать свой образ, вам сначала нужно будет создать файлы приложения, которые вы затем сможете скопировать в свой контейнер. Эти файлы будут включать в себя статический контент, код и зависимости вашего приложения.

Создайте каталог для своего проекта в домашнем каталоге пользователя без полномочий root. Каталог в этом примере называется node_project, но вы можете свободно заменить его чем-то другим:

  1. mkdir node_project

Перейдите в этот каталог:

  1. cd node_project

Это будет корневой каталог проекта.

Затем создайте файл package.json с зависимостями вашего проекта и другой идентифицирующей информацией. Откройте файл с помощью nano или вашего любимого редактора:

  1. nano package.json

Добавьте следующую информацию о проекте, включая его имя, автора, лицензию, точку входа и зависимости. Обязательно замените информацию об авторе своим именем и контактными данными:

{
  "name": "nodejs-image-demo",
  "version": "1.0.0",
  "description": "nodejs image demo",
  "author": "Sammy the Shark <sammy@example.com>",
  "license": "MIT",
  "main": "app.js",
  "keywords": [
    "nodejs",
    "bootstrap",
    "express"
  ],
  "dependencies": {
    "express": "^4.16.4"
  }
}

Этот файл включает название проекта, автора и лицензию, под которой он распространяется. Лицензия npm MIT в поле лицензии, разрешающая бесплатное использование и распространение кода приложения.

Кроме того, в файле указывается:

  • main: точка входа для приложения, app.js. Далее вы создадите этот файл.
  • dependencies: зависимости проекта — в данном случае Express 4.16.4 или выше.

Хотя в этом файле репозиторий не указан, вы можете добавить его, следуя этим рекомендациям по добавлению репозитория в файл package.json. Это хорошее дополнение, если вы версионируете свое приложение.

Сохраните и закройте файл, нажав CTRL + X. Нажмите Y, а затем ENTER, чтобы подтвердить изменения.

Чтобы установить зависимости вашего проекта, выполните следующую команду:

  1. npm install

Это установит пакеты, которые вы указали в файле package.json в каталоге вашего проекта.

Теперь вы можете перейти к созданию файлов приложения.

Шаг 2 — Создание файлов приложения

Вы создадите веб-сайт, предлагающий пользователям информацию об акулах. Это приложение будет иметь основную точку входа, app.js, и каталог views, который будет включать статические ресурсы проекта. Целевая страница, index.html, предложит пользователям некоторую предварительную информацию и ссылку на страницу с более подробной информацией об акулах, sharks.html. В каталоге views вы создадите целевую страницу и sharks.html.

Сначала откройте app.js в главном каталоге проекта, чтобы определить маршруты проекта:

  1. nano app.js

В первой части этого файла создайте приложение Express и объекты Router и определите базовый каталог и порт как константы:

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

Функция require загружает модуль express, который используется для создания объектов app и router. Объект router будет выполнять функцию маршрутизации приложения, и когда вы будете определять маршруты методов HTTP, вы будете добавлять их к этому объекту, чтобы определить, как ваше приложение будет обрабатывать запросы.

Этот раздел файла также устанавливает пару констант, path и port:

  • путь: определяет базовый каталог, который будет подкаталогом views в текущем каталоге проекта.
  • port: указывает приложению прослушивать и привязываться к порту 8080.

Затем задайте маршруты для приложения с помощью объекта router:

...

router.use(function (req,res,next) {
  console.log('/' + req.method);
  next();
});

router.get('/', function(req,res){
  res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
  res.sendFile(path + 'sharks.html');
});

Функция router.use загружает промежуточную функцию, которая будет регистрировать запросы маршрутизатора и передавать их маршрутам приложения. Они определены в последующих функциях, которые указывают, что запрос GET к URL-адресу базового проекта должен возвращать страницу index.html, а запрос GET запрос к маршруту /sharks должен возвращать sharks.html.

Наконец, смонтируйте промежуточное ПО router и статические ресурсы приложения и скажите приложению прослушивать порт 8080:

...

app.use(express.static(path));
app.use('/', router);

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

Готовый файл app.js включает все следующие строки кода:

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

router.use(function (req,res,next) {
  console.log('/' + req.method);
  next();
});

router.get('/', function(req,res){
  res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
  res.sendFile(path + 'sharks.html');
});

app.use(express.static(path));
app.use('/', router);

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

Сохраните и закройте файл, когда закончите.

Затем добавьте в приложение некоторый статический контент. Начните с создания каталога views:

  1. mkdir views

Откройте файл целевой страницы index.html:

  1. nano views/index.html

Добавьте в файл следующий код, который импортирует Boostrap и создаст компонент jumbotron со ссылкой на более подробную информационную страницу sharks.html:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>About Sharks</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link href="css/styles.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>

<body>
    <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
        <div class="container">
            <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
            </button> <a class="navbar-brand" href="#">Everything Sharks</a>
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav mr-auto">
                    <li class="active nav-item"><a href="/" class="nav-link">Home</a>
                    </li>
                    <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="jumbotron">
        <div class="container">
            <h1>Want to Learn About Sharks?</h1>
            <p>Are you ready to learn about sharks?</p>
            <br>
            <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
            </p>
        </div>
    </div>
    <div class="container">
        <div class="row">
            <div class="col-lg-6">
                <h3>Not all sharks are alike</h3>
                <p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.
                </p>
            </div>
            <div class="col-lg-6">
                <h3>Sharks are ancient</h3>
                <p>There is evidence to suggest that sharks lived up to 400 million years ago.
                </p>
            </div>
        </div>
    </div>
</body>

</html>

Ниже приведен краткий обзор различных элементов файла index.html. Панель навигации верхнего уровня позволяет пользователям переключаться между страницами Home и Sharks. В подкомпоненте navbar-nav вы используете класс Bootstrap active, чтобы указать пользователю текущую страницу. Вы также указали маршруты к вашим статическим страницам, которые соответствуют маршрутам, определенным вами в app.js:

...
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
   <ul class="nav navbar-nav mr-auto">
      <li class="active nav-item"><a href="/" class="nav-link">Home</a>
      </li>
      <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
      </li>
   </ul>
</div>
...

Кроме того, вы создали ссылку на страницу с информацией об акулах в кнопке вашего джамботрона:

...
<div class="jumbotron">
   <div class="container">
      <h1>Want to Learn About Sharks?</h1>
      <p>Are you ready to learn about sharks?</p>
      <br>
      <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
      </p>
   </div>
</div>
...

Также в шапке есть ссылка на пользовательскую таблицу стилей:

...
<link href="css/styles.css" rel="stylesheet">
...

Вы создадите эту таблицу стилей в конце этого шага.

Сохраните и закройте файл, когда закончите.

Имея целевую страницу приложения, вы можете создать страницу с информацией об акулах, sharks.html, которая предложит заинтересованным пользователям дополнительную информацию об акулах.

Откройте файл:

  1. nano views/sharks.html

Добавьте следующий код, который импортирует Bootstrap, пользовательскую таблицу стилей и подробную информацию о некоторых акулах:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>About Sharks</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link href="css/styles.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>
<nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
    <div class="container">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
        </button> <a class="navbar-brand" href="/">Everything Sharks</a>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav mr-auto">
                <li class="nav-item"><a href="/" class="nav-link">Home</a>
                </li>
                <li class="active nav-item"><a href="/sharks" class="nav-link">Sharks</a>
                </li>
            </ul>
        </div>
    </div>
</nav>
<div class="jumbotron text-center">
    <h1>Shark Info</h1>
</div>
<div class="container">
    <div class="row">
        <div class="col-lg-6">
            <p>
                <div class="caption">Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans.
                </div>
                <img src="https://assets.linux-console.net/articles/docker_node_image/sawshark.jpg" alt="Sawshark">
            </p>
        </div>
        <div class="col-lg-6">
            <p>
                <div class="caption">Other sharks are known to be friendly and welcoming!</div>
                <img src="https://assets.linux-console.net/articles/docker_node_image/sammy.png" alt="Sammy the Shark">
            </p>
        </div>
    </div>
</div>

</html>

Обратите внимание, что в этом файле вы снова используете класс Bootstrap active для указания текущей страницы.

Сохраните и закройте файл, когда закончите.

Наконец, создайте пользовательскую таблицу стилей CSS, на которую вы ссылаетесь в index.html и sharks.html, создав папку css в Каталог views:

  1. mkdir views/css

Откройте таблицу стилей:

  1. nano views/css/styles.css

Добавьте следующий код, который установит нужный цвет и шрифт для ваших страниц:

.navbar {
	margin-bottom: 0;
}

body {
	background: #020A1B;
	color: #ffffff;
	font-family: 'Merriweather', sans-serif;
}

h1,
h2 {
	font-weight: bold;
}

p {
	font-size: 16px;
	color: #ffffff;
}

.jumbotron {
	background: #0048CD;
	color: white;
	text-align: center;
}

.jumbotron p {
	color: white;
	font-size: 26px;
}

.btn-primary {
	color: #fff;
	text-color: #000000;
	border-color: white;
	margin-bottom: 5px;
}

img,
video,
audio {
	margin-top: 20px;
	max-width: 80%;
}

div.caption: {
	float: left;
	clear: both;
}

Помимо настройки шрифта и цвета, этот файл также ограничивает размер изображений, указывая max-width 80%. Это не позволит изображениям занимать больше места на странице, чем вам хотелось бы.

Сохраните и закройте файл, когда закончите.

С файлами приложения и установленными зависимостями проекта вы готовы запустить приложение.

Если вы следовали инструкциям по первоначальной настройке сервера в предварительных требованиях, у вас будет активный брандмауэр, разрешающий только трафик SSH. Чтобы разрешить трафик на порт 8080, выполните:

  1. sudo ufw allow 8080

Чтобы запустить приложение, убедитесь, что вы находитесь в корневом каталоге вашего проекта:

  1. cd ~/node_project

Запустите приложение с помощью node app.js:

  1. node app.js

Перейдите в браузере по адресу http://ваш_сервер_ip:8080. Вот ваша целевая страница:

Нажав кнопку «Получить информацию об акулах», вы попадете на следующую информационную страницу:

Теперь у вас есть запущенное и работающее приложение. Когда будете готовы, закройте сервер, нажав CTRL + C. Теперь вы можете перейти к созданию Dockerfile, который позволит вам воссоздать и масштабировать это приложение по желанию.

Шаг 3 — Запись Dockerfile

Ваш Dockerfile указывает, что будет включено в контейнер вашего приложения при его выполнении. Использование Dockerfile позволяет определить среду контейнера и избежать расхождений с зависимостями или версиями среды выполнения.

Следование этим рекомендациям по созданию оптимизированных контейнеров сделает ваш образ максимально эффективным за счет минимизации количества слоев изображения и ограничения функции изображения одной целью — воссозданием файлов вашего приложения и статического содержимого.

В корневом каталоге вашего проекта создайте Dockerfile:

  1. nano Dockerfile

Образы Docker создаются с использованием последовательности многоуровневых образов, которые строятся друг на друге. Первым шагом будет добавление базового образа для вашего приложения, которое станет отправной точкой сборки приложения.

Вы можете использовать страницу образа узла Docker Hub.

Добавьте следующую инструкцию FROM, чтобы установить базовое изображение приложения:

FROM node:10-alpine

Этот образ включает Node.js и npm. Каждый Dockerfile должен начинаться с инструкции FROM.

По умолчанию образ узла Docker включает пользователя узла без полномочий root, которого можно использовать, чтобы избежать запуска контейнера приложения с правами root. Рекомендуется избегать запуска контейнеров с правами root и руководствоваться передовыми практиками.

Чтобы точно настроить разрешения для кода вашего приложения в контейнере, создайте подкаталог node_modules в /home/node вместе с каталогом app. Создание этих каталогов гарантирует, что у них будут правильные разрешения, что будет важно при создании модулей локальных узлов в контейнере с помощью npm install. В дополнение к созданию этих каталогов установите право собственности на них для пользователя вашего узла:

...
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

Дополнительные сведения о полезности объединения инструкций RUN см. в этом обсуждении того, как управлять слоями контейнера.

Затем установите рабочий каталог приложения в /home/node/app:

...
WORKDIR /home/node/app

Если WORKDIR не задан, Docker создаст его по умолчанию, поэтому рекомендуется указать его явно.

Затем скопируйте файлы package.json и package-lock.json (для npm 5+):

...
COPY package*.json ./

Добавление этой инструкции COPY перед запуском npm install или копирование кода приложения позволяет вам воспользоваться преимуществами механизма кэширования Docker. На каждом этапе сборки Docker проверяет, есть ли кешированный слой для этой конкретной инструкции. Если вы измените package.json, этот слой будет перестроен, но если вы этого не сделаете, эта инструкция позволит Docker использовать существующий слой изображения и пропустить переустановку модулей вашего узла.

Чтобы гарантировать, что все файлы приложения принадлежат пользователю узла без полномочий root, включая содержимое каталога node_modules, перед запуском npm install переключите пользователя на узел:

...
USER node

После копирования зависимостей проекта и смены пользователя запустите npm install:

...
RUN npm install

Затем скопируйте код вашего приложения с соответствующими разрешениями в каталог приложения в контейнере:

...
COPY --chown=node:node . .

Это гарантирует, что файлы приложения принадлежат пользователю узла без полномочий root.

Наконец, откройте порт 8080 в контейнере и запустите приложение:

...
EXPOSE 8080

CMD [ "node", "app.js" ]

EXPOSE не публикует порт, а вместо этого служит способом документирования того, какие порты в контейнере будут опубликованы во время выполнения. CMD запускает команду для запуска приложения — в данном случае node app.js.

Примечание. В каждом Dockerfile должна быть только одна инструкция CMD. Если вы включите более одного, только последний вступит в силу.

Есть много вещей, которые вы можете сделать с Dockerfile. Полный список инструкций см. в справочной документации по Dockerfile от Docker.

Это полный Dockerfile:


FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

CMD [ "node", "app.js" ]

Сохраните и закройте файл, когда закончите редактирование.

Перед созданием образа приложения добавьте файл .gitignore, .dockerignore указывает, какие файлы и каталоги в каталоге вашего проекта не следует копировать в ваш контейнер.

Откройте файл .dockerignore:

  1. nano .dockerignore

Внутри файла добавьте модули вашего локального узла, журналы npm, Dockerfile и файл .dockerignore:

node_modules
npm-debug.log
Dockerfile
.dockerignore

Если вы работаете с Git, вам также нужно добавить каталог .git и файл .gitignore.

Сохраните и закройте файл, когда закончите.

Теперь вы готовы собрать образ приложения с помощью команды docker build. Использование флага -t с docker build позволит вам пометить изображение запоминающимся именем. Поскольку вы собираетесь отправить образ в Docker Hub, укажите свое имя пользователя Docker Hub в теге. Вы можете пометить изображение как nodejs-image-demo, но не стесняйтесь заменить его именем по своему выбору. Не забудьте также заменить your_dockerhub_username своим именем пользователя Docker Hub:

  1. docker build -t your_dockerhub_username/nodejs-image-demo .

. указывает, что контекстом сборки является текущий каталог.

Создание образа займет некоторое время. После завершения проверьте свои изображения:

  1. docker images
Output
REPOSITORY TAG IMAGE ID CREATED SIZE your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 8 seconds ago 73MB node 10-alpine f09e7c96b6de 13 monthss ago 82.7MB

Теперь можно создать контейнер с этим образом с помощью docker run. С помощью этой команды вы включите три флага:

  • -p: публикует порт в контейнере и сопоставляет его с портом на вашем хосте. Вы можете использовать порт 80 на хосте, но вы можете изменить его по мере необходимости, если у вас есть другой процесс, работающий на этом порту. Дополнительные сведения о том, как это работает, см. в обсуждении привязки портов в документации по Docker.
  • -d: запускает контейнер в фоновом режиме.
  • --name: позволяет дать контейнеру запоминающееся имя.

Выполните следующую команду для создания контейнера:

  1. docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo

Как только ваш контейнер запущен и запущен, вы можете просмотреть список запущенных контейнеров с помощью docker ps:

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e50ad27074a7 your_dockerhub_username/nodejs-image-demo "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 0.0.0.0:80->8080/tcp, :::80->8080/tcp nodejs-image-demo

Теперь, когда ваш контейнер запущен, вы можете посетить свое приложение, перейдя в браузере по адресу http://your_server_ip:

Теперь, когда вы создали образ для своего приложения, вы можете отправить его в Docker Hub для использования в будущем.

Шаг 4 — Использование репозитория для работы с изображениями

Отправляя образ приложения в реестр, такой как Docker Hub, вы делаете его доступным для последующего использования при создании и масштабировании своих контейнеров. Чтобы продемонстрировать, как это работает, вы поместите образ приложения в репозиторий, а затем используете образ для воссоздания своего контейнера.

Первым шагом к отправке образа является вход в учетную запись Docker Hub, которую вы создали в предварительных условиях:

  1. docker login -u your_dockerhub_username

При появлении запроса введите пароль своей учетной записи Docker Hub. При таком входе в домашний каталог вашего пользователя будет создан файл ~/.docker/config.json с вашими учетными данными Docker Hub.

Теперь вы можете отправить образ приложения в Docker Hub с помощью созданного ранее тега your_dockerhub_username/nodejs-image-demo:

  1. docker push your_dockerhub_username/nodejs-image-demo

Давайте проверим полезность реестра образов, уничтожив наш текущий контейнер приложения и образ и восстановив их с помощью образа в нашем репозитории.

Сначала перечислите ваши запущенные контейнеры:

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e50ad27074a7 your_dockerhub_username/nodejs-image-demo "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:80->8080/tcp, :::80->8080/tcp nodejs-image-demo

Используя ИДЕНТИФИКАТОР КОНТЕЙНЕРА, указанный в выходных данных, остановите запущенный контейнер приложения. Обязательно замените выделенный ниже ID своим собственным ID КОНТЕЙНЕРА:

  1. docker stop e50ad27074a7

Перечислите все ваши изображения с флагом -a:

  1. docker images -a

Следующее выводится с именем вашего изображения, your_dockerhub_username/nodejs-image-demo, а также node изображение и другие изображения из вашей сборки:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 7 minutes ago 73MB <none> <none> 2e3267d9ac02 4 minutes ago 72.9MB <none> <none> 8352b41730b9 4 minutes ago 73MB <none> <none> 5d58b92823cb 4 minutes ago 73MB <none> <none> 3f1e35d7062a 4 minutes ago 73MB <none> <none> 02176311e4d0 4 minutes ago 73MB <none> <none> 8e84b33edcda 4 minutes ago 70.7MB <none> <none> 6a5ed70f86f2 4 minutes ago 70.7MB <none> <none> 776b2637d3c1 4 minutes ago 70.7MB node 10-alpine f09e7c96b6de 13 months ago 82.7MB

Удалите остановленный контейнер и все образы, включая неиспользуемые или зависшие образы, с помощью следующей команды:

docker system prune -a

Введите y при появлении запроса в выводе, чтобы подтвердить, что вы хотите удалить остановленный контейнер и изображения. Имейте в виду, что это также удалит ваш кеш сборки.

Теперь вы удалили как контейнер, в котором запущен образ вашего приложения, так и сам образ. Дополнительные сведения об удалении контейнеров, образов и томов Docker см. в разделе Удаление образов, контейнеров и томов Docker.

Теперь, когда все ваши образы и контейнеры удалены, вы можете получить образ приложения из Docker Hub:

  1. docker pull your_dockerhub_username/nodejs-image-demo

Перечислите свои изображения еще раз:

  1. docker images

Вы увидите изображение вашего приложения:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE your_dockerhub_username/nodejs-image-demo latest 1c723fb2ef12 11 minutes ago 73MB

Теперь вы можете перестроить свой контейнер с помощью команды из шага 3:

  1. docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo

Перечислите ваши запущенные контейнеры:

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f6bc2f50dff6 your_dockerhub_username/nodejs-image-demo "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:80->8080/tcp, :::80->8080/tcp nodejs-image-demo

Посетите http://your_server_ip еще раз, чтобы просмотреть работающее приложение.

Заключение

В этом руководстве вы создали статическое веб-приложение с помощью Express и Bootstrap, а также образ Docker для этого приложения. Вы использовали этот образ для создания контейнера и отправили его в Docker Hub. Оттуда вы могли уничтожить свой образ и контейнер и воссоздать их, используя свой репозиторий Docker Hub.

Если вам интересно узнать больше о том, как работать с такими инструментами, как Docker Compose и Docker Machine, для создания установок с несколькими контейнерами, вы можете ознакомиться со следующими руководствами:

  • Как установить Docker Compose в Ubuntu 18.04.
  • Как подготовить удаленные хосты Docker и управлять ими с помощью Docker Machine в Ubuntu 18.04.

Общие советы по работе с контейнерными данными см.

  • Как обмениваться данными между контейнерами Docker.
  • Как обмениваться данными между контейнером Docker и хостом.

Если вас интересуют другие темы, связанные с Docker, ознакомьтесь с нашей полной библиотекой руководств по Docker.