Création d'images de conteneur multiplateforme à l'aide de Podman sur Oracle Linux

Introduction

Cette démonstration montre la création d'une image de conteneur multiplateforme à l'aide de Podman sur Oracle Linux.

Objectifs

Dans ce tutoriel, vous apprendrez à :

Prérequis

Déployer un serveur Podman

  1. Créez une instance de calcul Oracle Linux.

    Vous pouvez utiliser l'image et la forme par défaut, à condition que la forme utilise une architecture x86_64. Sélectionnez ou créez un sous-réseau public et affectez une adresse IPv4.

    Cette étape prend en charge l'utilisation des formes Micro disponibles dans le niveau Toujours gratuit.

  2. Une fois l'instance en cours d'exécution, connectez-vous à l'instance.

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    Où :

    • <SSH_KEY> est la partie privée de la clé SSH utilisée lors du provisionnement de l'instance de calcul. Exemple : ~/.ssh/id_rsa
    • L'adresse IP publique de l'instance de calcul est <IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>.

Installation et configuration de Podman pour l'accès distant

Vous pouvez exécuter ces commandes en tant que compte utilisateur opc par défaut sur l'instance de calcul ou tout utilisateur disposant d'un accès sudo.

  1. Mettez à jour le système avec les derniers correctifs et errata de sécurité.

    sudo dnf -y update
    
  2. Installez les modules ou packages Podman.

    Oracle Linux 8 ::

    sudo dnf module install -y container-tools:ol8
    

    Oracle Linux 9 et Oracle Linux 10 :

    sudo dnf install -y container-tools
    

    Le module ou package container-tools installe podman et d'autres outils de conteneur, y compris skopeo et buildah. L'un des packages essentiels est container-selinux, qui permet d'exécuter podman en tant qu'utilisateur non root sur un système compatible SELinux, activé par défaut par Oracle Linux.

  3. Activez le socket Podman.

    systemd écoute sur ce socket et lance une instance de Podman chaque fois qu'un client distant l'active. Une fois la connexion fermée, systemd arrête l'instance Podman.

    Remarque : il est possible de configurer l'accès distant à Podman en mode sans racine, mais cela dépasse le cadre de ce tutoriel.

    sudo systemctl enable --now podman.socket
    
  4. Vérifiez le chemin du socket.

    sudo systemctl status podman.socket
    

    La sortie affiche l'écoute du socket et son emplacement est /run/podman/podman.sock.

    C'est tout, mais restez connecté à l'instance de serveur Podman pour effectuer une configuration SSH sans mot de passe plus loin dans ce tutoriel.

Déployer une instance Oracle Cloud Developer

Oracle Ampere A1 Compute est une plate-forme hautes performances combinant des processeurs Oracle Cloud Infrastructure (OCI) et Ampere Altra Arm. Il fournit des performances déterministes, une sécurité éprouvée et un vaste écosystème de développeurs qui inclut des outils et des environnements populaires (OS, Kubernetes - OKE, SDK et CLI).

OCI répertorie l'image de développeur Oracle Cloud en tant qu'image de plate-forme avec tous les outils de développement populaires installés, y compris Git, Node.js, Java et GraalVM.

  1. Créez une instance de calcul Oracle Cloud Developer.

    Sélectionnez l'image Oracle Cloud Developer et une forme Ampere. Sélectionnez le même sous-réseau public que l'instance de serveur Podman et affectez une adresse IPv4.

  2. Choisissez d'utiliser des règles entrantes ou la transmission de port SSH.

    Vous pouvez accéder à l'application web de démonstration que nous allons créer de deux façons. Bien que vous puissiez activer les deux, vous n'avez qu'à choisir l'un ou l'autre.

(Facultatif) Création d'une règle entrante

