Allez-vous remplacer Docker? Outils de gestion de conteneurs de nouvelle génération Podman et Buildah

Contexte

En parlant de conteneurs, les deux mots sont si étroitement liés que Docker peut y penser. Cependant, Docker n'est pas inclus en standard dans la série 8, qui est la dernière version de Red Hat Enterprise Linux (RHEL) développée par Red Hat, et il n'est plus pris en charge. Docker a été conçu pour inclure toutes les fonctions de Docker Daemon, et il était pratique de pousser et d'extraire des images Docker, de gérer le stockage, etc., mais il y avait aussi des problèmes. Les deux points suivants sont particulièrement importants.

Plusieurs nouveaux outils de conteneur ont été développés pour résoudre ce problème. Ce sont Podman et Buildah, que je présenterai cette fois. La référence officielle de Red Hat est la plus détaillée pour cette information, mais je voulais écrire un article sur les résultats de mon propre toucher et apprentissage.

Qu'est-ce que Podman

Podman est un outil permettant de gérer localement l'arrêt et le démarrage des pods sans utiliser Kubernetes. 6be7d7353415417e558a1aa7f0ca966a.png Il présente les caractéristiques suivantes.

De plus, Podman est compatible avec Docker et la ligne de commande, et la même utilisation que la commande docker peut être réalisée avec la commande podman. Cependant, certaines options du docker ont été supprimées, elles ne sont donc pas entièrement compatibles. (Référence [Voir Chapitre 8 Ligne de commande du conteneur](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/container-command-line-reference_building-running-and- gestion-conteneurs)))

Qu'est-ce que Buidah

Buidalh est un outil qui crée une image de conteneur compatible OCI et la pousse vers le registre. d08a2c27315e8830e4a200b19fb0f9f7.png

Bien qu'il y ait quelques chevauchements avec Podman en termes de fonctionnalités, Buildah n'a que la fonctionnalité minimale requise pour créer une image d'un conteneur, et ses fonctionnalités sont limitées. Il présente les caractéristiques suivantes.

--Daemon n'est pas utilisé

Puisqu'il est possible de créer une image de scratch, il est possible d'obtenir une image de conteneur encore plus légère que d'obtenir une image du référentiel officiel. (Exemple: insérez le package RHEL à partir de l'image de départ et ajoutez Apache, etc.) Bien sûr, vous pouvez également créer une image à partir d'un Dockerfile. J'ai brièvement expliqué les deux outils, je voudrais donc les installer sur la machine réelle et les expérimenter.

Divers outils environnementaux

La [Page officielle] de Red Hat (https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index) est le meilleur moyen de comprendre comment installer et utiliser divers outils. Cela semble facile, alors je voudrais essentiellement le vérifier de différentes manières.

Diverses installations et réglages initiaux

Vous pouvez les installer un par un, mais si vous avez une distribution Red Hat Linux, vous pouvez les installer tous en même temps en utilisant cette commande.

# yum(dnf) module install -y container-tools

Ensuite, comme je l'ai mentionné au début, configurez un conteneur sans racine afin que les utilisateurs autres que root puissent utiliser le conteneur.

Augmenter l'espace de noms des utilisateurs

