المحتويات

المقدمة

المتطلبات الأساسية

المتطلبات

المكونات المستخدمة

معلومات أساسية

التكوين

التحقق من الصحة

استكشاف الأخطاء وإصلاحها

المقدمة

يصف هذا المستند عملية التكوين من أجل إنشاء التطبيقات المستندة إلى Docker ونشرها وإدارتها على الأجهزة القادرة على IOx من Cisco.

المتطلبات الأساسية

المتطلبات

لا توجد متطلبات خاصة لهذا المستند.

المكونات المستخدمة

تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:

- جهاز قادر على تشغيل IOx تم تكوينه ل IOx:

- تم تكوين عنوان IP

- نظام التشغيل الضيف (GOS) وإطار عمل تطبيقات Cisco (CAF) قيد التشغيل

- شكلت شبكة عنوان ترجمة (NAT) ل منفذ إلى CAF (ميناء 8443)

- تم تكوين NAT للوصول إلى طبقة GOS (المنفذ 2222)

- مضيف Linux (يتم إستخدام تثبيت CentOS 7 كحد أدنى لهذه المقالة)

- ملفات تثبيت عميل IOx التي يمكن تنزيلها من: https://software.cisco.com/download/release.html?mdfid=286306005&softwareid=286306762

تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك مباشرة، فتأكد من فهمك للتأثير المحتمل لأي أمر.

معلومات أساسية

يمكن أن يستضيف IOx أنواعا مختلفة من الحزم بشكل رئيسي Java و Python و LXC و Virtual Machine (VM) وما إلى ذلك، كما يمكنه تشغيل حاويات Docker. تقدم Cisco صورة أساسية ومستودع مركز توثيق كامل: https://devhub.cisco.com/artifactory/webapp/#/artifacts/browse/tree/General/iox-docker يمكن إستخدامه لإنشاء حاويات Docker.

هذا دليل مفصل خطوة بخطوة حول كيفية بناء حاوية إرساء بسيطة باستخدام نظام لينكس الألب. إن Alpine Linux هو صورة صغيرة من Linux (حوالي 5 ميغابايت)، والتي غالبا ما تستخدم كقاعدة لحاويات المرساة. في هذه المقالة، يمكنك البدء من جهاز تم تكوينه IOx وجهاز CentOS 7 Linux فارغ وبناء خادم ويب Python صغير وحزمه في حاوية Docker ونشر ذلك على جهاز IOx.

التكوين

1. قم بتثبيت عميل IOx وإعداده على مضيف Linux.

عميل IOx هو الأداة التي يمكنها حزم التطبيقات والتواصل مع الجهاز المزود بتقنية IOx لإدارة تطبيقات IOx.

بعد تنزيل حزمة تثبيت عميل iXP، يمكن تثبيتها على النحو التالي:

[jedepuyd@db ~]$ ll ioxclient_1.3.0.0_linux_amd64.tar.gz

-rw-r--r--. 1 jedepuyd jedepuyd 4668259 Jun 22 09:19 ioxclient_1.3.0.0_linux_amd64.tar.gz

[jedepuyd@db ~]$ tar -xvzf ioxclient_1.3.0.0_linux_amd64.tar.gz

ioxclient_1.3.0.0_linux_amd64/ioxclient

ioxclient_1.3.0.0_linux_amd64/README.md

[jedepuyd@db ~]$ ./ioxclient_1.3.0.0_linux_amd64/ioxclient --version

Config file not found : /home/jedepuyd/.ioxclientcfg.yaml

Creating one time configuration..

Your / your organization's name : Cisco

Your / your organization's URL : www.cisco.com

Your IOx platform's IP address[127.0.0.1] : 10.48.43.197

Your IOx platform's port number[8443] :

Authorized user name[root] : admin

Password for admin :

Local repository path on IOx platform[/software/downloads]:

URL Scheme (http/https) [https]:

API Prefix[/iox/api/v2/hosting/]:

Your IOx platform's SSH Port[2222]:

Activating Profile default

Saving current configuration

ioxclient version 1.3.0.0

[jedepuyd@db ~]$ ./ioxclient_1.3.0.0_linux_amd64/ioxclient --version

ioxclient version 1.3.0.0