L'utilisation d'une règle entrante est un processus en deux étapes. Cette option ouvre l'accès au sous-réseau à partir d'Internet et continue d'accorder l'accès à l'instance sur le port spécifié même après un redémarrage. Vous devez d'abord créer la règle dans OCI, puis ouvrir le port dans firewalld sur l'instance Oracle Linux.

  1. Ajoutez une règle entrante à votre sous-réseau public.

    La règle doit autoriser le trafic entrant sur le port 5808/tcp à partir de 0.0.0.0/0. La règle prend effet immédiatement après sa création.

  2. Ouvrez un nouveau terminal et connectez-vous à l'instance Oracle Cloud Developer via SSH.

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    
  3. Ajoutez un accès à l'application Web de démonstration.

    sudo firewall-cmd --permanent --add-port=5808/tcp
    sudo firewall-cmd --reload
    
  4. Confirmez les modifications apportées au pare-feu.

    sudo firewall-cmd --list-all
    

    La sortie affiche ports: 5808/tcp disponible.

Utiliser la transmission de port SSH

  1. Ouvrez un terminal et connectez-vous via SSH à l'instance Oracle Cloud Developer.

    L'option -L active le transfert local, qui ouvre un port local pour la connexion via un tunnel SSH à l'application Web de démonstration distante.

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

Création d'une image de conteneur pour une application Web et exécution locale

  1. Clonez le référentiel Git de l'application de démonstration.

    Pour ce tutoriel, vous allez déployer RasDash, une application Web de surveillance de serveur basée sur Node.js.

    git clone https://github.com/sykeben/RasDash.git
    
  2. Accédez au répertoire du code source.

    cd  ~/RasDash
    
  3. Créez un fichier Containerfile pour créer et servir l'application Web.

    cat << EOF > Containerfile
    FROM ghcr.io/oracle/oraclelinux8-nodejs:14
    COPY . /app
    WORKDIR /app
    RUN npm install && \
      npm test
    CMD ["/usr/bin/node", "app.js", "service"]
    EOF
    
  4. Créez et exécutez l'image sur l'instance locale.

    Créez l'image de conteneur en local à l'aide de podman et marquez-la avec la version de l'application et l'architecture de la plate-forme. Ces informations seront utiles ultérieurement lorsque vous propagerez chaque image de plate-forme vers Oracle Cloud Infrastructure Registry (OCIR) et que vous créerez un manifeste des deux images de plate-forme.

    sudo podman build --format docker --tag rasdash:0.3.4-arm64 .
    

    La ligne finale sera unique au paramétrage de votre application.

  5. Exécutez un conteneur à l'aide de l'image.

    sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64
    

    Le condensé renvoyé par Podman est unique pour chaque instance de conteneur.

  6. Affichez le conteneur en cours d'exécution.

    sudo podman ps
    

    La sortie affiche le conteneur comme Up et en cours d'exécution.

  7. Affichez les journaux du conteneur.

    sudo podman logs rasdash
    

    La sortie affiche [STATE] Server started.

  8. Afficher l'application Web.

    Ouvrez un navigateur sur votre ordinateur local et accédez à http://localhost:5808. Si vous avez créé les règles entrantes et de pare-feu, vous pouvez utiliser l'adresse IP publique de l'instance Oracle Cloud Developer plutôt que localhost.

    Remarque : la mesure de la température de l'UC affichera -1 car les instances virtuelles dans OCI ne peuvent pas accéder aux données matérielles physiques.

  9. Arrêter le conteneur en cours d'exécution.

    sudo podman stop rasdash
    

Configuration d'une connexion SSH sans mot de passe entre les instances

