Запускает образ как контейнер

Предпосылки

Выполняет шаги по созданию образа Node JS в Создаёт свой образ узла.

Обзор

В предыдущем модуле мы создали пример приложения, а затем создали Dockerfile, который использовали для создания образа. Мы создали наш образ с помощью команды docker build. Теперь, когда у нас есть образ, мы можем запускает его и посмотреть, правильно ли работает наше приложение.

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

Чтобы запускает образ внутри контейнера, мы используем команду docker run. Для команды docker run требуется один параметр — имя образа. Давайте запустим наш образ и убедимся, что он работает правильно. Выполняет следующую команду в своём терминале.

$ docker run node-docker

Когда вы запускает эту команду, вы заметите, что вы не вернулись в командную строку. Это связано с тем, что наше приложение является сервером REST и будет работать в цикле, ожидая входящих запросов, не возвращая управление ОС, пока мы не остановим контейнер.

Давайте откроем новый терминал, затем сделаем POST-запрос на сервер с помощью команды curl.

$ curl --request POST \
  --url http://localhost:8000/test \
  --header 'content-type: application/json' \
  --data '{"msg": "testing"}'
curl: (7) Failed to connect to localhost port 8000: Connection refused

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

Чтобы останавливает контейнер, нажмите ctrl-c. Это вернёт вас к приглашению терминала.

Чтобы опубликовать порт для нашего контейнера, мы будем использовать флаг --publish (сокращенно -p) в команде запуска docker. Формат команды --publish[host port]:[container port]. Итак, если бы мы хотели открывает порт 8000 внутри контейнера для порта 3000 снаружи контейнера, мы бы передали 3000:8000 флагу –publish.

Запускает контейнер и открывает порт 8000 для порта 8000 на хосте.

$ docker run --publish 8000:8000 node-docker

Теперь давайте повторно запустим команду curl сверху. Не забудьте открывает новый терминал.

$ curl --request POST \
  --url http://localhost:8000/test \
  --header 'content-type: application/json' \
  --data '{"msg": "testing"}'
{"code":"success","payload":[{"msg":"testing","id":"dc0e2c2b-793d-433c-8645-b3a553ea26de","createDate":"2020-09-01T17:36:09.897Z"}]}

Успех! Нам удалось подключиться к приложению, работающему внутри нашего контейнера на порту 8000. Вернитесь к терминалу, где работает ваш контейнер, и вы должны увидеть запрос POST, зарегистрированный в консоли.

2020-09-01T17:36:09:8770  INFO: POST/test

Нажмите ctrl-c, чтобы останавливает контейнер.

Запуск в отсоединенном режиме

Пока это здорово, но наш пример приложения — это веб-сервер, и нам не нужно подключать наш терминал к контейнеру. Docker может запускать ваш контейнер в автономном режиме или в фоновом режиме. Для этого мы можем использовать --detach или -d для краткости. Docker запустит ваш контейнер так же, как и раньше, но на данный раз «отсоединится» от контейнера и вернёт вас в командную строку терминала.

$ docker run -d -p 8000:8000 node-docker
ce02b3179f0f10085db9edfccd731101868f58631bdf918ca490ff6fd223a93b

Docker запустил наш контейнер в фоновом режиме и напечатал идентификатор контейнера на терминале.

Опять же, давайте убедимся, что наш контейнер работает правильно. Запускает ту же команду curl, что и выше.

$ curl --request POST \
  --url http://localhost:8000/test \
  --header 'content-type: application/json' \
  --data '{"msg": "testing"}'
{"code":"success","payload":[{"msg":"testing","id":"dc0e2c2b-793d-433c-8645-b3a553ea26de","createDate":"2020-09-01T17:36:09.897Z"}]}

Список контейнеров

Поскольку мы запускали наш контейнер в фоновом режиме, как мы узнаем, работает ли наш контейнер или какие другие контейнеры работают на нашей машине? Что ж, чтобы увидеть список контейнеров, запущенных на нашей машине, запускает docker ps. Это похоже на то, как команда ps используется для просмотра списка процессов на компьютере с Linux.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ce02b3179f0f        node-docker         "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:8000->8000/tcp   wonderful_kalam

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

Вам, наверное, интересно, откуда взялось название нашего контейнера. Поскольку мы не указали имя для контейнера при его запуске, Docker сгенерировал случайное имя. Мы исправим это через минуту, но сначала нам нужно останавливает контейнер. Чтобы останавливает контейнер, запускает команду docker stop, которая делает именно это, останавливает контейнер. Вам нужно будет передать имя контейнера или вы можете использовать идентификатор контейнера.

$ docker stop wonderful_kalam
wonderful_kalam

