Créer une image Docker de Raspbian Stretch (v9)
Dans l'article intitulé "Comment choisir la version Rasbian du container de base pour docker ?", nous avions vu comment instancier une image Raspbian Stretch. Cette image qui constitue un base stable de Rasbian est totalement dépourvue des utilitaires standards qu'on utilise habituellement avec le Raspberry comme l'éditeur nano ou la commande ifconfig pour connaitre les informations réseau du container.
Le présent article décrit les opérations à effectuer pour créer une images de Raspbian Stretch dotée des utilitaires nécessaires. Cette image sera utilisée comme base pour tous les containers décrits sur ce blog.
Dans ce qui va suivre, certaines opérations seront effectuées dans le container en activité, d'autres seront effectuées sur la machine hôte. Pour les distinguer, les commandes exécutées dans le container seront de couleur bleue et légèrement indentées par rapport aux commandes exécutées sur la machine hôte. Il sera aussi possible de les distinguer par le prompt de la ligne de commande : pi@Cluster01 pour la machine hôte, root@Cont01 pour le container.
Démarrer une instance de l'image rpi-raspbian:stretch
Contrairement à ce qui a été fait dans l'article précédent, nous allons démarrer l'instance de Raspbian, non pas avec l'option --rm qui permettait de nettoyer Docker lorsqu'on la quittait, mais en lui donnant un nom avec l'option --name raspbian_stretch. Ce qui permettra de la repérer facilement et de la redémarrer, en conservant toutes les modifications qui y seront faites, par la commande docker start -i rasbian_stretch.
pi@Cluster01:~ $ docker run -it --name stretch -h Cont01 resin/rpi-raspbian:stretch
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84838544da3d resin/rpi-raspbian:stretch "/usr/bin/entry.sh /…" 7 seconds ago Exited (0) 14 seconds ago raspbian_stretch
pi@Cluster01:~ $ docker start -i stretch
root@Cont01:/# exit
exit
pi@Cluster01:~ $ docker ps -aexit
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84838544da3d resin/rpi-raspbian:stretch "/usr/bin/entry.sh /…" 7 seconds ago Exited (0) 14 seconds ago raspbian_stretch
pi@Cluster01:~ $ docker start -i stretch
root@Cont01:/#
Préparation de l'installation
L'installation de composants sur une architecture ARMv7 se fait à l'aide de la commande apt-get install. Comme l'image de Rasbian servant de base peut être ancienne, il est bon de la faire précéder prudemment par les commandes apt-get update et apt-get upgrade pour ne pas avoir un décalage de dépendance dans les paquets. A remarquer, que la connexion à l'instance se fait en mode root. Il est donc inutile d'utiliser la commande sudo avec apt-get.
root@Cont01:/# apt-get update
. . .
Reading package lists... Done
root@Cont01:/# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
. . .
root@Cont01:/#
. . .
Reading package lists... Done
root@Cont01:/# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
. . .
root@Cont01:/#
Installation de nano
nano est un éditeur de texte bien connu des utilisateurs de Raspberry Pi, plus pratique et plus convivial pour modifier les fichiers de configuration que son concurrent vi. Il est disponible dans le paquet de même nom et peut être installé avec la commande apt-get.
root@Cont01:/# apt-get install nano
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
spell
The following NEW packages will be installed:
nano
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 465 kB of archives.
After this operation, 2048 kB of additional disk space will be used.
Get:1 http://archive.raspbian.org/raspbian stretch/main armhf nano armhf 2.7.4-1 [465 kB]
Fetched 465 kB in 0s (2519 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package nano.
(Reading database ... 8529 files and directories currently installed.)
Preparing to unpack .../nano_2.7.4-1_armhf.deb ...
Unpacking nano (2.7.4-1) ...
Setting up nano (2.7.4-1) ...
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group editor) doesn't exist
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/pico.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group pico) doesn't exist
root@Cont01:/#
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
spell
The following NEW packages will be installed:
nano
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 465 kB of archives.
After this operation, 2048 kB of additional disk space will be used.
Get:1 http://archive.raspbian.org/raspbian stretch/main armhf nano armhf 2.7.4-1 [465 kB]
Fetched 465 kB in 0s (2519 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package nano.
(Reading database ... 8529 files and directories currently installed.)
Preparing to unpack .../nano_2.7.4-1_armhf.deb ...
Unpacking nano (2.7.4-1) ...
Setting up nano (2.7.4-1) ...
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group editor) doesn't exist
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/pico.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group pico) doesn't exist
root@Cont01:/#
Pour tester l'installation de nano, il suffit de lancer la commande dans le container.
Installation des utilitaires réseau (dont ifconfig)
ifcongig est la commande utilisée pour connaitre l'adresse IP allouée à un système par le serveur DHCP sur le réseau. Elle fait partie, avec d'autres utilitaires, du paquet net-tools qui, lui aussi, peut être installé avec apt-get.
root@Cont01:/# apt-get install net-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
net-tools
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 220 kB of archives.
After this operation, 818 kB of additional disk space will be used.
Get:1 http://archive.raspbian.org/raspbian stretch/main armhf net-tools armhf 1.60+git20161116.90da8a0-1 [220 kB]
Fetched 220 kB in 0s (1379 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package net-tools.
(Reading database ... 8629 files and directories currently installed.)
Preparing to unpack .../net-tools_1.60+git20161116.90da8a0-1_armhf.deb ...
Unpacking net-tools (1.60+git20161116.90da8a0-1) ...
Setting up net-tools (1.60+git20161116.90da8a0-1) ...
root@Cont01:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 12790 bytes 19088234 (18.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6911 bytes 474606 (463.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@Cont01:/#
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
net-tools
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 220 kB of archives.
After this operation, 818 kB of additional disk space will be used.
Get:1 http://archive.raspbian.org/raspbian stretch/main armhf net-tools armhf 1.60+git20161116.90da8a0-1 [220 kB]
Fetched 220 kB in 0s (1379 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package net-tools.
(Reading database ... 8629 files and directories currently installed.)
Preparing to unpack .../net-tools_1.60+git20161116.90da8a0-1_armhf.deb ...
Unpacking net-tools (1.60+git20161116.90da8a0-1) ...
Setting up net-tools (1.60+git20161116.90da8a0-1) ...
root@Cont01:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 12790 bytes 19088234 (18.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6911 bytes 474606 (463.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@Cont01:/#
Pour tester l'installation du paquet net-tools, il suffit de lancer l'un ou l'autre des utilitaires qui en font parties, par exemple la commande ifconfig dont nous avons besoin pour connaitre l'adresse réseau affecter au container.
Création de l'image
En quittant le container par la commande exit pour revenir à la machine hôte, on peut vérifier qu'une instance nommée stretch (grâce à l'option --name utilisée avec la commende run de Docker pour démarrer l'image rip-raspbian:stretch) a bien été crée en utilisant la commande ps -a de Docker sur la machine hôte.
root@Cont01:/# exit
exit
pi@Cluster01:~ $ docker ps -aexit
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb3198f43fc9 resin/rpi-raspbian:stretch "/usr/bin/entry.sh /…" 3 hours ago Exited (0) 7 seconds ago stretch
pi@Cluster01:~ $
Docker permet de créer une nouvelle image à partir d'une instance préalablement chargée. Pour cela, on utilise la commande commit de Docker. Le premier paramètre est le nom de l'instance (stretch) et le second paramètre est le nom que l'on souhaite donner à la nouvelle image (aplimouzin/stretch). Par convention, surtout si l'on veut exporter la nouvelle image sur hub.docker.com, le nom de l'image est préfixée avec le nom du compte, les deux étant séparés par un /.
pi@Cluster01:~ $ docker commit stretch aplimouzin/stretch
sha256:7c455e889fc7c61e10baf383854f4d55bbc5b52e4a2c3736a32c2e93c1838db3
pi@Cluster01:~ $
sha256:7c455e889fc7c61e10baf383854f4d55bbc5b52e4a2c3736a32c2e93c1838db3
pi@Cluster01:~ $
Utilisation de l'image
La commande images de Docker permet de constater que la nouvelle image aplimouzin/stretch se trouve bien parmi les autres images déjà utilisées. Il est donc possible de l'utiliser comme n'importe quelle autre image, en en lançant l'exécution par la commande run de Docker, par exemple.
pi@Cluster01:~ $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aplimouzin/stretch latest 7c455e889fc7 3 minutes ago 169MB
resin/rpi-raspbian stretch 21dc8fc1377f 9 days ago 139MB
resin/rpi-raspbian latest 6e68cc6f3192 9 days ago 128MB
hello-world latest b7012647d53a 7 weeks ago 1.64kB
pi@Cluster01:~ $ docker run -it --rm -h Cont01 aplimouzin/stretch
REPOSITORY TAG IMAGE ID CREATED SIZE
aplimouzin/stretch latest 7c455e889fc7 3 minutes ago 169MB
resin/rpi-raspbian stretch 21dc8fc1377f 9 days ago 139MB
resin/rpi-raspbian latest 6e68cc6f3192 9 days ago 128MB
hello-world latest b7012647d53a 7 weeks ago 1.64kB
pi@Cluster01:~ $ docker run -it --rm -h Cont01 aplimouzin/stretch
root@Cont01:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 78 bytes 11296 (11.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1 bytes 90 (90.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@Cont01:/#
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 78 bytes 11296 (11.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1 bytes 90 (90.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@Cont01:/#
Commentaires
Enregistrer un commentaire