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

Предпосылки

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

Обзор

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

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

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

$ docker run python-docker

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

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

$ curl localhost:5000
curl: (7) Failed to connect to localhost port 5000: Connection refused

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

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

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

Мы не указывали порт при запуске приложения flask в контейнере, и по умолчанию используется значение 5000. Если мы хотим, чтобы наш предыдущий запрос на порт 5000 работал, мы можем сопоставить порт 8000 хоста с портом 5000 контейнера:

$ docker run --publish 8000:5000 python-docker

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

$ curl localhost:8000
Hello, Docker!

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

[31/Jan/2021 23:39:31] "GET / HTTP/1.1" 200 -

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

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

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

$ docker run -d -p 8000:5000 python-docker
ce02b3179f0f10085db9edfccd731101868f58631bdf918ca490ff6fd223a93b

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

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

$ curl localhost:8000
Hello, Docker!

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

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

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ce02b3179f0f        python-docker         "python3 -m flask ru…"   6 minutes ago       Up 6 minutes        0.0.0.0:8000->5000/tcp   wonderful_kalam

Команда docker 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        python-docker         "python3 -m flask ru…"   16 minutes ago      Exited (0) 5 minutes ago                        wonderful_kalam
ec45285c456d        python-docker         "python3 -m flask ru…"   28 minutes ago      Exited (0) 20 minutes ago                       agitated_moser
fb7a41809e5d        python-docker         "python3 -m flask ru…"   37 minutes ago      Exited (0) 36 minutes ago                       goofy_khayyam

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

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

$ docker restart wonderful_kalam

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

$ docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
ce02b3179f0f        python-docker         "python3 -m flask ru…"   19 minutes ago      Up 8 seconds                0.0.0.0:8000->5000/tcp   wonderful_kalam
ec45285c456d        python-docker         "python3 -m flask ru…"   31 minutes ago      Exited (0) 23 minutes ago                            agitated_moser
fb7a41809e5d        python-docker         "python3 -m flask ru…"   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        python-docker         "python3 -m flask ru…"   19 minutes ago      Exited (0) 5 seconds ago                        wonderful_kalam
ec45285c456d        python-docker         "python3 -m flask ru…"   31 minutes ago      Exited (0) 23 minutes ago                       agitated_moser
fb7a41809e5d        python-docker         "python3 -m flask ru…"   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.

$ docker run -d -p 8000:5000 --name rest-server python-docker
1aa5d46418a68705c81782a58456a4ccdb56a309cb5e6bd399478d01eaa5cdda
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1aa5d46418a6        python-docker         "python3 -m flask ru…"   3 seconds ago       Up 3 seconds        0.0.0.0:8000->5000/tcp   rest-server

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

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

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

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

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

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