Теперь повторно запускает команду docker ps, чтобы увидеть список запущенных контейнеров.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Останавливает, запускает и назвать контейнеры

Контейнеры Docker можно запускать, останавливать и перезапускать. Когда мы останавливаем контейнер, он не удаляется, но статус изменяется на остановлен, и процесс внутри контейнера останавливается. Когда мы запустили команду docker ps, по умолчанию выводятся только запущенные контейнеры. Если мы передадим --all или -a для краткости, мы увидим все контейнеры в нашей системе, независимо от того, запущены они или остановлены.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
ce02b3179f0f        node-docker         "docker-entrypoint.s…"   16 minutes ago      Exited (0) 5 minutes ago                        wonderful_kalam
ec45285c456d        node-docker         "docker-entrypoint.s…"   28 minutes ago      Exited (0) 20 minutes ago                       agitated_moser
fb7a41809e5d        node-docker         "docker-entrypoint.s…"   37 minutes ago      Exited (0) 36 minutes ago                       goofy_khayyam

Если вы следили за этим, вы должны увидеть несколько контейнеров в списке. Это контейнеры, которые мы запускали и останавливали, но не удалили.

Давайте перезапустим контейнер, который мы только что остановили. Найти имя контейнера, который мы только что остановили, и заменяет имя контейнера далее в команде перезапуска.

$ docker restart wonderful_kalam

Теперь снова выводит список всех контейнеров с помощью команды ps.

$ docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
ce02b3179f0f        node-docker         "docker-entrypoint.s…"   19 minutes ago      Up 8 seconds                0.0.0.0:8000->8000/tcp   wonderful_kalam
ec45285c456d        node-docker         "docker-entrypoint.s…"   31 minutes ago      Exited (0) 23 minutes ago                            agitated_moser
fb7a41809e5d        node-docker         "docker-entrypoint.s…"   40 minutes ago      Exited (0) 39 minutes ago                            goofy_khayyam

Обратите внимание, что контейнер, который мы только что перезапустили, был запущен в автономном режиме и имеет открытый порт 8000. Кроме того, обратите внимание, что состояние контейнера — «Up X секунды». Когда вы перезапускаете контейнер, он будет запущен с теми же флагами или командами, с которыми он был запущен изначально.

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

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

$ docker stop wonderful_kalam
wonderful_kalam

Теперь, когда все наши контейнеры остановлены, давайте их удалим. Когда контейнер удален, он больше не работает и не находится в остановленном состоянии. Однако процесс внутри контейнера был остановлен, а метаданные контейнера удалены.

$ docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
ce02b3179f0f        node-docker         "docker-entrypoint.s…"   19 minutes ago      Up 8 seconds                0.0.0.0:8000->8000/tcp   wonderful_kalam
ec45285c456d        node-docker         "docker-entrypoint.s…"   31 minutes ago      Exited (0) 23 minutes ago                            agitated_moser
fb7a41809e5d        node-docker         "docker-entrypoint.s…"   40 minutes ago      Exited (0) 39 minutes ago                            goofy_khayyam

Чтобы удаляет контейнер, просто запускает команду docker rm, передав имя контейнера. Вы можете передать несколько имён контейнеров команде в одной команде.

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

$ docker rm wonderful_kalam agitated_moser goofy_khayyam
wonderful_kalam
agitated_moser
goofy_khayyam

Запускает команду docker ps --all ещё раз, чтобы убедиться, что все контейнеры исчезли.

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

Чтобы назвать контейнер, нам просто нужно передать флаг --name в команду запуска.

$ docker run -d -p 8000:8000 --name rest-server node-docker
1aa5d46418a68705c81782a58456a4ccdb56a309cb5e6bd399478d01eaa5cdda
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1aa5d46418a6        node-docker         "docker-entrypoint.s…"   3 seconds ago       Up 3 seconds        0.0.0.0:8000->8000/tcp   rest-server

Теперь мы можем легко идентифицировать наш контейнер по имени.

Следующие шаги

В этом модуле мы рассмотрели запуск контейнеров, публикацию портов и запуск контейнеров в автономном режиме. Мы также рассмотрели управление контейнерами путём их запуска, остановки и перезапуска. Мы также рассмотрели возможность именования наших контейнеров, чтобы их было легче идентифицировать. В следующем модуле мы узнаем, как запускает базу данных в контейнере и подключить её к нашему приложению. Видеть:

Как разработать свое приложение

Обратная связь

Помогите нам улучшить эту тему, оставив свой отзыв. Дайте нам знать, что вы думаете, создав задачу в репозитории Документы Docker GitHub. Или создайте PR, чтобы предложить обновления.