كما ترى، يمكن إنشاء ملف تعريف لجهاز IOx عند بدء تشغيل عميل IOx لأول مرة، والذي يمكنك إدارته مع عميل IOx. في حالة رغبتك في تنفيذ ذلك لاحقا أو إذا أردت إضافة/تغيير الإعدادات، يمكنك تشغيل هذا الأمر لاحقا:إنشاء ملفات تعريف IOXCLIENT

2. قم بتركيب وإعداد Docker على مضيف Linux.

يتم إستخدام Docker لإنشاء حاوية واختبار تنفيذ نموذج التطبيق الخاص بنا.

تعتمد خطوات التثبيت لتثبيت Docker بشكل كبير على نظام تشغيل Linux الذي قمت بتثبيته عليه. بالنسبة لهذه المقالة، يمكنك إستخدام CentOS 7. للحصول على تعليمات التثبيت لمختلف التوزيعات، راجع https://docs.docker.com/engine/installation/.

تثبيت المتطلبات الأساسية:

[jedepuyd@db ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

...

Complete!

إضافة رسالة اعتماد Docker:

[jedepuyd@db ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Loaded plugins: fastestmirror

adding repo from: https://download.docker.com/linux/centos/docker-ce.repo

grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo

repo saved to /etc/yum.repos.d/docker-ce.repo

تثبيت Docker (قبول التحقق من مفتاح GPG عند التثبيت):

[jedepuyd@db ~]$ sudo yum install docker-ce

...

Complete!

بدء تشغيل Docker:

[jedepuyd@db ~]$ sudo systemctl start docker

[jedepuyd@db iox_docker_pythonweb]$ vi Dockerfile

[jedepuyd@db iox_docker_pythonweb]$ cat Dockerfile

FROM alpine:3.3

RUN apk add --no-cache python

COPY webserver.py /webserver.py

لكي تتمكن من الوصول إلى/تشغيل Docker كمستخدم عادي، أضف هذا المستخدم إلى مجموعة Docker وقم بتحديث عضوية المجموعة:

[jedepuyd@db ~]$ sudo usermod -a -G docker jedepuyd

[jedepuyd@db ~]$ newgrp docker

تسجيل الدخول إلى مركز الإرساء:

يحتوي Docker Hub على صورة قاعدة جبال الألب التي يمكنك إستخدامها. في حالة عدم وجود معرف Docker لديك بعد، تحتاج إلى التسجيل على: https://hub.docker.com/.

[jedepuyd@db ~]$ docker login

Log in with your Docker ID to push and pull images from Docker Hub. If you do not have a Docker ID, head over to https://hub.docker.com to create one.

Username: jensdepuydt

Password:

Login Succeeded

3. قم بإنشاء خادم ويب Python.

الآن بعد أن تم التحضير، يمكنك البدء في إنشاء التطبيق الفعلي الذي يمكن تشغيله على جهاز تمكين IOx.

[jedepuyd@db ~]$ mkdir iox_docker_pythonweb

[jedepuyd@db ~]$ cd iox_docker_pythonweb/

[jedepuyd@db iox_docker_pythonweb]$ vi webserver.py

[jedepuyd@db iox_docker_pythonweb]$ cat webserver.py

#!/usr/bin/env python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

import SocketServer

import os

class S(BaseHTTPRequestHandler):

def _set_headers(self):

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

def do_GET(self):

self._set_headers()

self.wfile.write("<html><body><h1>IOX python webserver</h1></body></html>")

def run(server_class=HTTPServer, handler_class=S, port=80):

server_address = ('', port)

httpd = server_class(server_address, handler_class)

print 'Starting webserver...'

log_file_dir = os.getenv("CAF_APP_LOG_DIR", "/tmp")

log_file_path = os.path.join(log_file_dir, "webserver.log")

logf = open(log_file_path, 'w')

logf.write('Starting webserver....\n')

logf.close()

httpd.serve_forever()

if __name__ == "__main__":

from sys import argv

if len(argv) == 2:

run(port=int(argv[1]))

else:

run()

هذا الرمز هو خادم ويب Python صغير جدا، والذي تقوم بإنشائه في WebServer.py. يقوم خادم الويب ببساطة بإرجاع IOx Python Web Server بمجرد طلب GET. يمكن أن يكون المنفذ الذي يبدأ عليه خادم الويب إما منفذ 80 أو أول وسيطة تعطى إلى WebServer.py.

يحتوي هذا الرمز أيضا، في دالة التشغيل، على كتابة إلى ملف سجل. يتوفر ملف السجل للاستشارة من عميل IOx أو المدير المحلي.

4. إنشاء Dockerfile وحاوية Docker.

الآن بعد أن أصبح لديك التطبيق (WebServer.py) الذي يجب تشغيله في الحاوية الخاصة بك، حان الوقت لإنشاء حاوية Docker. يتم تعريف الحاوية في Dockerfile:

[jedepuyd@db iox_docker_pythonweb]$ vi Dockerfile

[jedepuyd@db iox_docker_pythonweb]$ cat Dockerfile

FROM alpine:3.3

RUN apk add --no-cache python

COPY webserver.py /webserver.py

كما ترى، يتم أيضا الاحتفاظ بالملف Dockerfile ببساطة. تبدأ بصورة قاعدة جبال الألب، ثم قم بتثبيت Python وانسخ خادم الويب الخاص بك.py إلى جذر الحاوية.

بمجرد أن تصبح Dockerfile جاهزا، يمكنك إنشاء حاوية Docker:

jedepuyd@db iox_docker_pythonweb]$ docker build -t ioxpythonweb:1.0 .

Sending build context to Docker daemon 3.584 kB

Step 1/3 : FROM alpine:3.3

3.3: Pulling from library/alpine

10462c29356c: Pull complete

Digest: sha256:9825fd1a7e8d5feb52a2f7b40c9c4653d477b797f9ddc05b9c2bc043016d4819

Status: Downloaded newer image for alpine:3.3

---> 461b3f7c318a

Step 2/3 : RUN apk add --no-cache python

---> Running in b057a8183250

fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz

fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz

(1/10) Installing libbz2 (1.0.6-r4)

(2/10) Installing expat (2.1.1-r1)

(3/10) Installing libffi (3.2.1-r2)

(4/10) Installing gdbm (1.11-r1)

(5/10) Installing ncurses-terminfo-base (6.0-r6)

(6/10) Installing ncurses-terminfo (6.0-r6)

(7/10) Installing ncurses-libs (6.0-r6)

(8/10) Installing readline (6.3.008-r4)

(9/10) Installing sqlite-libs (3.9.2-r0)

(10/10) Installing python (2.7.12-r0)

Executing busybox-1.24.2-r1.trigger

OK: 51 MiB in 21 packages

---> 81e98c806ee9

Removing intermediate container b057a8183250

Step 3/3 : COPY webserver.py /webserver.py

---> c9b7474b12b2

Removing intermediate container 4705922100e6

Successfully built c9b7474b12b2

[jedepuyd@db iox_docker_pythonweb]$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ioxpythonweb        1.0                 c9b7474b12b2        11 seconds ago      43.4 MB

alpine              3.3                 461b3f7c318a        2 days ago          4.81 MB

يقوم أمر بناء Docker بتنزيل الصورة الأساسية وتثبيت Python والتبعيات، كما طلبت في ملف Dockerfile. الأمر الأخير هو للتحقق.

5. قم باختبار حاوية Docker التي تم إنشاؤها.

هذه الخطوة إختيارية ولكن من الجيد التحقق من أن حاوية Docker التي تم إنشاؤها للتو جاهزة للعمل كما هو متوقع.

[jedepuyd@db iox_docker_pythonweb]$ docker run -ti ioxpythonweb:1.0

/ # python /webserver.py 9000 &

/ # Starting webserver...

/ # netstat -tlpn

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      7/python

/ # exit

كما ترى في مخرجات Netstat، بعد بدء تشغيل WebServer.py، فإنه يستمع على المنفذ 9000.

6. قم بإنشاء حزمة IOx باستخدام حاوية Docker.

الآن بعد التحقق من صحة وظائف خادم الويب في الحاوية، حان الوقت لإعداد حزمة IOx وإنشائها للنشر. بما أن Dockerfile يوفر إرشادات لبناء حاوية Docker، فإن package.yaml يوفر تعليمات لعميل IOx لبناء حزمة IOx الخاصة بك.

jedepuyd@db iox_docker_pythonweb]$ vi package.yaml

