Как получить доступ к веб-приложению, работающему в контейнере Docker

DockerBeginner
Практиковаться сейчас

Введение

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

Понимание Docker и запуск тестового контейнера

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

Проверка установки Docker

Сначала давайте проверим, правильно ли установлен Docker в вашей системе:

docker --version

Вы должны увидеть вывод, похожий на этот, показывающий версию Docker:

Docker version 20.10.21, build baeda1f

Понимание образов и контейнеров Docker

В терминологии Docker:

  • Docker image (образ Docker) — это шаблон, содержащий код приложения, библиотеки и зависимости.
  • Docker container (контейнер Docker) — это запущенный экземпляр образа.

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

Запуск вашего первого контейнера Docker

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

docker run hello-world

Вы должны увидеть вывод, подобный этому:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
...

Это подтверждает, что Docker работает правильно в вашей системе.

Основные команды Docker

Вот некоторые основные команды Docker, которые вам следует знать:

  1. Чтобы вывести список всех запущенных контейнеров:
docker ps
  1. Чтобы вывести список всех контейнеров (включая остановленные):
docker ps -a
  1. Чтобы вывести список всех образов Docker в вашей системе:
docker images

Попробуйте эти команды и понаблюдайте за выводами. После запуска контейнера hello-world вы должны увидеть его в списке при выполнении docker ps -a (но не в docker ps, так как он завершается сразу после отображения сообщения).

Создание простого веб-приложения

На этом этапе мы создадим простое веб-приложение, используя Python и Flask, которое мы сможем развернуть в контейнере Docker.

Настройка файлов приложения

Сначала давайте создадим новую директорию для нашего веб-приложения:

mkdir -p ~/project/my-web-app
cd ~/project/my-web-app

Теперь давайте создадим простое приложение Flask. Создайте файл с именем app.py, используя редактор nano:

nano app.py

Добавьте следующий код Python в файл:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano.

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

nano requirements.txt

Добавьте следующую строку в файл:

flask==2.0.1

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano.

Создание Dockerfile

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

nano Dockerfile

Добавьте следующее содержимое в файл:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

Этот Dockerfile выполняет следующее:

  1. Использует облегченный образ Python 3.9 в качестве основы.
  2. Устанавливает рабочую директорию в /app.
  3. Копирует файл requirements и устанавливает зависимости.
  4. Копирует код приложения.
  5. Открывает порт 5000 для входящих подключений.
  6. Указывает команду для запуска при запуске контейнера.

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano.

Сборка образа Docker

Теперь давайте соберем образ Docker из нашего Dockerfile:

docker build -t my-flask-app .

Флаг -t помечает наш образ именем my-flask-app. Точка . в конце указывает, что Dockerfile находится в текущей директории.

Вы должны увидеть вывод, похожий на этот:

Sending build context to Docker daemon  x.xxxkB
Step 1/6 : FROM python:3.9-slim
 ---> xxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxx
...
Successfully built xxxxxxxxxx
Successfully tagged my-flask-app:latest

Теперь проверьте, что ваш образ был создан:

docker images | grep my-flask-app

Вы должны увидеть свой вновь созданный образ в списке.

Запуск веб-приложения в контейнере Docker

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

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

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

docker run -d -p 5000:5000 --name my-web-container my-flask-app

Эта команда выполняет следующее:

  • -d: Запускает контейнер в detached mode (в фоновом режиме)
  • -p 5000:5000: Отображает порт 5000 из контейнера на порт 5000 на хосте
  • --name my-web-container: Присваивает имя контейнеру
  • my-flask-app: Указывает образ для использования

Проверка работы контейнера

Давайте проверим, что наш контейнер запущен:

docker ps

Вы должны увидеть вывод, похожий на этот:

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   my-web-container

Доступ к веб-приложению

Теперь вы можете получить доступ к веб-приложению двумя способами:

  1. Используя curl из командной строки:
curl http://localhost:5000

Вы должны увидеть HTML-ответ:

<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>
  1. Используя веб-браузер:
    • Нажмите на значок веб-браузера в среде рабочего стола.
    • Введите http://localhost:5000 в адресной строке.
    • Вы должны увидеть "Hello from Docker!", а затем текст описания.

Понимание отображения портов

Когда мы запускаем контейнер с -p 5000:5000, мы создаем отображение между:

  • Портом хоста (первое число): 5000
  • Портом контейнера (второе число): 5000

Это означает, что любой трафик, отправленный на порт 5000 на хост-машине, будет перенаправлен на порт 5000 внутри контейнера.

Мы также можем использовать разные номера портов. Например, -p 8080:5000 отобразит порт хоста 8080 на порт контейнера 5000, что позволит вам получить доступ к приложению по адресу http://localhost:8080.

Просмотр журналов контейнера

Если вам нужно увидеть журналы из контейнера (что может быть полезно для отладки), используйте:

docker logs my-web-container

Вы должны увидеть сообщения о запуске приложения Flask.

Остановка и удаление контейнера

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

docker stop my-web-container

Чтобы удалить остановленный контейнер, используйте:

docker rm my-web-container

Вы также можете остановить и удалить контейнер одной командой:

docker rm -f my-web-container

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

Расширенное управление контейнерами Docker

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

Запуск нескольких экземпляров

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

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

docker rm -f my-web-container

Теперь давайте запустим два экземпляра нашего веб-приложения на разных портах:

docker run -d -p 5000:5000 --name web-app-1 my-flask-app
docker run -d -p 5001:5000 --name web-app-2 my-flask-app

Убедитесь, что оба контейнера запущены:

docker ps

Вы должны увидеть два запущенных контейнера:

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5001->5000/tcp   web-app-2
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   web-app-1

Теперь вы можете получить доступ к одному и тому же приложению на двух разных портах:

Ограничения ресурсов контейнера

Docker позволяет устанавливать ограничения ресурсов для ваших контейнеров. Это полезно для предотвращения потребления контейнером слишком большого количества системных ресурсов.

Давайте остановим и удалим наши предыдущие контейнеры:

docker rm -f web-app-1 web-app-2

Теперь давайте запустим контейнер с ограничениями по памяти и CPU:

docker run -d -p 5000:5000 --name limited-container --memory=512m --cpus=0.5 my-flask-app

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

  • Максимум 512 МБ памяти
  • Максимум 0,5 процессорных ядер

Убедитесь, что контейнер запущен:

docker ps

Переменные окружения контейнера

Переменные окружения — это распространенный способ настройки приложений в контейнерах Docker. Давайте изменим наше приложение Flask, чтобы использовать переменную окружения:

docker rm -f limited-container

Создайте новую версию файла app.py:

cd ~/project/my-web-app
nano app_env.py

Добавьте следующий код:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    app_name = os.environ.get('APP_NAME', 'Default App')
    return f"<h1>Hello from {app_name}!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano.

Создайте новый Dockerfile:

nano Dockerfile-env

Добавьте следующее содержимое:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app_env.py ./app.py
EXPOSE 5000
CMD ["python", "app.py"]

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano.

Соберите новый образ:

docker build -t my-flask-app-env -f Dockerfile-env .

Теперь запустите контейнер с переменной окружения:

docker run -d -p 5000:5000 --name env-container -e APP_NAME="Customized App" my-flask-app-env

Получите доступ к веб-приложению:

curl http://localhost:5000

Вы должны увидеть:

<h1>Hello from Customized App!</h1><p>This is a simple web application running in a Docker container.</p>

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

Резюме

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

Основные рассмотренные концепции:

  • Понимание образов (Docker images) и контейнеров (containers) Docker
  • Создание простого веб-приложения с помощью Flask
  • Сборка образа Docker с помощью Dockerfile
  • Запуск и доступ к контейнеризованному веб-приложению
  • Управление контейнерами Docker с помощью различных команд
  • Запуск нескольких экземпляров контейнера на разных портах
  • Установка ограничений ресурсов для контейнеров
  • Использование переменных окружения для конфигурации контейнера

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