Podman communique via SSH entre les instances à des fins de sécurité. Pour une expérience plus fluide, créez une paire de clés publique/privée sur votre instance Cloud Developer et copiez-la sur le serveur Podman Remote afin de pouvoir utiliser SSH à partir de l'instance de développeur sans avoir à saisir de mot de passe.

  1. Générez une paire de clés publique/privée sur l'instance Oracle Cloud Developer.

    ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N ""
    
  2. Copiez le contenu du fichier des clés publiques.

    cat ~/.ssh/id_rsa.pub
    

    Sélectionnez la sortie de la commande cat et copiez-la.

  3. Passez à l'instance de serveur Podman.

  4. Ouvrez le fichier dans vi.

    vi ~/.ssh/authorized_keys
    

    Collez le contenu de la clé publique dans le fichier de clés autorisées.

    Enregistrez et fermez le fichier.

  5. Veillez à appliquer les autorisations de système de fichiers appropriées au répertoire et aux fichiers SSH.

    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    
  6. Passez à l'instance Cloud Developer.

  7. Testez si vous pouvez utiliser SSH pour le serveur Podman en tant qu'utilisateur opc sans avoir besoin de mot de passe.

    Remarque : en cas de problème, reportez-vous à la documentation suivante :

    ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    Après avoir vérifié que vous pouvez vous connecter sans avoir besoin de mot de passe, veillez à exit la session SSH entre l'instance Oracle Cloud Developer et le serveur Podman.

  8. Passez à l'instance de serveur Podman.

  9. Remplacez le fichier de clés autorisées de l'utilisateur root.

    cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys
    
  10. Passez à l'instance Cloud Developer.

  11. Testez si vous pouvez utiliser SSH avec l'utilisateur opc sur l'instance Cloud Developer pour l'utilisateur root sur le serveur Podman.

    ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    Vous pouvez exit la session après avoir testé la connexion SSH au serveur Podman en tant qu'utilisateur root.

Création d'une connexion système au serveur Podman

  1. Créez une connexion système Podman entre l'instance Oracle Cloud Developer et le service Podman exécuté sur votre serveur Podman.

    sudo podman system connection add --identity ~/.ssh/id_rsa amd64 ssh://root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>/run/podman/podman.sock
    

    Dans la commande ci-dessus, remplacez <IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE> par l'adresse IP ou le nom d'hôte de votre serveur Podman.

  2. Vérifiez que la connexion a bien été ajoutée.

    sudo podman system connection list
    

    La sortie affiche la connexion amd64 avec la valeur Default définie sur true. Podman utilise cette connexion si le système a plusieurs connexions configurées.

Création d'une image sur le serveur Podman distant

Vous devez maintenant pouvoir utiliser podman --remote pour envoyer des commandes de l'instance Oracle Cloud Developer vers l'instance de serveur Podman distante.

  1. Testez en obtenant les détails du serveur Podman.

    sudo podman --remote info
    

    L'architecture doit indiquer arm64.

  2. Créez l'image distante.

    Podman copie automatiquement l'intégralité du contexte vers l'instance distante.

    cd ~/RasDash
    sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 .
    
  3. Vérifiez que l'image existe sur le serveur Podman distant.

    REMARQUE : Podman ne copie pas l'image qu'il crée sur l'ordinateur client, de sorte que l'image ne sera pas répertoriée si vous exécutez sudo podman images. Cependant, il est disponible sur la machine distante.

    sudo podman --remote images
    

    Exemple de résultat :

    REPOSITORY                          TAG          IMAGE ID      CREATED        SIZE
    localhost/rasdash                   0.3.4-amd64  3a1b9755ebdd  8 seconds ago  439 MB
    ...
    
  4. Vérifiez l'architecture de l'image locale.

    La méthode finale de validation de la construction de chaque image pour (et sur) une plate-forme et une architecture spécifiques utilise jq pour extraire la valeur du champ Architecture dans le manifeste de chaque image.

    sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'
    

    L'image locale indique son architecture en tant que arm64.

  5. Vérifiez l'image distante.

    sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'
    

    L'image distante indique amd64.

Créer un référentiel Container Registry

Dans la console Oracle Cloud Infrastructure, accédez à la section Container Registry et créez un référentiel pour stocker votre application multi-plateforme.

Pour plus de détails, reportez-vous à Création d'un référentiel dans la documentation Oracle Cloud Infrastructure.

  1. Créez le référentiel privé demo/rasdash.

    créer un référentiel

  2. Vérifiez les informations relatives au nouveau référentiel.

    détails du référentiel

Collecter les informations d'identification du référentiel Container Registry

Le tableau suivant fournit des exemples de valeurs utilisées dans les étapes suivantes de ce tutoriel. L'exemple iad est la clé de région de la région Est des Etats-Unis (Ashburn). Si votre région est Allemagne centrale (Francfort), la clé de région est fra. Reportez-vous à la documentation Régions et domaines de disponibilité pour obtenir un tableau complet répertoriant les clés de région disponibles.