[jedepuyd@db iox_docker_pythonweb]$ cat package.yaml

descriptor-schema-version: "2.2"

info:

name: "iox_docker_pythonweb"

description: "simple docker python webserver on port 9000"

version: "1.0"

author-link: "http://www.cisco.com"

author-name: "Jens Depuydt"

app:

cpuarch: "x86_64"

type: docker

resources:

profile: c1.small

network:

-

interface-name: eth0

ports:

tcp: [9000]

startup:

rootfs: rootfs.tar

target: ["python","/webserver.py","9000"]

يمكن العثور على مزيد من المعلومات حول محتويات الحزمة.yaml هنا: https://developer.cisco.com/media/iox-dev-guide-3-10-16/concepts/package_descriptor/.

بعد إنشاء الحزمة.yaml، يمكنك البدء في بناء حزمة IOx.

تتمثل الخطوة الأولى في تصدير FS الجذر لصورة Docker:

[jedepuyd@db iox_docker_pythonweb]$ docker save -o rootfs.tar ioxpythonweb:1.0

بعد ذلك، يمكنك إنشاء الحزمة.tar:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient package .

Currently active profile:  default

Command Name: package

Checking if package descriptor file is present.

Validating descriptor file /home/jedepuyd/iox_docker_pythonweb/package.yaml with package schema definitions

