De documentatie van dit product is waar mogelijk geschreven met inclusief taalgebruik. Inclusief taalgebruik wordt in deze documentatie gedefinieerd als taal die geen discriminatie op basis van leeftijd, handicap, gender, etniciteit, seksuele oriëntatie, sociaaleconomische status of combinaties hiervan weerspiegelt. In deze documentatie kunnen uitzonderingen voorkomen vanwege bewoordingen die in de gebruikersinterfaces van de productsoftware zijn gecodeerd, die op het taalgebruik in de RFP-documentatie zijn gebaseerd of die worden gebruikt in een product van een externe partij waarnaar wordt verwezen. Lees meer over hoe Cisco gebruikmaakt van inclusief taalgebruik.
Cisco heeft dit document vertaald via een combinatie van machine- en menselijke technologie om onze gebruikers wereldwijd ondersteuningscontent te bieden in hun eigen taal. Houd er rekening mee dat zelfs de beste machinevertaling niet net zo nauwkeurig is als die van een professionele vertaler. Cisco Systems, Inc. is niet aansprakelijk voor de nauwkeurigheid van deze vertalingen en raadt aan altijd het oorspronkelijke Engelstalige document (link) te raadplegen.
In dit document wordt het configuratieproces beschreven voor het maken, implementeren en beheren van Docker-gebaseerde toepassingen op apparaten die geschikt zijn voor Cisco IOx.
Er zijn geen specifieke vereisten van toepassing op dit document.
De informatie in dit document is gebaseerd op de volgende software- en hardware-versies:
De informatie in dit document is gebaseerd op de apparaten in een specifieke laboratoriumomgeving. Alle apparaten die in dit document worden beschreven, hadden een opgeschoonde (standaard)configuratie. Als uw netwerk live is, moet u de potentiële impact van elke opdracht begrijpen.
IOx kan verschillende soorten pakketten hosten, voornamelijk Java, Python, LXC, Virtual Machine (VM) enz., En het kan ook Docker-containers uitvoeren. Cisco biedt een basisimage en een volledige Docker-hubopslagplaats: https://devhub.cisco.com/artifactory/webapp/#/artifacts/browse/tree/General/iox-docker die kan worden gebruikt om Docker-containers te bouwen.
Hier is een stapsgewijze handleiding over hoe u een eenvoudige Docker-container kunt bouwen met behulp van Alpine Linux. Alpine Linux is een klein Linux-image (ongeveer 5 MB), dat vaak wordt gebruikt als basis voor Docker-containers. In dit artikel start je vanaf een geconfigureerd IOx-apparaat, een lege CentOS 7 Linux-machine en bouw je een kleine Python-webserver, verpakt deze in een Docker-container en implementeert die op een IOx-apparaat.
1. Installeren en voorbereiden van IOx-client op de Linux-host.
IOx-client is het hulpmiddel dat toepassingen kan verpakken en kan communiceren met het apparaat dat geschikt is voor IOx om IOx-toepassingen te beheren.
Nadat u het ioxclient-installatiepakket hebt gedownload, kan het als volgt worden geïnstalleerd:
[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
Zoals u kunt zien, kan bij de eerste lancering van de IOx-client een profiel worden gegenereerd voor het IOx-apparaat dat u kunt beheren met de IOx-client. Als u dit later wilt doen of als u de instellingen wilt toevoegen/wijzigen, kunt u deze opdracht later uitvoeren: ioxclient-profielen maken
2. Installeer en bereid Docker voor op de Linux-host.
Docker wordt gebruikt om een container te bouwen en de uitvoering van onze monsterapplicatie te testen.
De installatiestappen om Docker te installeren, zijn sterk afhankelijk van het Linux-besturingssysteem waarop u het installeert. Voor dit artikel kunt u CentOS 7 gebruiken. Voor installatie-instructies voor verschillende distributies, zie: https://docs.docker.com/engine/installation/.
Voorwaarden voor installatie:
[jedepuyd@db ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ... Complete!
Voeg de Docker repo toe:
[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
Installeer Docker (accepteer de verificatie van de GPG-sleutel tijdens de installatie):
[jedepuyd@db ~]$ sudo yum install docker-ce ... Complete!
Start 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
Om Docker als gewone gebruiker te kunnen openen/uitvoeren, voegt u deze gebruiker toe aan de Docker-groep en ververst u het groepslidmaatschap:
[jedepuyd@db ~]$ sudo usermod -a -G docker jedepuyd [jedepuyd@db ~]$ newgrp docker
Log in bij Docker Hub:
Docker Hub bevat de Alpine basisafbeelding die u kunt gebruiken. Als u nog geen Docker ID heeft, moet u zich registreren op: 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. Maak de Python-webserver.
Nu de voorbereiding is voltooid, kunt u beginnen met het bouwen van de daadwerkelijke toepassing die kan worden uitgevoerd op het IOx-apparaat.
[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()
Deze code is een zeer minimale Python webserver, die u maakt in webserver.py. De webserver retourneert simpelweg IOx python webserver zodra een GET wordt aangevraagd. De poort waarop de webserver start, kan poort 80 zijn of het eerste argument dat aan webserver.py wordt gegeven.
Deze code bevat in de functie Uitvoeren ook een schrijfbewerking naar een logbestand. Het logbestand is beschikbaar voor overleg met de IOx-client of de lokale beheerder.
4. Maak de Dockerfile en Docker-container.
Nu u de toepassing (webserver.py) hebt die in uw container moet worden uitgevoerd, is het tijd om de Docker-container te bouwen. Een container wordt gedefinieerd in een Docker-bestand:
[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
Zoals u kunt zien, wordt het Dockerbestand ook eenvoudig gehouden. U begint met de Alpine-basisafbeelding, installeert Python en kopieert uw webserver.py naar de hoofdmap van de container.
Zodra u uw Docker-bestand klaar hebt, kunt u de Docker-container bouwen:
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
De opdracht Docker build downloadt het basisimage en installeert Python en afhankelijkheden, zoals u hebt gevraagd in het Docker-bestand. De laatste opdracht is voor verificatie.
5. Test de aangemaakte Docker-container.
Deze stap is optioneel, maar het is goed om te controleren of uw zojuist gebouwde Docker-container klaar is om te werken zoals verwacht.
[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
Zoals u kunt zien in de uitvoer van netstat, nadat u de webserver.py start, luistert deze naar poort 9000.
6. Maak het IOx-pakket met de Docker-container.
Nu u de functionaliteit van uw webserver in de container hebt geverifieerd, is het tijd om het IOx-pakket voor implementatie voor te bereiden en te bouwen. Omdat het Dockerbestand instructies geeft voor het bouwen van een Docker-container, biedt package.yaml instructies voor IOx-clients om uw IOx-pakket te bouwen.
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"]
Meer informatie over de inhoud van package.yaml vindt u hier: https://developer.cisco.com/media/iox-dev-guide-3-10-16/concepts/package_descriptor/.
Nadat u het pakket.yaml hebt gemaakt, kunt u beginnen met het bouwen van het IOx-pakket.
De eerste stap is het exporteren van de root FS van het Docker-image:
[jedepuyd@db iox_docker_pythonweb]$ docker save -o rootfs.tar ioxpythonweb:1.0
Vervolgens kunt u het pakket.tar bouwen:
[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
Het resultaat van de build is een IOx-pakket (package.tar), dat de Docker-container bevat, klaar om te worden geïmplementeerd op IOx.
Opmerking: IOxclient kan de docker save-opdracht ook in één stap uitvoeren. Op CentOS resulteert dit in het exporteren naar de standaard rootfs.img in plaats van rootfs.tar, wat later in het proces problemen oplevert. De eerste stap om te maken kan worden gedaan met het gebruik van: IOx client docker pakket IOxpythonweb: 1.0.
8. Implementeer, activeer en start het pakket op het IOx-apparaat.
De laatste stappen zijn het implementeren van het IOx-pakket op het IOx-apparaat, het activeren en starten. Deze stappen kunnen worden uitgevoerd met behulp van IOx-client, Local Manager of Fog Network Director. Voor dit artikel kunt u gebruik maken van IOx client.
Om het pakket te implementeren op het IOx-apparaat, gebruikt u de naam 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
Voordat u de toepassing kunt activeren, moet u definiëren hoe de netwerkconfiguratie zou zijn. Om dit te doen, moet u een JSON-bestand maken. Wanneer u activeert, kan deze worden gekoppeld aan het activeringsverzoek.
[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
Laatste actie hier is om de applicatie die u zojuist hebt geïmplementeerd en geactiveerd te starten:
[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
Aangezien u uw IOx-toepassing hebt geconfigureerd om te luisteren op poort 9000 voor tor HTTP-verzoeken, moet u die poort nog steeds van uw IOx-apparaat naar de container doorsturen omdat de container achter NAT zit. Voer dit uit op Cisco IOS® om dit te doen.
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
De eerste opdracht geeft het interne IP-adres van GOS weer (verantwoordelijk voor het starten/stoppen/uitvoeren van de IOx-containers).
De tweede opdracht configureert een statische poort voor poort 9000 op de Gi0-interface van de IOS-kant naar GOS. In het geval dat uw apparaat is verbonden via een L2-poort (wat waarschijnlijk het geval is op IR829), moet u de Gi0-interface vervangen door het juiste VLAN waarvan de ip nat-externe instructie is geconfigureerd.
Gebruik deze sectie om te controleren of uw configuratie goed werkt.
Om te controleren of de webserver goed werkt en reageert, kunt u proberen om toegang te krijgen tot de webserver met deze opdracht.
[jedepuyd@db iox_docker_pythonweb]$ curl http://10.48.43.197:9000/ <html><body><h1>IOX python webserver</h1></body></html>
Of, van een echte browser zoals weergegeven in de afbeelding.

U kunt ook de status van de toepassing controleren via de IOxclient CLI:
[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
en u kunt ook de status van de toepassing controleren via de GUI Lokaal beheer, zoals weergegeven in de afbeelding.

Om een kijkje te nemen in het logbestand waarnaar u schrijft 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
Deze sectie bevat informatie die u kunt gebruiken om problemen met de configuratie te troubleshooten.
Om problemen met de toepassing en/of container op te lossen, is de eenvoudigste manier om verbinding te maken met de console van de toepassing die wordt uitgevoerd:
[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