Проблемы с конфигурацией среды всегда могут доставлять нам головную боль, включая следующие ситуации.
Мы написали проект сканера Scrapy локально и хотим запустить его на сервере, но среда Python не установлена на сервере.
Другие предоставили нам проект сканера Scrapy, версия пакета, используемого проектом, не соответствует версии локальной среды, и проект нельзя запустить напрямую.
Нам нужно одновременно управлять разными версиями проектов Scrapy.Например, более ранние проекты зависели от Scrapy 0.25, а текущие проекты зависят от Scrapy 1.4.0.
В этих случаях нам необходимо решить проблему установки и настройки среды и разрешения конфликтов версий в среде.
Для Python Virtualenv действительно может решить проблему версий конфликтов. Однако Virtualenv не очень удобно для развертывания проекта, нам все еще нужно установить среду Python,
Как решить вышеуказанную проблему? Ответ заключается в использовании Docker. Docker может предоставить виртуальную среду на уровне операционной системы.Образ Docker обычно содержит полную операционную систему, и эти системы также имеют настроенную среду разработки, например среду Python 3.6.
Мы можем напрямую использовать этот образ Docker Python 3 для запуска контейнера и помещать проект непосредственно в контейнер для запуска без дополнительной настройки среды Python 3. Это решает проблему конфигурации среды.
Мы также можем дополнительно преобразовать проект Scrapy в новый образ Docker, который содержит только среду Python, подходящую для этого проекта. Если вы хотите выполнить развертывание на других платформах, вам нужно только загрузить образ и запустить его.Поскольку Docker использует для запуска виртуальную среду, он полностью изолирован от хоста, поэтому вам не нужно беспокоиться о конфликтах среды.
Если мы сможем превратить проект Scrapy в образ Docker, пока Docker установлен на других хостах, нам просто нужно загрузить и запустить образ, не беспокоясь о проблемах с конфигурацией среды или конфликтах версий.
Далее мы пытаемся превратить проект Scrapy в образ Docker.
1. Цель этого раздела
Мы хотим реализовать процесс упаковки предыдущего входного проекта Scrapy в образ Docker. Веб-сайт, просканированный проектом: http://quotes.toscrape.com/. В разделе «Начало работы со Scrapy» этой главы реализован процесс сканирования Scrapy для этого сайта.Код проекта: https://github.com/Python3WebSpider/ScrapyTutorial. Если он не существует локально, код можно клонировать.
2. Подготовка
Убедитесь, что Docker и MongoDB установлены и работают.
3. Создайте Dockerfile
Сначала создайте файл requirements.txt в корневом каталоге проекта и перечислите все пакеты среды Python, от которых зависит весь проект, как показано ниже:
scrapy
pymongo
Если библиотеке требуется определенная версия, мы также можем указать номер версии следующим образом:
scrapy>=1.4.0
pymongo>=3.4.0
В файле Dockerfile нового корневого каталога проекта без расширения измените содержимое следующим образом:
FROM python:3.6
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip3 install -r requirements.txt
CMD scrapy crawl quotes
первая строкаFROM
Представляет используемый базовый образ Docker.Здесь мы напрямую используем образ python:3.6 и запускаем проект Scrapy на его основе.
вторая линияENV
это параметр переменной среды, который будет/usr/local/bin:$PATH
назначить вPATH
, то есть увеличить/usr/local/bin
Этот путь к переменной среды.
Третий рядADD
заключается в размещении локального кода в виртуальном контейнере. Он принимает два параметра: первый параметр.
, представляющий локальный текущий путь; второй параметр/code
, представляющий путь в виртуальном контейнере, то есть размещение всего содержимого локального проекта в каталоге /code виртуального контейнера, чтобы код можно было запустить в виртуальном контейнере.
четвертый рядWORKDIR
заключается в указании рабочего каталога, здесь только что добавленный путь к коду устанавливается в качестве рабочего пути. Структура каталогов по этому пути такая же, как текущая локальная структура каталогов, поэтому мы можем напрямую выполнять команды установки библиотеки, команды запуска сканера и т. д.
Пятая линияRUN
Это выполнить некоторые команды, чтобы сделать некоторую подготовку среды. Поскольку в виртуальном контейнере Docker есть только среда Python 3 и нет необходимой библиотеки Python, мы запускаем эту команду, чтобы установить соответствующую библиотеку Python, такую как Scrapy, в виртуальном контейнере, чтобы команду Scrapy можно было выполнить в виртуальном контейнере.
шестой рядCMD
это команда запуска контейнера. Эта команда выполняется, когда контейнер запущен. Здесь мы запускаем сканер напрямую с помощью кавычек для сканирования.
В-четвертых, измените соединение MongoDB.
Далее нам нужно изменить информацию о соединении для MongoDB. Если мы продолжим использовать localhost, мы не сможем найти MongoDB, потому что в виртуальном контейнере Docker localhost фактически указывает на работающий IP самого контейнера, а MongoDB не установлена внутри контейнера, поэтому краулер не может подключиться к MongoDB.
Адрес MongoDB здесь может иметь следующие два параметра.
Если мы хотим протестировать только эту машину, мы можем изменить адрес на IP-адрес хост-машины, то есть на локальный IP-адрес вне контейнера, который обычно является IP-адресом локальной сети.
ifconfig
команда для просмотра.Если вы хотите выполнить развертывание на удаленном хосте для запуска, обычно MongoDB — это адрес, доступный из общедоступной сети, и вы можете изменить его на этот адрес.
В этом разделе наша цель — упаковать проект в образ, чтобы другие удаленные хосты также могли запускать проект. Таким образом, мы напрямую изменяем адрес MongoDB здесь на адрес удаленной базы данных, доступный из общедоступной сети, изменяемMONGO_URI
Следующее:
MONGO_URI = 'mongodb://admin:admin123@120.27.34.25:27017'
Адрес здесь может быть изменен на ваш собственный адрес удаленной базы данных MongoDB.
На этом настройка проекта завершена.
Пять, постройте зеркало
Затем мы создаем образ Docker и выполняем следующую команду:
docker build -t quotes:latest .
Вывод во время выполнения выглядит так:
Sending build context to Docker daemon 191.5 kB
Step 1/6 : FROM python:3.6
---> 968120d8cbe8
Step 2/6 : ENV PATH /usr/local/bin:$PATH
---> Using cache
---> 387abbba1189
Step 3/6 : ADD . /code
---> a844ee0db9c6
Removing intermediate container 4dc41779c573
Step 4/6 : WORKDIR /code
---> 619b2c064ae9
Removing intermediate container bcd7cd7f7337
Step 5/6 : RUN pip3 install -r requirements.txt
---> Running in 9452c83a12c5
...
Removing intermediate container 9452c83a12c5
Step 6/6 : CMD scrapy crawl quotes
---> Running in c092b5557ab8
---> c8101aca6e2a
Removing intermediate container c092b5557ab8
Successfully built c8101aca6e2a
Такой вывод указывает на то, что сборка образа прошла успешно. На этом этапе мы смотрим на построенное изображение, как показано ниже:
docker images
Строка кода в возвращаемом результате выглядит так:
quotes latest 41c8499ce210 2 minutes ago 769 MB
Это наш недавно построенный образ.
6. Операция
Образ можно сначала протестировать локально, выполнив следующую команду:
docker run quotes
Таким образом, мы используем этот образ для создания и запуска контейнера Docker, и эффект запуска точно такой же, как показано на следующем рисунке.
Если есть работающий результат, аналогичный показанному на рисунке, это доказывает, что с построенным образом проблем нет.
7. Отправить в Docker Hub
После завершения сборки мы можем отправить образ на платформу размещения образов Docker, такую как Docker Hub или частный реестр Docker, чтобы получить образ с удаленного сервера и запустить его.
Возьмем, к примеру, Docker Hub. Если проект содержит некоторую информацию о частном соединении (например, базу данных), нам лучше сделать репозиторий частным или поместить его непосредственно в частный реестр Docker.
Сначала зарегистрируйте учетную запись на https://hub.docker.com и создайте новый репозиторий с именем quotes. Например, мое имя пользователя — germey, а имя только что созданного Репозитория — кавычки, тогда адрес этого Репозитория можно представить как germey/quotes.
Чтобы пометить только что созданный образ, команда выглядит следующим образом:
docker tag quotes:latest germey/quotes:latest
Просто отправьте образ в Docker Hub, команда выглядит следующим образом:
docker push germey/quotes
Новый образ Push Docker появится в Docker Hub, как показано на следующем рисунке.
Если мы хотим запустить этот образ на другом хосте, после установки Docker на хост мы можем напрямую выполнить следующую команду:
docker run germey/quotes
Это автоматически загрузит образ и запустит контейнер. Нет необходимости настраивать среду Python и не нужно беспокоиться о конфликтах версий.
Эффект операции показан на рисунке ниже.
После обхода всего проекта данные можно сохранить в указанной базе данных.
8. Заключение
Мы объяснили процесс преобразования проекта Scrapy в образ Docker и его развертывания на удаленном сервере для запуска. Таким образом, проблемы, которые мы перечислили в начале этого раздела, решаются.
Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми
Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.
WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)