In dem Dokumentationssatz für dieses Produkt wird die Verwendung inklusiver Sprache angestrebt. Für die Zwecke dieses Dokumentationssatzes wird Sprache als „inklusiv“ verstanden, wenn sie keine Diskriminierung aufgrund von Alter, körperlicher und/oder geistiger Behinderung, Geschlechtszugehörigkeit und -identität, ethnischer Identität, sexueller Orientierung, sozioökonomischem Status und Intersektionalität impliziert. Dennoch können in der Dokumentation stilistische Abweichungen von diesem Bemühen auftreten, wenn Text verwendet wird, der in Benutzeroberflächen der Produktsoftware fest codiert ist, auf RFP-Dokumentation basiert oder von einem genannten Drittanbieterprodukt verwendet wird. Hier erfahren Sie mehr darüber, wie Cisco inklusive Sprache verwendet.
Cisco hat dieses Dokument maschinell übersetzen und von einem menschlichen Übersetzer editieren und korrigieren lassen, um unseren Benutzern auf der ganzen Welt Support-Inhalte in ihrer eigenen Sprache zu bieten. Bitte beachten Sie, dass selbst die beste maschinelle Übersetzung nicht so genau ist wie eine von einem professionellen Übersetzer angefertigte. Cisco Systems, Inc. übernimmt keine Haftung für die Richtigkeit dieser Übersetzungen und empfiehlt, immer das englische Originaldokument (siehe bereitgestellter Link) heranzuziehen.
In diesem Dokument wird der Konfigurationsprozess für das Erstellen, Bereitstellen und Verwalten von Docker-basierten Anwendungen auf Cisco IOx-fähigen Geräten beschrieben.
Es gibt keine spezifischen Anforderungen für dieses Dokument.
Die Informationen in diesem Dokument basierend auf folgenden Software- und Hardware-Versionen:
Die Informationen in diesem Dokument beziehen sich auf Geräte in einer speziell eingerichteten Testumgebung. Alle Geräte, die in diesem Dokument benutzt wurden, begannen mit einer gelöschten (Nichterfüllungs) Konfiguration. Wenn Ihr Netz Live ist, überprüfen Sie, ob Sie die mögliche Auswirkung jedes möglichen Befehls verstehen.
IOx kann verschiedene Arten von Paketen hosten, hauptsächlich Java, Python, LXC, Virtual Machine (VM) usw. und Docker-Container ausführen. Cisco bietet ein Basis-Image und ein vollständiges Docker-Hub-Repository: https://devhub.cisco.com/artifactory/webapp/#/artifacts/browse/tree/General/iox-docker, mit dem Docker-Container erstellt werden können.
Hier ist eine Schritt-für-Schritt-Anleitung, wie man einen einfachen Docker-Container mit Alpine Linux zu bauen. Alpine Linux ist ein kleines Linux-Image (ca. 5MB), das oft als Basis für Docker-Container verwendet wird. In diesem Artikel beginnen Sie mit einem konfigurierten IOx-Gerät, einem leeren CentOS 7 Linux-System und erstellen einen kleinen Python-Webserver, packen ihn in einen Docker-Container und stellen ihn auf einem IOx-Gerät bereit.
1. Installieren und Vorbereiten des IOx-Clients auf dem Linux-Host
Der IOx-Client ist das Tool, mit dem Anwendungen gepackt und mit dem IOx-fähigen Gerät kommuniziert werden kann, um IOx-Anwendungen zu verwalten.
Nachdem Sie das ioxclient-Installationspaket heruntergeladen haben, kann es wie folgt installiert werden:
[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
Wie Sie sehen, kann beim ersten Start des IOx-Clients ein Profil für das IOx-Gerät erstellt werden, das Sie mit dem IOx-Client verwalten können. Falls Sie dies später tun möchten oder die Einstellungen hinzufügen/ändern möchten, können Sie den folgenden Befehl später ausführen: ioxclient profiles erstellt
2. Installieren und bereiten Sie Docker auf dem Linux-Host vor.
Docker wird verwendet, um einen Container zu erstellen und die Ausführung unserer Beispielanwendung zu testen.
Die Installationsschritte für Docker hängen stark von dem Linux-Betriebssystem ab, auf dem Sie es installieren. Für diesen Artikel können Sie CentOS 7 verwenden. Installationsanweisungen für verschiedene Distributionen finden Sie unter: https://docs.docker.com/engine/installation/.
Voraussetzungen für die Installation:
[jedepuyd@db ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ... Complete!
Docker-Repo hinzufügen:
[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
Installieren Sie Docker (akzeptieren Sie die GPG-Schlüsselverifizierung, wenn Sie installieren):
[jedepuyd@db ~]$ sudo yum install docker-ce ... Complete!
Docker starten:
[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
Um als regulärer Benutzer auf Docker zugreifen und es ausführen zu können, fügen Sie diesen Benutzer zur Docker-Gruppe hinzu, und aktualisieren Sie die Gruppenmitgliedschaft:
[jedepuyd@db ~]$ sudo usermod -a -G docker jedepuyd [jedepuyd@db ~]$ newgrp docker
Melden Sie sich bei Docker Hub an:
Docker Hub enthält das Alpine-Basisbild, das Sie verwenden können. Falls Sie noch keine Docker-ID besitzen, müssen Sie sich registrieren unter: 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. Erstellen Sie den Python-Webserver.
Nachdem die Vorbereitung abgeschlossen ist, können Sie mit der Erstellung der Anwendung beginnen, die auf dem IOx-fähigen Gerät ausgeführt werden kann.
[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()
Dieser Code ist ein sehr minimaler Python-Webserver, den Sie in webserver.py erstellen. Der Webserver gibt einfach den IOx Python Webserver zurück, sobald ein GET angefordert wird. Der Port, auf dem der Webserver startet, kann entweder Port 80 oder das erste Argument sein, das webserver.py gegeben wird.
Dieser Code enthält in der Ausführungsfunktion auch einen Schreibvorgang in eine Protokolldatei. Die Protokolldatei kann vom IOx-Client oder vom lokalen Manager eingesehen werden.
4. Erstellen Sie die Dockerdatei und den Docker-Container.
Nachdem Sie nun die Anwendung (webserver.py) haben, die in Ihrem Container ausgeführt werden soll, ist es Zeit, den Docker-Container zu erstellen. Ein Container wird in einer Dockerdatei definiert:
[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
Wie Sie sehen können, ist die Dockerfile auch einfach gehalten. Sie beginnen mit dem Alpine-Basis-Image, installieren Python und kopieren Sie Ihre webserver.py auf den Stamm des Containers.
Sobald Sie Ihre Docker-Datei bereit haben, können Sie den Docker-Container erstellen:
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
Der Docker-Buildbefehl lädt das Basis-Image herunter und installiert Python und Abhängigkeiten, wie in der Dockerdatei angefordert. Der letzte Befehl dient zur Überprüfung.
5. Testen Sie den erstellten Docker-Container.
Dieser Schritt ist optional, aber es ist gut zu überprüfen, dass Ihr gerade gebauter Docker Container ist bereit, wie erwartet zu arbeiten.
[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
Wie Sie in der Ausgabe von netstat sehen können, hört es nach dem Start von webserver.py auf Port 9000 zu.
6. Erstellen Sie das IOx-Paket mit dem Docker-Container.
Nachdem Sie nun die Funktionalität Ihres Webservers im Container überprüft haben, ist es an der Zeit, das IOx-Paket für die Bereitstellung vorzubereiten und zu erstellen. Da die Dockerdatei Anweisungen zum Erstellen eines Docker-Containers enthält, enthält package.yaml Anweisungen für den IOx-Client zum Erstellen Ihres IOx-Pakets.
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"]
Weitere Informationen zum Inhalt des Pakets.yaml finden Sie hier: https://developer.cisco.com/media/iox-dev-guide-3-10-16/concepts/package_descriptor/.
Nachdem Sie die Datei package.yaml erstellt haben, können Sie mit der Erstellung des IOx-Pakets beginnen.
Der erste Schritt besteht darin, das Root-FS des Docker-Image zu exportieren:
[jedepuyd@db iox_docker_pythonweb]$ docker save -o rootfs.tar ioxpythonweb:1.0
Anschließend können Sie die Datei package.tar erstellen:
[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
Das Ergebnis des Builds ist ein IOx-Paket (package.tar), das den Docker-Container enthält, der auf IOx bereitgestellt werden kann.
Anmerkung: IOxclient kann den Befehl docker save auch in einem Schritt ausführen. Auf CentOS führt dies dazu, dass in die Standarddatei rootfs.img anstelle von rootfs.tar exportiert wird, was später Probleme verursacht. Der eine Schritt, um zu erstellen, kann mit der Verwendung von: IOx Client Docker Paket IOxpythonweb:1.0 getan werden.
8. Bereitstellen, aktivieren und starten Sie das Paket auf dem IOx-Gerät.
Die letzten Schritte bestehen darin, das IOx-Paket auf dem IOx-Gerät bereitzustellen, zu aktivieren und zu starten. Diese Schritte können entweder mit dem IOx-Client, dem lokalen Manager oder dem Fog Network Director ausgeführt werden. Für diesen Artikel können Sie den IOx-Client verwenden.
Um das Paket auf dem IOx-Gerät bereitzustellen, verwenden Sie den Namen 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
Bevor Sie die Anwendung aktivieren können, müssen Sie die Netzwerkkonfiguration festlegen. Dazu müssen Sie eine JSON-Datei erstellen. Bei der Aktivierung kann der Aktivierungsanfrage beigefügt werden.
[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
Die letzte Aktion besteht darin, die Anwendung zu starten, die Sie gerade bereitgestellt und aktiviert haben:
[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
Da Sie Ihre IOx-Anwendung so konfiguriert haben, dass sie Port 9000 auf HTTP-Anfragen abhört, müssen Sie diesen Port von Ihrem IOx-Gerät an den Container weiterleiten, da sich der Container hinter NAT befindet. Führen Sie diese unter Cisco IOS® aus, um dies zu tun.
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
Der erste Befehl listet die interne IP-Adresse von GOS (verantwortlich für Start/Stopp/Ausführung der IOx-Container) auf.
Der zweite Befehl konfiguriert einen statischen Port Forward für Port 9000 an der Gi0-Schnittstelle der IOS-Seite für GOS. Falls Ihr Gerät über einen L2-Port verbunden ist (was bei IR829 wahrscheinlich der Fall ist), müssen Sie die Gi0-Schnittstelle durch das richtige VLAN ersetzen, für das die Anweisung ip nat outside konfiguriert ist.
Verwenden Sie diesen Abschnitt, um zu überprüfen, ob Ihre Konfiguration ordnungsgemäß funktioniert.
Um zu überprüfen, ob der Webserver ordnungsgemäß ausgeführt wird und ordnungsgemäß reagiert, können Sie versuchen, mit diesem Befehl auf den Webserver zuzugreifen.
[jedepuyd@db iox_docker_pythonweb]$ curl http://10.48.43.197:9000/ <html><body><h1>IOX python webserver</h1></body></html>
Oder von einem echten Browser, wie im Bild gezeigt.

Sie können den Anwendungsstatus auch über die IOxclient-CLI überprüfen:
[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
Sie können den Anwendungsstatus auch über die Benutzeroberfläche von Local Manager überprüfen, wie im Bild dargestellt.

Um einen Blick auf die Log-Datei, die Sie schreiben in 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
In diesem Abschnitt erhalten Sie Informationen zur Behebung von Fehlern in Ihrer Konfiguration.
Um eine Fehlerbehebung für die Anwendung und/oder den Container durchzuführen, stellen Sie am einfachsten eine Verbindung mit der Konsole der ausgeführten Anwendung her:
[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
Feedback