Dans le cadre de la documentation associée à ce produit, nous nous efforçons d’utiliser un langage exempt de préjugés. Dans cet ensemble de documents, le langage exempt de discrimination renvoie à une langue qui exclut la discrimination en fonction de l’âge, des handicaps, du genre, de l’appartenance raciale de l’identité ethnique, de l’orientation sexuelle, de la situation socio-économique et de l’intersectionnalité. Des exceptions peuvent s’appliquer dans les documents si le langage est codé en dur dans les interfaces utilisateurs du produit logiciel, si le langage utilisé est basé sur la documentation RFP ou si le langage utilisé provient d’un produit tiers référencé. Découvrez comment Cisco utilise le langage inclusif.
Cisco a traduit ce document en traduction automatisée vérifiée par une personne dans le cadre d’un service mondial permettant à nos utilisateurs d’obtenir le contenu d’assistance dans leur propre langue. Il convient cependant de noter que même la meilleure traduction automatisée ne sera pas aussi précise que celle fournie par un traducteur professionnel.
Ce document décrit le processus de configuration afin de créer, déployer et gérer des applications Docker sur des périphériques compatibles Cisco IOx.
Aucune exigence spécifique n'est associée à ce document.
Les informations contenues dans ce document sont basées sur les versions de matériel et de logiciel suivantes :
The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. If your network is live, make sure that you understand the potential impact of any command.
IOx peut héberger différents types de packages principalement Java, Python, LXC, Machine virtuelle (VM), etc., et il peut également exécuter des conteneurs Docker. Cisco propose une image de base et un référentiel de concentrateurs Docker complet : https://devhub.cisco.com/artifactory/webapp/#/artifacts/browse/tree/General/iox-docker qui peut être utilisé pour construire des conteneurs Docker.
Voici un guide étape par étape sur la façon de construire un conteneur Docker simple avec l'utilisation d'Alpine Linux. Alpine Linux est une petite image Linux (environ 5 Mo), qui est souvent utilisée comme base pour les conteneurs Docker. Dans cet article, vous démarrez à partir d'un périphérique IOx configuré, d'une machine Linux CentOS 7 vide et vous construisez un petit serveur Web Python, le conditionnez dans un conteneur Docker et déployez-le sur un périphérique IOx.
1. Installez et préparez le client IOx sur l'hôte Linux.
Le client IOx est l'outil qui permet de regrouper des applications et de communiquer avec le périphérique compatible IOx pour gérer les applications IOx.
Après avoir téléchargé le package d'installation ioxclient, vous pouvez l'installer comme suit :
[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
Comme vous pouvez le voir, lors du premier lancement du client IOx, un profil peut être généré pour le périphérique IOx que vous pouvez gérer avec le client IOx. Si vous souhaitez effectuer cette opération ultérieurement ou si vous souhaitez ajouter/modifier les paramètres, vous pouvez exécuter cette commande ultérieurement : profils ioxclient créer
2. Installez et préparez Docker sur l’hôte Linux.
Docker est utilisé pour construire un conteneur et tester l'exécution de notre exemple d'application.
Les étapes d'installation de Docker dépendent fortement du système d'exploitation Linux sur lequel vous l'installez. Pour cet article, vous pouvez utiliser CentOS 7. Pour obtenir des instructions d'installation pour différentes distributions, reportez-vous à : https://docs.docker.com/engine/installation/.
Conditions préalables à l'installation :
[jedepuyd@db ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ... Complete!
Ajoutez le repo 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
Installer Docker (accepter la vérification de la clé GPG lors de l'installation) :
[jedepuyd@db ~]$ sudo yum install docker-ce ... Complete!
Démarrer 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
Pour pouvoir accéder à Docker et l'exécuter en tant qu'utilisateur normal, ajoutez cet utilisateur au groupe Docker et actualisez l'appartenance au groupe :
[jedepuyd@db ~]$ sudo usermod -a -G docker jedepuyd [jedepuyd@db ~]$ newgrp docker
Connectez-vous à Docker Hub :
Docker Hub contient l'image de base alpine que vous pouvez utiliser. Si vous n'avez pas encore d'identifiant Docker, vous devez vous inscrire sur : 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. Créez le serveur Web Python.
Maintenant que la préparation est terminée, vous pouvez commencer à créer l'application qui peut s'exécuter sur le périphérique compatible 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()
Ce code est un serveur Python très minimal, que vous créez dans webserver.py. Le serveur web retourne simplement IOx python webserver dès qu'une requête GET est demandée. Le port sur lequel le serveur Web démarre peut être soit le port 80, soit le premier argument donné à webserver.py.
Ce code contient également, dans la fonction d'exécution, une écriture dans un fichier journal. Le fichier journal est disponible pour consultation auprès du client IOx ou du gestionnaire local.
4. Créez le fichier Docker et le conteneur Docker.
Maintenant que vous avez l'application (webserver.py) qui devrait s'exécuter dans votre conteneur, il est temps de construire le conteneur Docker. Un conteneur est défini dans un 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
Comme vous pouvez le voir, le Dockerfile est également gardé simple. Vous commencez avec l'image de base Alpine, installez Python et copiez votre webserver.py à la racine du conteneur.
Une fois que vous avez votre Dockerfile prêt, vous pouvez construire le Docker container :
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
La commande Docker build télécharge l'image de base et installe Python et les dépendances, comme vous l'avez demandé dans le fichier Docker. La dernière commande sert à la vérification.
5. Testez le conteneur Docker créé.
Cette étape est facultative, mais il est conseillé de vérifier que votre conteneur Docker nouvellement créé est prêt à fonctionner comme prévu.
[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
Comme vous pouvez le voir dans le résultat de netstat, après avoir démarré le fichier webserver.py, il écoute sur le port 9000.
6. Créez le package IOx avec le conteneur Docker.
Maintenant que vous avez vérifié la fonctionnalité de votre serveur Web dans le conteneur, il est temps de préparer et de créer le package IOx pour le déploiement. Comme le fichier Docker fournit des instructions pour construire un conteneur Docker, le package.yaml fournit des instructions pour le client IOx pour construire votre package 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"]
Pour plus d'informations sur le contenu du fichier package.yaml, consultez le site : https://developer.cisco.com/media/iox-dev-guide-3-10-16/concepts/package_descriptor/.
Après avoir créé le package.yaml, vous pouvez commencer à construire le package IOx.
La première étape consiste à exporter le système de fichiers racine de l'image Docker :
[jedepuyd@db iox_docker_pythonweb]$ docker save -o rootfs.tar ioxpythonweb:1.0
Ensuite, vous pouvez compiler le fichier package.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
Le résultat de la génération est un package IOx (package.tar), qui contient le conteneur Docker, prêt à être déployé sur IOx.
Remarque : IOxclient peut également exécuter la commande docker save en une seule étape. Sur CentOS, cela entraîne l'exportation vers le fichier rootfs.img par défaut au lieu de rootfs.tar, ce qui pose des problèmes plus tard dans le processus. La seule étape de création peut être effectuée à l'aide de : IOx client docker package IOxpythonweb : 1.0.
8. Déployez, activez et démarrez le package sur le périphérique IOx.
Les dernières étapes consistent à déployer le package IOx sur le périphérique IOx, à l'activer et à le démarrer. Ces étapes peuvent être effectuées à l'aide du client IOx, du gestionnaire local ou du directeur réseau Fog. Pour cet article, vous pouvez utiliser le client IOx.
Afin de déployer le package sur le périphérique IOx, utilisez le nom 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
Avant de pouvoir activer l'application, vous devez définir la configuration du réseau. Pour ce faire, vous devez créer un fichier JSON. Lorsque vous activez, il peut être joint à la demande d'activation.
[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
La dernière action consiste à démarrer l'application que vous venez de déployer et d'activer :
[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
Puisque vous avez configuré votre application IOx pour écouter le port 9000 pour les requêtes HTTP ou HTTP, vous devez quand même transférer ce port de votre périphérique IOx au conteneur car le conteneur est derrière NAT. Procédez de la sorte sur 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
La première commande répertorie l'adresse IP interne de GOS (responsable du démarrage, de l'arrêt et de l'exécution des conteneurs IOx).
La deuxième commande configure un port statique vers l'avant pour le port 9000 sur l'interface Gi0 du côté IOS vers GOS. Si votre périphérique est connecté via un port L2 (ce qui est probablement le cas sur IR829), vous devez remplacer l'interface Gi0 par le VLAN correct pour lequel l'instruction ip nat outside est configurée.
Utilisez cette section pour confirmer que votre configuration fonctionne correctement.
Afin de vérifier si le serveur Web fonctionne et répond correctement, vous pouvez essayer d'accéder au serveur Web avec cette commande.
[jedepuyd@db iox_docker_pythonweb]$ curl http://10.48.43.197:9000/ <html><body><h1>IOX python webserver</h1></body></html>
Ou, à partir d'un navigateur réel, comme illustré dans l'image.

Vous pouvez également vérifier l'état de l'application à partir de l'ILC 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
et vous pouvez également vérifier l'état de l'application à partir de l'interface utilisateur graphique du gestionnaire local, comme indiqué dans l'image.

Afin de jeter un oeil au fichier journal dans lequel vous écrivez dans 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
Cette section fournit des informations que vous pouvez utiliser pour dépanner votre configuration.
Afin de dépanner l'application et/ou le conteneur, le moyen le plus simple est de se connecter à la console de l'application qui exécute :
[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
Commentaires