Données du registre Espace réservé du tutoriel Remarques 
REGISTRY_NAMESPACE gse00015915 Affiché dans le panneau d'informations du référentiel sous la forme "Espace de noms"
REPOSITORY_NAME demo/rasdash Affiché sous le nom du compartiment
OCIR_INSTANCE iad.ocir.io Utiliser <region>.ocir.io

Reportez-vous à Propagation d'images à l'aide de la CLI Docker, si nécessaire. Cette procédure décrit le processus de connexion requis pour propager des images vers Container Registry à l'aide de la CLI.

  1. Obtenez votre nom d'utilisateur.

    Vous avez besoin d'un nom utilisateur et d'un jeton d'authentification pour vous connecter au registre de conteneurs. Pour obtenir le nom utilisateur, dans l'angle supérieur droit de la console Oracle Cloud Infrastructure, ouvrez le menu Profil (icône du menu Utilisateur), puis cliquez sur Mon profil pour visualiser les détails.

    Copiez et enregistrez le nom utilisateur, y compris tenancy-namespace affiché dans la console.

    user

  2. Générer un jeton d'authentification.

    Faites défiler la page Mon profil dans la console et sélectionnez Jetons d'authentification sous Ressources.

    Sélectionnez le bouton Générer un jeton et fournissez une description de demo pour le nouveau jeton.

    jeton gen

    Une fois que vous avez généré le jeton, veillez à le copier et à l'enregistrer.

    copier le jeton

Connexion au référentiel Container Registry

Le tableau suivant fournit des exemples de valeurs utilisées dans les étapes suivantes de ce tutoriel.

Nom utilisateur Espace réservé du tutoriel
REGISTRY_NAMESPACE gse00015915
USERNAME luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e
JETON ]y#W_iS9GKC}4l1Gq9Fn
OCIR_INSTANCE iad.ocir.io
  1. Créez des variables d'environnement à utiliser dans la commande podman login.

    Créez les variables d'environnement USER et TOKEN à l'aide du nom utilisateur et du jeton. Veillez à inclure <REGISTRY_NAMESPACE> dans le nom utilisateur.

    export OCIR_INSTANCE="iad.ocir.io"
    export OCIR_NAMESPACE="gse00015915"
    export OCI_USERNAME="luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e"
    export OCIR_USERNAME="$OCIR_NAMESPACE/$OCI_USERNAME"
    export OCI_USER_TOKEN="]y#W_iS9GKC}4l1Gq9Fn"
    
  2. Connectez-vous au registre de conteneurs.

    sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCE
    

    L'instance distante hérite automatiquement des informations d'identification d'authentification de l'instance client.

Poussez les images de plate-forme

Dans cet exemple, les URI finaux du référentiel avec des balises propres à la plate-forme sont les suivants :

Podman peut pousser des images locales vers des registres distants sans que l'image ait besoin d'être balisée au préalable.

  1. Imprimez l'image rasdash/0.3.4-arm64 locale.

    sudo -E podman push rasdash:0.3.4-arm64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
    
  2. Poussez l'image rasdash:0.3.4-amd64 distante.

    sudo -E podman --remote push rasdash:0.3.4-amd64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
    
  3. Vérifiez la console Container Registry.

    Remarque : la transmission d'une image distante ne génère pas de sortie locale. Consultez la console Container Registry pour la balise rasdash:0.3.4-amd64 afin de vérifier si l'image a été propagée.

    Vous devez voir deux images dans la console Container Registry.

    images

    L'image 0.3.4-amd64 :

    images

    L'image 0.3.4-arm64 :

    images

Création et envoi d'une liste de manifestes dans le registre de conteneurs

Maintenant que vous avez deux images de plate-forme, il est temps de créer une liste de manifestes pour permettre aux exécutions de conteneur de sélectionner l'image appropriée pour leur plate-forme, qui est une combinaison du système d'exploitation et de l'architecture.