Parsing descriptor file.

Found schema version  2.2

Loading schema file for version  2.2

Validating package descriptor file..

File /home/jedepuyd/iox_docker_pythonweb/package.yaml is valid under schema version 2.2

Created Staging directory at :  /tmp/700740789

Copying contents to staging directory

Checking for application runtime type

Couldn't detect application runtime type

Creating an inner envelope for application artifacts

Generated  /tmp/700740789/artifacts.tar.gz

Calculating SHA1 checksum for package contents..

Parsing Package Metadata file :  /tmp/700740789/.package.metadata

Wrote package metadata file :  /tmp/700740789/.package.metadata

Root Directory :  /tmp/700740789

Output file:  /tmp/335805072

Path:  .package.metadata

SHA1 : 55614e72481a64726914b89801a3276a855c728a

Path:  artifacts.tar.gz

SHA1 : 816c7bbfd8ae76af451642e652bad5cf9592370c

Path:  package.yaml

SHA1 : ae75859909f6ea6947f599fd77a3f8f04fda0709

Generated package manifest at  package.mf

Generating IOx Package..

Package generated at /home/jedepuyd/iox_docker_pythonweb/package.tar

تتمثل نتيجة البناء في حزمة IOx (package.tar)، التي تحتوي على حاوية Docker، الجاهزة للنشر على IOx.

ملاحظة: يمكن ل IOxclient تنفيذ أمر حفظ الإرساء في خطوة واحدة أيضا. في CentOS، يؤدي ذلك إلى التصدير إلى ROOTFS.img الافتراضي بدلا من ROOTFS.tar، مما يؤدي إلى حدوث مشكلة في وقت لاحق من العملية. يمكن القيام بالخطوة الأولى التي سيتم إنشاؤها باستخدام حزمة إرساء عميل IOx IOxpythonweb:1.0.

8. نشر الحزمة وتنشيطها وبدء تشغيلها على جهاز IOx.

تتمثل الخطوات الأخيرة في نشر حزمة IOx إلى جهاز IOx وتنشيطها وبدء تشغيلها. يمكن تنفيذ هذه الخطوات باستخدام عميل IOx أو المدير المحلي أو مدير الشبكة الضبابية. بالنسبة لهذه المقالة، يمكنك إستخدام عميل IOx.

من أجل نشر الحزمة إلى جهاز IOx، أستخدم الاسم python_web:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app install python_web package.tar

Currently active profile:  default

Command Name: application-install

Installation Successful. App is available at: https://10.48.43.197:8443/iox/api/v2/hosting/apps/python_web

Successfully deployed

قبل أن تتمكن من تنشيط التطبيق، يجب تحديد كيفية تكوين الشبكة. للقيام بذلك، تحتاج إلى إنشاء ملف JSON. عند التنشيط، يمكن إرفاقه بطلب التنشيط.

[jedepuyd@db iox_docker_pythonweb]$ vi activate.json

[jedepuyd@db iox_docker_pythonweb]$ cat activate.json

{

"resources": {

"profile": "c1.small",

"network": [{"interface-name": "eth0", "network-name": "iox-nat0","port_map": {"mode": "1to1"},"ports":{"tcp":9000}}]

}

}

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app activate python_web --payload activate.json

Currently active profile :  default

Command Name: application-activate

Payload file : activate.json. Will pass it as application/json in request body..

App python_web is Activated