Un espace de noms est une fonction qui existe pour différents types de ressources existant dans le système et qui permet au processus auquel il appartient d'afficher des ressources apparemment indépendantes. Je ne peux pas l'expliquer en détail car j'apprends encore, mais l'espace de noms de l'utilisateur affichera un identifiant d'utilisateur et un identifiant de groupe indépendants. Pour plus de détails, veuillez vous référer au numéro de juillet de Software Design in 2020, «Try and Understanding Linux Mechanism Corner». (https://gihyo.jp/magazine/SD/archive/2020/202007) Revenons-y et augmentons son espace de noms avec la commande suivante:

# echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
# sysctl -p /etc/sysctl.d/userns.conf

Dans cet état, faites-en un utilisateur non root et assurez-vous que vous pouvez obtenir l'image avec podman.

$ podman pull registry.access.redhat.com/ubi8/ubi
$ podman run registry.access.redhat.com/ubi8/ubi cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.2 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.2"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.2 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.2:GA"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.2"

J'ai obtenu les images de base universelles (UBI) fournies par Red Hat et j'ai démarré le conteneur à partir de l'image. Les informations de version du système d'exploitation du conteneur sont référencées par cat / etc / os-release pour le conteneur démarré. J'ai pu confirmer que je pouvais exécuter podman en tant qu'utilisateur non root et utiliser le conteneur. Ensuite, nous expliquerons différentes opérations.

Recherche d'images et extraction

La recherche d'image est lancée avec recherche podman <nom de l'image>.

$ podman search node
INDEX        NAME                                                                                  DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED
redhat.com   registry.access.redhat.com/openshift3/node                                            Provides a containerized OpenShift Node with...   0    
redhat.com   registry.access.redhat.com/openshift3/prometheus-node-exporter                        Prometheus exporter for hardware and OS metr...   0    
redhat.com   registry.access.redhat.com/codeready-workspaces/stacks-node                           Red Hat CodeReady Workspaces - Node Stack co...   0    
redhat.com   registry.access.redhat.com/rhel7/kubernetes-scheduler                                 The Kubernetes scheduler watches for new un-...   0    
redhat.com   registry.access.redhat.com/openshift3/metrics-hawkular-openshift-agent                Hawkular OpenShift Agent is a Hawkular feed ...   0    
redhat.com   registry.access.redhat.com/openshift3/ose-node-problem-detector                       Node Problem Detector monitors OpenShift nod...   0    
redhat.com   registry.access.redhat.com/openshift3/ose-metrics-heapster                            Retrieves container and node metrics from an...   0    
redhat.com   registry.access.redhat.com/openshift3/metrics-heapster                                Retrieves container and node metrics from an...   0    
redhat.com   registry.access.redhat.com/openshift3/ose-keepalived-ipfailover                       Optional Pod providing keepalived support fo...   0    
redhat.com   registry.access.redhat.com/openshift3/ose-metrics-hawkular-openshift-agent            Hawkular OpenShift Agent is a Hawkular feed ...   0    
redhat.com   registry.access.redhat.com/openshift3/ose-node                                        Provides a containerized OpenShift Node with...   0    
redhat.com   registry.access.redhat.com/amqstreams-1/amqstreams10-kafkaconnect-openshift           AMQ Streams image for running an Apache Kafk...   0    
redhat.io    registry.redhat.io/openshift3/node                                                    Provides a containerized OpenShift Node with...   0    
redhat.io    registry.redhat.io/openshift4/ose-prometheus-node-exporter                            Prometheus exporter for hardware and OS metr...   0    
redhat.io    registry.redhat.io/openshift4/ose-cluster-node-tuning-operator                        'OpenShift Node Tuning Operator'                  0    
redhat.io    registry.redhat.io/openshift4/ose-node                                                'OpenShift Container Platform Node'               0    
redhat.io    registry.redhat.io/openshift3/prometheus-node-exporter                                Prometheus exporter for hardware and OS metr...   0    
redhat.io    registry.redhat.io/openshift4/ose-csi-node-driver-registrar                           CSI Node Driver Registar                          0    
redhat.io    registry.redhat.io/openshift4/ose-node-feature-discovery                              Node Feature Discovery Container Image            0    
redhat.io    registry.redhat.io/openshift4/ose-cluster-nfd-operator                                Node Feature Discovery (NFD) Operator             0    
redhat.io    registry.redhat.io/codeready-workspaces/stacks-node                                   Red Hat CodeReady Workspaces - Node Stack co...   0    
redhat.io    registry.redhat.io/codeready-workspaces/stacks-node-rhel8                             Red Hat CodeReady Workspaces - Node 10 Stack      0    
redhat.io    registry.redhat.io/codeready-workspaces/plugin-java8-rhel8                            Red Hat CodeReady Workspaces - Java 8 plugin...   0    
redhat.io    registry.redhat.io/rhel7/kubernetes-scheduler                                         The Kubernetes scheduler watches for new un-...   0    
redhat.io    registry.redhat.io/openshift3/metrics-hawkular-openshift-agent                        Hawkular OpenShift Agent is a Hawkular feed ...   0    
redhat.io    registry.redhat.io/openshift3/ose-node-problem-detector                               Node Problem Detector monitors OpenShift nod...   0    
redhat.io    registry.redhat.io/openshift3/ose-metrics-heapster                                    Retrieves container and node metrics from an...   0    
redhat.io    registry.redhat.io/openshift3/metrics-heapster                                        Retrieves container and node metrics from an...   0    
redhat.io    registry.redhat.io/openshift3/ose-metrics-hawkular-openshift-agent                    Hawkular OpenShift Agent is a Hawkular feed ...   0    
redhat.io    registry.redhat.io/openshift3/ose-keepalived-ipfailover                               Optional Pod providing keepalived support fo...   0    
redhat.io    registry.redhat.io/container-native-virtualization/node-maintenance-operator          Red Hat Container Native Virtualization imag...   0    
redhat.io    registry.redhat.io/openshift3/ose-node                                                Provides a containerized OpenShift Node with...   0    
redhat.io    registry.redhat.io/amqstreams-1/amqstreams10-kafkaconnect-openshift                   AMQ Streams image for running an Apache Kafk...   0    
redhat.io    registry.redhat.io/openshift4/ose-cluster-machine-approver                            'Validates and approves CSRs for nodes attem...   0    
redhat.io    registry.redhat.io/container-native-virtiualization/node-maintenance-rhel8-operator   Red Hat Container Native Virtualization imag...   0    
redhat.io    registry.redhat.io/openshift4/ose-ptp                                                 Linuxptp daemonset to apply ptp configuratio...   0    
redhat.io    registry.redhat.io/container-native-virtualization/kubevirt-cpu-node-labeller         Red Hat Container Native Virtualization imag...   0    
docker.io    docker.io/library/node                                                                Node.js is a JavaScript-based platform for s...   9152    [OK]
docker.io    docker.io/nodered/node-red-docker                                                     Deprecated - older Node-RED Docker images.        351                [OK]
docker.io    docker.io/bitnami/node                                                                Bitnami Node.js Docker Image                      45                 [OK]
docker.io    docker.io/appsvc/node                                                                 Azure App Service Node.js dockerfiles             14                 [OK]
docker.io    docker.io/circleci/node                                                               Node.js is a JavaScript-based platform for s...   110  
docker.io    docker.io/prom/node-exporter                                                                                                            193                [OK]
docker.io    docker.io/calico/node                                                                 Calico's per-host DaemonSet container image....   19                 [OK]
docker.io    docker.io/library/mongo-express                                                       Web-based MongoDB admin interface, written w...   754     [OK]
docker.io    docker.io/iron/node                                                                   Tiny Node image                                   29   
docker.io    docker.io/bitnami/node-exporter                                                       Bitnami Node Exporter Docker Image                2                  [OK]
docker.io    docker.io/kkarczmarczyk/node-yarn                                                     Node docker image with yarn package manager ...   48                 [OK]
docker.io    docker.io/nodered/node-red                                                            Low-code programming for event-driven applic...   175  
docker.io    docker.io/nodecg/nodecg                                                               Create broadcast graphics using Node.js and ...   1                  [OK]
docker.io    docker.io/selenium/node-chrome                                                                                                          213                [OK]
docker.io    docker.io/appsvctest/node                                                             node build                                        0                  [OK]
docker.io    docker.io/library/iojs                                                                io.js is an npm compatible platform original...   135     [OK]
docker.io    docker.io/camptocamp/node-collectd                                                    rancher node monitoring agent                     0                  [OK]
docker.io    docker.io/ppc64le/node                                                                Node.js is a JavaScript-based platform for s...   2    
docker.io    docker.io/testim/node-chrome                                                          Selenium Chrome Node + Testim Extension           0                  [OK]
docker.io    docker.io/digitallyseamless/nodejs-bower-grunt                                         Node.js w/ Bower & Grunt Dockerfile for tru...   48                 [OK]
docker.io    docker.io/cusspvz/node                                                                ? Super small Node.js container (~15MB) b...      8                  [OK]
docker.io    docker.io/ogazitt/node-env                                                            node app that shows environment variables         2    
docker.io    docker.io/basi/node-exporter                                                          Node exporter image that allows to expose th...   8                  [OK]
docker.io    docker.io/selenium/node-firefox                                                                                                         136                [OK]
docker.io    docker.io/tarampampam/node                                                            Docker image, based on node, with some addit...   2                  [OK]

Avec --filter = is-official, vous ne pouvez filtrer que les images dont le distributeur est officiel.

$ podman search node --filter=is-official
INDEX       NAME                              DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED
docker.io   docker.io/library/node            Node.js is a JavaScript-based platform for s...   9152    [OK]
docker.io   docker.io/library/mongo-express   Web-based MongoDB admin interface, written w...   757     [OK]
docker.io   docker.io/library/iojs            io.js is an npm compatible platform original...   135     [OK]

Et comme Docker, vous pouvez apporter l'image localement avec podman pull <nom de l'image>.

$ podman pull docker.io/library/node
Trying to pull docker.io/library/node...
Getting image source signatures
Copying blob de30e8b35015 done
Copying blob 419e7ae5bb1e done
Copying blob 7ec8a0667334 done
Copying blob 848839e0cd3b done
~~~~~ Omis ~~~~~~~~
$ podman images
REPOSITORY                            TAG      IMAGE ID       CREATED       SIZE
docker.io/library/node                latest   784e696f5060   2 weeks ago   972 MB

L'image du conteneur podman est stockée sur le site Web officiel de Red Hat. https://catalog.redhat.com/software/containers/explore)

Démarrer le conteneur

Comme docker, podman peut démarrer un conteneur avec podman run.

$ podman run -it --rm node bash
root@cc0bf2c6cc65:/# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Construire l'image

Vous pouvez construire l'image avec la commande buildah, et vous pouvez également construire le Dockerfile avec la commande buildah bud. (Il existe un [Tutoriel] officiel (https://github.com/containers/buildah/tree/master/docs/tutorials), alors veuillez vous y référer) En passant, vous pouvez également afficher la liste des images tirées par podman avec des images buildah.

$ podman images
REPOSITORY                                    TAG      IMAGE ID       CREATED          SIZE
localhost/johndoe/webserver                   latest   6d36abc8f72f   24 minutes ago   245 MB
registry.access.redhat.com/ubi8/ubi           latest   a1f8c9699786   5 weeks ago      211 MB
registry.access.redhat.com/ubi8/ubi-minimal   latest   86c870596572   5 weeks ago      146 MB

$ buildah images
REPOSITORY                                    TAG      IMAGE ID       CREATED          SIZE
localhost/johndoe/webserver                   latest   6d36abc8f72f   24 minutes ago   245 MB
registry.access.redhat.com/ubi8/ubi           latest   a1f8c9699786   5 weeks ago      211 MB
registry.access.redhat.com/ubi8/ubi-minimal   latest   86c870596572   5 weeks ago      146 MB

Pour le Dockerfile qui a la configuration suivante, générez-le avec la commande buildah.

# ls
Dockerfile  myecho
# cat Dockerfile
FROM registry.access.redhat.com/ubi8/ubi:latest
ADD myecho /usr/local/bin
ENTRYPOINT "/usr/local/bin/myecho"
# cat myecho
echo "This container works!"
# chmod 755 myecho
# ./myecho
This container works!

Après avoir créé le Dockerfile, exécutez la commande buildah bud -t fedora-httpd .. L'image est construite selon les instructions du fichier. Une fois la génération terminée, essayez d'exécuter le conteneur.

$ buildah  images
REPOSITORY                            TAG      IMAGE ID       CREATED          SIZE
localhost/myecho-container            latest   5098f73df28e   50 seconds ago   211 MB
$ podman run localhost/myecho-container
This container works!

En passant, dans le didacticiel de buildah, il semble que vous puissiez démarrer le conteneur avec buildah run, mais cela a échoué.

$ buildah run localhost/myecho-container
command must be specified
ERRO exit status 1                 

Supprimer le conteneur, l'image

Comme docker, vous pouvez supprimer des conteneurs et des images avec l'option rm.

$ podman ps -a
CONTAINER ID  IMAGE                                       COMMAND        CREATED        STATUS                         PORTS                 NAMES
06a79ab009f3  registry.access.redhat.com/ubi8/ubi:latest  /bin/bash      3 minutes ago  Exited (1) About a minute ago                        mystifying_jepsen
e8a1c6fbc91f  localhost/johndoe/webserver:latest          -D FOREGROUND  29 hours ago   Exited (135) 28 hours ago      0.0.0.0:8080->80/tcp  agitated_morse
$ podman rm e8a1c6fbc91f
e8a1c6fbc91f9252f13a34e6a2275078cdadef196e135bb32330784b8d012ad3
$ podman ps -a
CONTAINER ID  IMAGE                                       COMMAND        CREATED        STATUS                    PORTS                 NAMES
06a79ab009f3  registry.access.redhat.com/ubi8/ubi:latest  /bin/bash      4 minutes ago  Exited (1) 3 minutes ago                        mystifying_jepsen

Les images peuvent également être supprimées avec l'option rmi.

$ podman images
REPOSITORY                                    TAG      IMAGE ID       CREATED        SIZE
localhost/johndoe/webserver                   latest   6d36abc8f72f   29 hours ago   245 MB
registry.access.redhat.com/ubi8/ubi           latest   a1f8c9699786   5 weeks ago    211 MB
registry.access.redhat.com/ubi8/ubi-minimal   latest   86c870596572   5 weeks ago    146 MB
docker.io/library/fedora                      latest   a368cbcfa678   7 weeks ago    189 MB

$ podman rmi docker.io/library/fedora
Untagged: docker.io/library/fedora:latest
Deleted: a368cbcfa6789bc347345f6d19132afe138b62ff5373d2aa5f37120277c90b54
$ podman rmi 86c870596572
Untagged: registry.access.redhat.com/ubi8/ubi-minimal:latest
Deleted: 86c870596572a5b4fe016f4fb7ae9d181e88df6ac91d2cb15250c5e053cfad15

$ podman images
REPOSITORY                            TAG      IMAGE ID       CREATED        SIZE
localhost/johndoe/webserver           latest   6d36abc8f72f   29 hours ago   245 MB
registry.access.redhat.com/ubi8/ubi   latest   a1f8c9699786   5 weeks ago    211 MB

Création d'un fichier yaml de pod Kube

Une autre fonctionnalité de Podman est que vous pouvez utiliser podman generate pour créer des fichiers de pods Kubernetes. Exécutez le processus de conteneur de mariadb pour générer le yaml de Kubernetes avec la commande `podman generate', puis déposez-le dans un fichier.

$ podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass \
>      -e MYSQL_DATABASE=db -p 3306:3306 --name mymariadb rhscl/mariadb-102-rhel7
Trying to pull registry.access.redhat.com/rhscl/mariadb-102-rhel7...
Getting image source signatures
Copying blob 9e7a6dc796f0 done
Copying blob e7021e0589e9 done
Copying blob fc5b206e9329 [======================================] 72.7MiB / 72.7MiB
Copying blob 98b39311ee6a done
Copying config 5ca39d258f done
Writing manifest to image destination
Storing signatures
8e994c65e7a24febfa57c6cc79c44c7fce37c8593a087d9efb5c45b994169b48

$ podman ps -a
CONTAINER ID  IMAGE                                                      COMMAND     CREATED         STATUS             PORTS                   NAMES
8e994c65e7a2  registry.access.redhat.com/rhscl/mariadb-102-rhel7:latest  run-mysqld  41 seconds ago  Up 40 seconds ago  0.0.0.0:3306->3306/tcp  mymariadb

$ podman generate kube mymariadb > mymariadbkube.yaml
# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.9.3
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-08-29T05:37:11Z"
  labels:
    app: mymariadb
  name: mymariadb
spec:
  containers:
  - command:
    - run-mysqld
    env:
    - name: PATH
      value: /opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: oci
    - name: STI_SCRIPTS_URL
      value: image:///usr/libexec/s2i
    - name: MYSQL_PASSWORD
      value: pass
    - name: ENABLED_COLLECTIONS
      value: rh-mariadb102
    - name: PROMPT_COMMAND
      value: . /usr/share/container-scripts/mysql/scl_enable
    - name: HOME
      value: /var/lib/mysql
    - name: ENV
      value: /usr/share/container-scripts/mysql/scl_enable
    - name: PLATFORM
      value: el7
    - name: STI_SCRIPTS_PATH
      value: /usr/libexec/s2i
    - name: MYSQL_USER
      value: user
    - name: MYSQL_DATABASE
      value: db
    - name: DESCRIPTION
      value: MariaDB is a multi-user, multi-threaded SQL database server. The container
        image provides a containerized packaging of the MariaDB mysqld daemon and
        client application. The mysqld server daemon accepts connections from clients
        and provides access to content from MariaDB databases on behalf of the clients.
    - name: SUMMARY
      value: MariaDB 10.2 SQL database server
    - name: APP_ROOT
      value: /opt/app-root
    - name: MYSQL_PREFIX
      value: /opt/rh/rh-mariadb102/root/usr
    - name: APP_DATA
      value: /opt/app-root/src
    - name: BASH_ENV
      value: /usr/share/container-scripts/mysql/scl_enable
    - name: CONTAINER_SCRIPTS_PATH
      value: /usr/share/container-scripts/mysql
    - name: MYSQL_VERSION
      value: "10.2"
    image: registry.access.redhat.com/rhscl/mariadb-102-rhel7:latest
    name: mymariadb
    ports:
    - containerPort: 3306
      hostPort: 3306
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
      runAsGroup: 27
      runAsUser: 27
      seLinuxOptions: {}
    workingDir: /opt/app-root/src
status: {}

Après cela, vous pouvez créer des pods pour ce fichier yaml avec la commande kubectl. kubectl create -f mymariadbkube.yaml

Sommaire

J'ai expliqué le fonctionnement de divers outils. Ces deux commandes sont des outils qui fonctionnent dans Ansible-bender présenté dans l'article suivant, et vous pouvez créer une image de conteneur avec Ansible. Vous pourrez le faire. Je n'ai pas encore beaucoup entendu parler de Podman et Buildah, mais je pense que cela attirera l'attention en tant qu'outil de gestion de conteneurs pour remplacer Docker à l'avenir, donc je voudrais approfondir ma compréhension et le toucher fermement.

Recommended Posts

Allez-vous remplacer Docker? Outils de gestion de conteneurs de nouvelle génération Podman et Buildah
Mécanisme de commande et outils de gestion
À propos de Docker, faux serveur et conteneur