Ім'я файлу: Коморін КНбак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




















Error














Summary


Page:











foreach($domainct as $key => $value) {

echo "";

echo "";

echo "";

echo "";

}

?>









Domain# Links
" . $key . "" . $value . "
Total





Links






    foreach($links as $link) {

    echo "
  • " . $link["text"] . "
  • ";

    }

    ?>









Link Extractor by @ibnesayeed from

WS-DL, ODU

скачати

© Усі права захищені
написати до нас