الإجراء الأخير هنا هو بدء تشغيل التطبيق الذي قمت بنشره وتنشيطه للتو:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app start python_web

Currently active profile :  default

Command Name: application-start

App python_web is Started

بما أنك قمت بتكوين تطبيق IOx الخاص بك للاستماع على المنفذ 9000 لطلبات HTTP الحالية، فما زلت بحاجة إلى إعادة توجيه ذلك المنفذ من جهاز IOx الخاص بك إلى الحاوية حيث إن الحاوية خلف NAT. قم بإجراء هذا على برنامج Cisco IOS® للقيام بذلك.

BRU-IOT-809-1#sh iox host list det | i IPV4

IPV4 Address of Host:       192.168.1.2

BRU-IOT-809-1#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

BRU-IOT-809-1(config)#ip nat inside source static tcp 192.168.1.2 9000 interface GigabitEthernet0 9000

BRU-IOT-809-1(config)#exit

يسرد الأمر الأول عنوان IP الداخلي لنظم التشغيل (المسؤول عن بدء/إيقاف/تشغيل حاويات IOx).

يقوم الأمر الثاني بتكوين منفذ ساكن إستاتيكي للأمام للمنفذ 9000 على واجهة Gi0 من جانب IOS إلى OS. في حالة اتصال الجهاز الخاص بك عبر منفذ L2 (والذي هو على الأرجح الحالة على IR829)، يلزمك إستبدال واجهة Gi0 بشبكة VLAN الصحيحة التي تحتوي على جملة IP nat الخارجية المكونة.

التحقق من الصحة

استخدم هذا القسم لتأكيد عمل التكوين بشكل صحيح.

للتحقق من تشغيل خادم الويب والاستجابة بشكل صحيح، يمكنك محاولة الوصول إلى خادم الويب باستخدام هذا الأمر.

[jedepuyd@db iox_docker_pythonweb]$ curl http://10.48.43.197:9000/

<html><body><h1>IOX python webserver</h1></body></html>

أو، من متصفح حقيقي كما هو موضح في الصورة.

يمكنك أيضا التحقق من حالة التطبيق من واجهة سطر الأوامر (CLI) ل IOxclient:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app status python_web

Currently active profile :  default

Command Name: application-status

Saving current configuration

App python_web is RUNNING

كما يمكنك أيضا التحقق من حالة التطبيق من واجهة المستخدم الرسومية (GUI) الخاصة بالمدير المحلي كما هو موضح في الصورة.

من أجل أن تلقي نظرة على ملف السجل الذي تكتب إليه في WebServer.py:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app logs info python_web

Currently active profile :  default

Command Name: application-logs-info

Log file information for :  python_web

Size_bytes : 711

Download_link : /admin/download/logs?filename=python_web-watchDog.log

Timestamp : Thu Jun 22 08:21:18 2017

Filename : watchDog.log

Size_bytes : 23

Download_link : /admin/download/logs?filename=python_web-webserver.log

Timestamp : Thu Jun 22 08:21:23 2017

Filename : webserver.log

Size_bytes : 2220

Download_link : /admin/download/logs?filename=python_web-container_log_python_web.log

Timestamp : Thu Jun 22 08:21:09 2017

Filename : container_log_python_web.log

استكشاف الأخطاء وإصلاحها

يوفر هذا القسم معلومات يمكنك إستخدامها لاستكشاف أخطاء التكوين وإصلاحها.

لاستكشاف أخطاء التطبيق و/أو الحاوية وإصلاحها، فإن أسهل طريقة هي الاتصال بوحدة التحكم الخاصة بالتطبيق الذي يتم تشغيله:

[jedepuyd@db iox_docker_pythonweb]$ ../ioxclient_1.3.0.0_linux_amd64/ioxclient app console python_web

Currently active profile:  default

Command Name: application-console

Console setup is complete..

Running command: [ssh -p 2222 -i python_web.pem appconsole@10.48.43.197]

The authenticity of host '[10.48.43.197]:2222 ([10.48.43.197]:2222)' can't be established.

ECDSA key fingerprint is 1d:e4:1e:e1:99:8b:1d:d5:ca:43:69:6a:a3:20:6d:56.

Are you sure you want to continue connecting (yes/no)? yes

/ # netstat -tlpn

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      19/python

/ # ps aux | grep python

19 root       0:00 python /webserver.py 9000