| Ім'я файлу: Коморін КНбак41 Лаб 1-2.docx Розширення: docxРозмір: 53кб.Дата: 21.12.2023скачати ОДЕСЬКИЙ НАЦІОНАЛЬНИЙ МОРСЬКИЙ УНІВЕРСИТЕТ
Кафедра Технічної кібернетики й інформаційних технологій ім. проф. Р.В. Меркта
Звіт з практичної роботи №4
з дисципліни «Технології розподілених систем та паралельних обчислень»
на тему: Контейнеризація додатків
та оркестрування мікросервісів
Виконав:
студент 4 курсу
1 групи ФСІТіС
Коморін М.В.
Перевірив:
ст.викладач
Рубльов І.С.
ОДЕСА – 2023
Частина 1. Контейнеризація додатків
та оркестрування мікросервісів
Лабораторні роботи №1 – 2
Лабораторна робота 1
Налаштування середовища виконання.
Почнемо з клонування даних з репозиторію демонстраційного коду, зміни робочого каталогу та перевірки вмісту гілки демонстрації.
$ git clone https://github.com/ibnesayeed/linkextractor.git
$ cd linkextractor
$ git checkout demo
$ tree
.
├── README.md
Результат:
[node1 ]$ git clone https://github.com/ibnesayeed/linkextractor.git
Cloning into 'linkextractor'...
remote: Enumerating objects: 144, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 144 (delta 0), reused 4 (delta 0), pack-reused 140
Receiving objects: 100% (144/144), 44.55 KiB | 0 bytes/s, done.
Resolving deltas: 100% (43/43), done.
[node1 ]$ cd linkextractor
[node1 linkextractor]$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'
[node1 linkextractor]$ ls
README.md
Крок 0: Базовий скрипт екстрактора посилань
Якщо ви починаєте нове заняття на сайті training.play-with-docker.com, не забувайте налаштувати середовище виконання (як було показано раніше).
Перейдемо на гілку step0 і перевіримо у ній файли:
$ git checkout step0
$ tree
.
├── README.md
└── linkextractor.py
0 каталогів, 2 файли
Результат:
[node1 linkextractor]$ git checkout step0
Branch step0 set up to track remote branch step0 from origin.
Switched to a new branch 'step0'
[node1 linkextractor]$ ls
README.md linkextractor.py
Нас цікавить файл linkextractor.py, тому подивимося на його вміст:
$ cat linkextractor.py
Результат:
[node1 linkextractor]$ cat linkextractor.py
#!/usr/bin/env python
import sys
import requests
from bs4 import BeautifulSoup
res = requests.get(sys.argv[-1])
soup = BeautifulSoup(res.text, "html.parser")
for link in soup.find_all("a"):
print(link.get("href"))
Це простий скрипт мовою Python, який імпортує три пакети: sys – стандартна бібліотека та два популярних сторонніх пакети requests та bs4. Наданий користувачем аргумент командного рядка (очікується, що це буде URL-адреса HTML-сторінки) використовується для отримання даних сторінки за допомогою пакета requests, які потім аналізується за допомогою парсера документів BeautifulSoup. Потім результати з дерева аналізу перебираються, щоб знайти всі елементи anchor (тобто теги ) і роздрукувати значення їх атрибуту href, що містить гіперпосилання.
Beautiful Soup – це бібліотека Python для знаходження даних в файлах HTML та XML. Вона працює з парсером, надаючи розробнику природні способи навігації, пошуку та зміни в дереві розбору, що спрощує програмістам задачу аналізу XML-документів.
Цей досить простий сценарій може виявитися не простим для виконанні на комп’ютері, який не відповідає вимогам. Файл README.md нагадує, як його запустити цей скрипт на виконання. Спробуємо:
$ ./linkextractor.py http://example.com/
Результат:
[node1 linkextractor]$ ./linkextractor.py http://example.com/
bash: ./linkextractor.py: Permission denied
Ми спробували виконати скрипт та отримали помилку Permission denied. Перевіримо поточні права для цього файлу:
$ ls -l linkextractor.py
Результат:
[node1 linkextractor]$ ls -l linkextractor.py
-rw-r--r-- 1 root root 220 Oct 12 12:15 linkextractor.py
Права -rw-r - r-- вказують, що сценарій налаштований як не виконуваний. Ми можемо або змінити його права, виконавши команду chmod a+x linkextractor.py, або запустити його на виконання як програму Python, як показано нижче:
$ python linkextractor.py
Результат:
[node1 linkextractor]$ python linkextractor.py
Traceback (most recent call last):
File "linkextractor.py", line 4, in
import requests
ImportError: No module named requests
Крок 1. Скрипт контейнерного вилучення посилань
Перейдемо на гілку step1 і розглянемо файли.
$ git checkout step1
Результат:
[node1 linkextractor]$ git checkout step1
Branch step1 set up to track remote branch step1 from origin.
Switched to a new branch 'step1'
[node1 linkextractor]$ ls
Dockerfile README.md linkextractor.py
На цьому етапі додався один новий файл – Dockerfile. Давайте подивимося на його вміст:
Результат:
[node1 linkextractor]$ cat Dockerfile
FROM python:3
LABEL maintainer="Sawood Alam <@ibnesayeed>" RUN pip install beautifulsoup4
RUN pip install requests WORKDIR /app
COPY linkextractor.py /app/
RUN chmod a+x linkextractor.py ENTRYPOINT ["./linkextractor.py"]
Ми описали, яким має бути образ Docker, але насправді ми його ще не створювали.
Тепер перейдемо в директорію проекту та створимо образ з ім’ям linkextractor:step1.
Виконаємо команду:
$ docker image build -t linkextractor:step1 .
Результат:
[node1 linkextractor]$ docker image build -t linkextractor:step1 .
[+] Building 37.5s (6/10)
[+] Building 39.0s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 304B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3 1.3s
=> [1/6] FROM docker.io/library/python:3@sha256:e2d7d517aa027ab19b99876e228253734f063531f45728baaa751e48 30.5s
=> => resolve docker.io/library/python:3@sha256:e2d7d517aa027ab19b99876e228253734f063531f45728baaa751e48d 0.0s
=> => sha256:c29963e5963a17bda75b34b04d0eda9f01b3f0e1811b22dcfb095a6145c1ebe8 2.01kB / 2.01kB 0.0s
=> => sha256:3c055746a2ccda17e451bae4cd77b3acd7d91f6163acfd008cbab0ff139ac5b1 7.30kB / 7.30kB 0.0s
=> => sha256:1ccc26d841b4acc2562483bf393ce1cf8bc358ced09ccd825425226827c79c92 24.05MB / 24.05MB 0.4s
=> => sha256:e2d7d517aa027ab19b99876e228253734f063531f45728baaa751e48d2692f16 2.14kB / 2.14kB 0.0s
=> => sha256:0a9573503463fd3166b5b1f34a7720dac28609e98d731e50e7068f92e79b8545 49.58MB / 49.58MB 0.9s
=> => sha256:800d84653581fc119cd75cd572fa190d3b813d49221b9e5ee463e3560e2cb342 64.13MB / 64.13MB 0.8s
=> => sha256:7c632e57ea62ea950c367f484f52cdcfd2adb12060a31f5c413f40db9822e96e 211.06MB / 211.06MB 2.8s
=> => sha256:f9a1922eee8a7d8ea8d227102bf5b6671dd4f68a152a438c803c54092410bb28 6.39MB / 6.39MB 1.1s
=> => sha256:7c45daddd450da82621d3670e1862f4b8a0da6a7a2fd7b3d123689bd9bb14850 22.51MB / 22.51MB 1.3s
=> => extracting sha256:0a9573503463fd3166b5b1f34a7720dac28609e98d731e50e7068f92e79b8545 4.5s
=> => sha256:0952bd8ba4ecedd2507f098cb24a60895729d644dfef9b7240bee40c07910e0e 242B / 242B 1.2s
=> => sha256:f0f1ba98266589a2bb0ea1ced8bd1309f5cd3e59047429a16610db082554e75d 2.67MB / 2.67MB 1.3s
=> => extracting sha256:1ccc26d841b4acc2562483bf393ce1cf8bc358ced09ccd825425226827c79c92 1.4s
=> => extracting sha256:800d84653581fc119cd75cd572fa190d3b813d49221b9e5ee463e3560e2cb342 5.6s
=> => extracting sha256:7c632e57ea62ea950c367f484f52cdcfd2adb12060a31f5c413f40db9822e96e 14.7s
=> => extracting sha256:f9a1922eee8a7d8ea8d227102bf5b6671dd4f68a152a438c803c54092410bb28 0.6s
=> => extracting sha256:7c45daddd450da82621d3670e1862f4b8a0da6a7a2fd7b3d123689bd9bb14850 1.4s
=> => extracting sha256:0952bd8ba4ecedd2507f098cb24a60895729d644dfef9b7240bee40c07910e0e 0.0s
=> => extracting sha256:f0f1ba98266589a2bb0ea1ced8bd1309f5cd3e59047429a16610db082554e75d 0.5s
=> [internal] load build context 0.0s
=> => transferring context: 265B 0.0s
=> [2/6] RUN pip install beautifulsoup4 3.8s
=> [3/6] RUN pip install requests 2.4s
=> [4/6] WORKDIR /app 0.0s
=> [5/6] COPY linkextractor.py /app/ 0.0s
=> [6/6] RUN chmod a+x linkextractor.py 0.6s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:63fcf8b134435da9ddc79a7ccc0388b05c1d93707e2170eb6485e9a0506b8742 0.0s
=> => naming to docker.io/library/linkextractor:step1 0.0s Якщо збірка контейнера пройшла успішно, то маємо побачити його у списку образів:
$ docker images
Результат:
[node1 linkextractor]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
linkextractor step1 63fcf8b13443 3 minutes ago 1.03GB
Тепер один раз запустимо контейнер з цим образом і отримуємо посилання з деяких діючих веб-сторінок:
$ docker container run -it --rm linkextractor:step1 http://example.com/
Результат:
[node1 linkextractor]$ docker container run -it --rm linkextractor:step1 http://example.com/
https://www.iana.org/domains/example
Тепер спробуємо це зробити для веб-сторінки з великою кількістю посилань:
$ docker container run -it --rm linkextractor:step1 https://training.play-with-docker.com/
Результат:
[node1 linkextractor]$ docker container run -it --rm linkextractor:step1 https://training.play-with-docker.com/
/
/about/
#ops
#dev
/ops-stage1
/ops-stage2
/ops-stage3
/dev-stage1
/dev-stage2
/dev-stage3
/alacart
https://twitter.com/intent/tweet?text=Play with Docker Classroom&url=https://training.play-with-docker.com/&via=docker&related=docker
https://facebook.com/sharer.php?u=https://training.play-with-docker.com/
https://plus.google.com/share?url=https://training.play-with-docker.com/
http://www.linkedin.com/shareArticle?mini=true&url=https://training.play-with-docker.com/&title=Play%20with%20Docker%20Classroom&source=https://training.play-with-docker.com
https://www.docker.com/dockercon/
https://www.docker.com/dockercon/
https://dockr.ly/slack
https://www.docker.com/legal/docker-terms-service
https://www.docker.com
https://www.facebook.com/docker.run
https://twitter.com/docker
https://www.github.com/play-with-docker/play-with-docker.github.io
Крок 2. Модуль отримання посилань з повним URI і текстом прив'язки
Перейдіть на гілку step2 і перевірте файли.
$ git checkout step2
$ tree
Результат:
[node1 linkextractor]$ git checkout step2
Branch step2 set up to track remote branch step2 from origin.
Switched to a new branch 'step2'
[node1 linkextractor]$ ls
Dockerfile README.md linkextractor.py
Подивимося на оновлений скрипт:
$ cat linkextractor.py
Результат:
[node1 linkextractor]$ cat linkextractor.py
#!/usr/bin/env python import sys
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin def extract_links(url):
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
base = url
# TODO: Update base if a element is present with the href attribute
links = []
for link in soup.find_all("a"):
links.append({
"text": " ".join(link.text.split()) or "[IMG]",
"href": urljoin(base, link.get("href"))
})
return links if __name__ == "__main__":
if len(sys.argv) != 2:
print("\nUsage:\n\t{} \n".format(sys.argv[0]))
sys.exit(1)
for link in extract_links(sys.argv[-1]):
print("[{}]({})".format(link["text"], link["href"]))
Тепер давайте створимо новий образ та подивимося, як діють ці зміни:
$ docker image build -t linkextractor:step2 .
Результат:
[node1 linkextractor]$ docker image build -t linkextractor:step2 .
[+] Building 0.4s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 304B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3 0.3s
=> [1/6] FROM docker.io/library/python:3@sha256:e2d7d517aa027ab19b99876e228253734f063531f45728baaa751e48d 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 38B 0.0s
=> CACHED [2/6] RUN pip install beautifulsoup4 0.0s
=> CACHED [3/6] RUN pip install requests 0.0s
=> CACHED [4/6] WORKDIR /app 0.0s
=> CACHED [5/6] COPY linkextractor.py /app/ 0.0s
=> CACHED [6/6] RUN chmod a+x linkextractor.py 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6b31a71fbb45936f2340f1f7086a4050509a6c7f661b129dd04d7b5eaf069710 0.0s
=> => naming to docker.io/library/linkextractor:step2
Ми використовували новий тег linkextractor:step2 для цього образу, не перезаписуючи образ step0, щоб проілюструвати, що вони можуть співіснувати, і контейнери можуть запускатися за допомогою будь-якого з цих образів.
$ docker images
Результат:
[node1 linkextractor]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
linkextractor step2 6b31a71fbb45 About a minute ago 1.03GB
linkextractor step1 63fcf8b13443 10 minutes ago 1.03GB
Запуск контейнера з використанням образу linkextractor:step2 тепер має давати покращений результат:
$ docker container run -it --rm linkextractor:step2 https://training.play-with-docker.com/
Результат:
[node1 linkextractor]$ docker container run -it --rm linkextractor:step2 https://training.play-with-docker.com/
[Play with Docker classroom](https://training.play-with-docker.com/)
[About](https://training.play-with-docker.com/about/)
[IT Pros and System Administrators](https://training.play-with-docker.com/#ops)
[Developers](https://training.play-with-docker.com/#dev)
[Stage 1: The Basics](https://training.play-with-docker.com/ops-stage1)
[Stage 2: Digging Deeper](https://training.play-with-docker.com/ops-stage2)
[Stage 3: Moving to Production](https://training.play-with-docker.com/ops-stage3)
[Stage 1: The Basics](https://training.play-with-docker.com/dev-stage1)
[Stage 2: Digging Deeper](https://training.play-with-docker.com/dev-stage2)
[Stage 3: Moving to Staging](https://training.play-with-docker.com/dev-stage3)
[Full list of individual labs](https://training.play-with-docker.com/alacart)
[[IMG]](https://twitter.com/intent/tweet?text=Play with Docker Classroom&url=https://training.play-with-docker.com/&via=docker&related=docker)
[[IMG]](https://facebook.com/sharer.php?u=https://training.play-with-docker.com/)
[[IMG]](https://plus.google.com/share?url=https://training.play-with-docker.com/)
[[IMG]](http://www.linkedin.com/shareArticle?mini=true&url=https://training.play-with-docker.com/&title=Play%20with%20Docker%20Classroom&source=https://training.play-with-docker.com)
[[IMG]](https://www.docker.com/dockercon/)
[Sign up today](https://www.docker.com/dockercon/)
[Register here](https://dockr.ly/slack)
[here](https://www.docker.com/legal/docker-terms-service)
[[IMG]](https://www.docker.com)
[[IMG]](https://www.facebook.com/docker.run)
[[IMG]](https://twitter.com/docker)
[[IMG]](https://www.github.com/play-with-docker/play-with-docker.github.io)
Кінцевий результат:
cat README.md Dockerfile linkextractor.py | less
Link Extractor: Step 2 A basic page scraping script that prints out all the hyper references and anchor texts of the given web page. ## Changes from the previous step * Paths are normalized to full URLs
* Reporting both links and anchor texts
* Usable as a module in other scripts ## Try it out ```
$ docker image build -t linkextractor:step2 .
$ docker container run -it --rm linkextractor:step2 http://example.com/
$ docker container run -it --rm linkextractor:step2 http://odu.edu/
```
FROM python:3
LABEL maintainer="Sawood Alam <@ibnesayeed>" RUN pip install beautifulsoup4
RUN pip install requests WORKDIR /app
COPY linkextractor.py /app/
RUN chmod a+x linkextractor.py ENTRYPOINT ["./linkextractor.py"]
#!/usr/bin/env python import sys
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
def extract_links(url):
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
base = url
# TODO: Update base if a element is present with the href attribute
links = []
for link in soup.find_all("a"):
links.append({
"text": " ".join(link.text.split()) or "[IMG]",
"href": urljoin(base, link.get("href"))
})
return links if __name__ == "__main__":
if len(sys.argv) != 2:
print("\nUsage:\n\t{} \n".format(sys.argv[0]))
sys.exit(1)
for link in extract_links(sys.argv[-1]):
print("[{}]({})".format(link["text"], link["href"]))
Висновки:
Ми дізналися, як помістити скрипт у контейнер разом з необхідними залежностями, щоб зробити його більш переносимим. Крім того, ми дізналися, як поступово вносити зміни до програми та створювати різні варіанти образів Docker, які можуть співіснувати. Далі, у роботі №2, ми створимо веб-службу, яка буде використовувати цей сценарій і змусить службу працювати всередині контейнера Docker.
Лабораторна робота 2
Крок 3. Link Extractor API Service
Перейдіть на гілку step3 та перевірте файли:
$ git checkout step3
$ tree
Результат:
[node1 linkextractor]$ git checkout step3
Branch step3 set up to track remote branch step3 from origin.
Switched to a new branch 'step3'
[node1 linkextractor]$ ls
Dockerfile README.md linkextractor.py main.py requirements.txt
Подивимося на зміни в Dockerfile:
$cat Dockerfile
Результат:
[node1 linkextractor]$ cat Dockerfile
FROM python:3
LABEL maintainer="Sawood Alam <@ibnesayeed>" WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt COPY *.py /app/
RUN chmod a+x *.py CMD ["./main.py"]
Файл requirements.txt:
$ cat requirements.txt
Результат:
[node1 linkextractor]$ cat requirements.txt
beautifulsoup4
flask
requests
$ cat linkextractor.py
Результат:
[node1 linkextractor]$ cat linkextractor.py
#!/usr/bin/env python import sys
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin def extract_links(url):
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
base = url
# TODO: Update base if a element is present with the href attribute
links = []
for link in soup.find_all("a"):
links.append({
"text": " ".join(link.text.split()) or "[IMG]",
"href": urljoin(base, link.get("href"))
})
return links if __name__ == "__main__":
if len(sys.argv) != 2:
print("\nUsage:\n\t{} \n".format(sys.argv[0]))
sys.exit(1)
for link in extract_links(sys.argv[-1]):
print("[{}]({})".format(link["text"], link["href"]))
Модуль linkextractor.py на цьому етапі залишився незмінним, тому тепер розглянемо щойно доданий файл main.py:
$ cat main.py
Результат:
[node1 linkextractor]$ cat main.py
#!/usr/bin/env python from flask import Flask
from flask import request
from flask import jsonify
from linkextractor import extract_links app = Flask(__name__) @app.route("/")
def index():
return "Usage: http://[: ]/api/" @app.route("/api/ ")
def api(url):
qs = request.query_string.decode("utf-8")
if qs != "":
url += "?" + qs
links = extract_links(url)
return jsonify(links) app.run(host="0.0.0.0")
В цьому скрипту ми імпортували функцію extract_links з модуля linkextractor і конвертуємо список об'єктів links у відповідь в форматі JSON.
Створимо новий образ з урахуванням цих змін:
$ docker image build -t linkextractor:step3 .
Результат:
[node1 linkextractor]$ docker image build -t linkextractor:step3 .
[+] Building 5.5s (7/10)
[+] Building 8.4s (11/11) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 278B 0.0s
=> [internal] load metadata for docker.io/library/python:3 0.8s
=> CACHED [1/6] FROM docker.io/library/python:3@sha256:e2d7d517aa027ab19b99876e228253734f063531f45728baaa 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 613B 0.0s
=> [2/6] WORKDIR /app 0.0s
=> [3/6] COPY requirements.txt /app/ 0.1s
=> [4/6] RUN pip install -r requirements.txt 6.4s
=> [5/6] COPY *.py /app/ 0.1s
=> [6/6] RUN chmod a+x *.py 0.7s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:9154a5e6aa09803e617b82a7df2fbf8a3ca5aa8f249c43f3ddd24b1ce11c3a7f 0.0s
=> => naming to docker.io/library/linkextractor:step3 0.0s
$ docker container run -d -p 5000:5000 --name=linkextractor linkextractor:step3
Результат:
[node1 linkextractor]$ docker container run -d -p 5000:5000 --name=linkextractor linkextractor:step3
c5f4d0fa9b30629dfb9de0819772a7c0e0882185fc934a2ae5871918b5106284
Те, що контейнер запущено відображається в стані Up, що ми зможемо побачити вконсолі.
$ docker ps
Результат:
[node1 linkextractor]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5f4d0fa9b30 linkextractor:step3 "./main.py" 4 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp linkextractor
Зараз ми можемо зробити за допомогою команди curl HTTP-запит у формі /api/, щоб запросити сервер і отримати відповідь, що містить вилучені посилання:
$ curl -i http://localhost:5000/api/http://example.com/
Результат:
[node1 linkextractor]$ curl -i http://localhost:5000/api/http://example.com/
HTTP/1.1 200 OK
Server: Werkzeug/3.0.0 Python/3.12.0
Date: Thu, 12 Oct 2023 13:09:49 GMT
Content-Type: application/json
Content-Length: 79
Connection: close [{"href":"https://www.iana.org/domains/example","text":"More information..."}]
У нас працює служба API, яка приймає запити у формі /api/ та повертає дані у форматі JSON. Ці дані містять як гіперпосилання, так і тексти тих посилань, що представлені на веб-сторінці за адресою .
Оскільки контейнер працює в автономному режимі, ми не можемо побачити, що відбувається всередині, але можемо переглянути журнали, використовуючи ім'я контейнера -
linkextractor:
$ docker container logs linkextractor
Результат:
[node1 linkextractor]$ docker container logs linkextractor
* Serving Flask app 'main'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.17.0.2:5000
Press CTRL+C to quit
172.17.0.1 - - [12/Oct/2023 13:09:49] "GET /api/http://example.com/ HTTP/1.1" 200 –
Ми бачимо повідомлення реєстрації при підключенні сервера та запис в журналі, коли було виконано запит за допомогою команди curl.
Тепер ми можемо видалити цей контейнер:
$ docker container rm -f linkextractor
Результат:
[node1 linkextractor]$ docker container rm -f linkextractor
linkextractor
На цьому етапі ми успішно запустили службу API, яка прослуховує порт 5000. Це чудово, але відповіді API в JSON форматі призначені лише для машин і тому далі ми запустимо веб-службу зі зручним для людини веб-інтерфейсом для звертання до нашого API- сервісу.
Крок 4. Зв'язування API екстрактора та інтерфейсної веб-служби
Перейдіть на гілку step4 і перевірте файли.
$ git checkout step4
$ tree
Результат:
[node1 linkextractor]$ git checkout step4
Branch step4 set up to track remote branch step4 from origin.
Switched to a new branch 'step4'
[node1 linkextractor]$ ls
README.md api docker-compose.yml www
Розглянемо файл docker-compose.yml, який у нас є:
$ cat docker-compose.yml
Результат:
[node1 linkextractor]$ cat docker-compose.yml
version: '3' services:
api:
image: linkextractor-api:step4-python
build: ./api
ports:
- "5000:5000"
web:
image: php:7-apache
ports:
- "80:80"
environment:
- API_ENDPOINT=http://api:5000/api/
volumes:
- ./www:/var/www/html
Тепер давайте подивимося на файл www/index.php:
$ cat ./www/index.php
Результат:
[node1 linkextractor]$ cat ./www/index.php
$api_endpoint = $_ENV["API_ENDPOINT"] ?: "http://localhost:5000/api/";
$url = "";
if(isset($_GET["url"]) && $_GET["url"] != "") {
$url = $_GET["url"];
$json = @file_get_contents($api_endpoint . $url);
if($json == false) {
$err = "Something is wrong with the URL: " . $url;
} else {
$links = json_decode($json, true);
$domains = [];
foreach($links as $link) {
array_push($domains, parse_url($link["href"], PHP_URL_HOST));
}
$domainct = @array_count_values($domains);
arsort($domainct);
}
}
?>
Link Extractor
Summary Page:
Domain |
# Links |
---|
foreach($domainct as $key => $value) {
echo "";
echo "" . $key . " | ";
echo "" . $value . " | ";
echo " ";
}
?>
Total |
|
Links
foreach($links as $link) {
echo "- " . $link["text"] . "
";
}
?>
Link Extractor by @ibnesayeed from
WS-DL, ODU
скачати
|