Comme la plupart des images de conteneur sont basées sur Linux, les utilisateurs font généralement référence à une image multiplateforme en tant qu'image multi-archives. Toutefois, il est également possible de combiner des images pouvant s'exécuter sous Windows, macOS et Linux en un seul manifeste.

  1. Créez et renseignez le manifeste.

    Créez une liste de manifestes locale sur l'instance de développeur cloud avec uniquement la version de l'application dans la balise.

    sudo podman manifest create rasdash:0.3.4
    

    Comme précédemment, la sortie de somme de contrôle est unique au manifeste que vous créez et ne correspondra pas à celle ci-dessus.

  2. Examinez la liste des manifestes pour révéler ce que mediaType est utilisé et ses images membres.

    sudo podman manifest inspect rasdash:0.3.4
    
  3. Ajoutez les deux images spécifiques à la plate-forme à la liste.

    sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
    
    sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
    
  4. Examinez la liste des manifestes.

    sudo podman manifest inspect rasdash:0.3.4
    

    La sortie est plus intéressante après l'ajout des images.

    Pour une compatibilité maximale, vous avez ajouté le paramètre --format docker à chaque commande de build, ce qui indique à Podman de créer l'image à l'aide de la spécification V2 du manifeste d'image Docker, du schéma 2 (v2s2) au lieu de la spécification du manifeste d'image Open Container Initiative, que Podman utilisera par défaut.

    Etant donné que les manifestes utilisent la spécification v2s2, Podman utilise la spécification v2s2 Manifest List associée au lieu de la Spécification Open Container Initiative Image Index.

    Les exécutions de conteneur par défaut utilisées par les services Kubernetes gérés basés sur le cloud, y compris Oracle Engine for Kubernetes (OKE) et les distributions Kubernetes auto-hébergées sur site, sont compatibles avec les deux spécifications.

  5. Poussez la liste des manifestes dans Container Registry.

    Maintenant que vous avez créé la liste des manifestes, vous pouvez la propager vers le référentiel Container Registry qui stocke les images propres à la plate-forme.

    sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

    Cette action est une opération rapide car vous avez précédemment propagé les images propres à la plate-forme. Container Registry lie simplement la liste de manifestes aux images existantes.

  6. Créez et exécutez l'image en local.

    Vous pouvez désormais exécuter une instance de l'image localement et à distance à l'aide de la balise de liste de manifestes au lieu de la balise propre à la plate-forme.

    sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    
  7. Créez et exécutez l'image à distance.

    sudo -E podman --remote run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

Test des images à l'aide d'un navigateur

Supposons que vous ayez créé les règles entrantes et les règles firewalld nécessaires sur les instances. Dans ce cas, vous devez pouvoir ouvrir votre navigateur et accéder à http://<PUBLIC_IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>:5808 et http://<PUBLIC_IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>:5808 pour ouvrir l'application Web RasDash exécutée sur chaque instance.

Sinon, vous pouvez utiliser le transfert de port SSH comme précédemment en créant deux tunnels à partir de votre ordinateur local.

  1. Ouvrez un tunnel SSH vers l'instance Oracle Cloud Developer.

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

    Ouvrez un navigateur sur votre ordinateur local et accédez à http://localhost:5808 pour visualiser l'application Web basée sur arm64 sur l'instance de développement cloud.

  2. Quittez la session de tunnel SSH.

  3. Ouvrez un tunnel SSH vers l'instance de serveur Podman.

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    Actualisez le navigateur sur votre ordinateur local en pointant vers http://localhost:5808 pour afficher l'application Web basée sur amd64 sur l'instance de serveur Podman.

Etapes suivantes

A la fin de ce tutoriel, vous devez maintenant savoir comment créer des images que vous pouvez déployer à partir de référentiels OCIR privés et publics. Vous pouvez utiliser ces images à différents emplacements, tels qu'Oracle Engine for Kubernetes (OKE) ou Oracle Cloud Native Environment. Lorsque vous déployez vos images vers des hôtes en dehors d'Oracle Cloud Infrastructure, y compris Podman Desktop pour Mac ou Windows, vous devez vous assurer que le référentiel est public.

Ressources de formation supplémentaires

Explorez d'autres ateliers sur le site docs.oracle.com/learn ou accédez à d'autres contenus d'apprentissage gratuits sur le canal Oracle Learning YouTube. En outre, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, consultez Oracle Help Center.