Простое приложение с Docker: сборка и запуск приложения в контейнере

Сборка приложения

Мы готовы собрать приложение, которое мы создали в предыдущем посте. Убедитесь, что вы все еще на верхнем уровне вашего нового каталога. Вот что должен показать ls:

$ ls
Dockerfile app.py requirements.txt

Теперь запустите команду сборки (build command). Она создает образ Docker, который мы назовем с помощью параметра --tag. Используйте -t, если вы хотите использовать более короткий вариант.

docker build --tag=friendlyhello .

Где ваш встроенный образ? Он находится в локальном реестре образов Docker вашей машины:

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

Обратите внимание, что тег по умолчанию latest (последний). Полный синтаксис для опции тега будет --tag=friendlyhello:v0.0.1.

Устранение неполадок для пользователей Linux

Настройки прокси-сервера

Прокси-серверы могут блокировать подключения к вашему веб-приложению после его установки и запуска. Если вы находитесь за прокси-сервером, добавьте следующие строки в ваш Dockerfile, используя команду ENV, чтобы указать хост и порт для ваших прокси-серверов:

# Задайте прокси-сервер, замените host:port значениями для ваших серверов
ENV http_proxy host:port
ENV https_proxy host:port

Настройка DNS

Неправильная конфигурация DNS может вызвать проблемы с pip. Вам нужно установить свой собственный адрес DNS-сервера, чтобы pip работал правильно. Возможно, вы захотите изменить настройки DNS демона Docker. Вы можете отредактировать (или создать) файл конфигурации в /etc/docker/daemon.json с помощью ключа dns следующим образом:

{
  "dns": ["your_dns_address", "8.8.8.8"]
}

В приведенном выше примере первым элементом списка является адрес вашего DNS-сервера. Второй элемент - это DNS от Google, который можно использовать, когда первый недоступен.

Прежде чем продолжить, сохраните daemon.json и перезапустите сервис докера.

sudo service docker restart

После исправления повторите попытку сборки.

Запуск приложения

Запустите приложение, сопоставив порт 4000 вашей машины с опубликованным портом 80 контейнера, используя -p:

docker run -p 4000:80 friendlyhello

Вы должны увидеть сообщение о том, что Python обслуживает ваше приложение по адресу http://0.0.0.0:80. Но это сообщение поступает из контейнера, который не знает, что вы связали порт 80 этого контейнера с портом 4000 в вашей системе и выполняете запросы по URL http://localhost:4000.

Перейдите по этому URL в веб-браузере, чтобы увидеть отображаемый контент на веб-странице.

Примечание. Если вы используете Docker Toolbox в Windows 7, используйте IP-адрес Docker Machine вместо localhost. Например, http://192.168.99.100:4000/. Чтобы узнать IP-адрес, используйте команду docker-machine ip.

Вы также можете использовать команду curl в терминале для просмотра того же содержимого.

$ curl http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

Это переназначение портов 4000:80 демонстрирует разницу между EXPOSE в Dockerfile и тем, какое значение publish установлено при docker run -p.

Нажмите CTRL+C в вашем терминале, чтобы выйти.

В Windows явно остановите контейнер

В системах Windows CTRL+C не останавливает контейнер. Итак, сначала нажмите CTRL+C, чтобы получить подсказку (или откройте другой терминал), затем введите docker container ls, чтобы просмотреть список запущенных контейнеров, а затем выполните docker container stop <Container NAME or ID>, чтобы остановить контейнер. В противном случае вы получите сообщение об ошибке от демона при попытке перезапустить контейнер на следующем шаге.

Теперь давайте запустим приложение в фоне, в отдельном режиме:

docker run -d -p 4000:80 friendlyhello

Вы получаете длинный идентификатор контейнера для своего приложения, а затем отправляетесь обратно на свой терминал. Ваш контейнер работает в фоновом режиме. Вы также можете увидеть сокращенный идентификатор контейнера с помощью Docker-контейнера ls (и оба работают взаимозаменяемо при выполнении команд):

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

Обратите внимание, что идентификатор CONTAINER совпадает с тем, что находится на http://localhost:4000.

Теперь используйте docker container stop, чтобы завершить процесс, используя идентификатор CONTAINER, например так:

docker container stop 1fa4ab2cf395


Читайте также:


Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Хэш-таблица: разрешение коллизий

Нормальные формы, пример нормализации в базе данных