Examinez le remplacement de Docker vers Podman.

introduction

Il y a un flux de remplacement de Docker vers Podman. Avec Docker pour Mac, j'ai pu utiliser Docker de manière transparente à partir du Mac et j'ai pu effectuer des opérations pratiques avec docker-compose, mais qu'en est-il de la situation actuelle avec podman? Dans cet article, je résumerai ce domaine.

Informations environnementales

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.6
BuildVersion:   19G2021

$ VBoxManage -v
6.0.8r130520

$ vagrant -v
Vagrant 2.2.9

Setup

Il y a deux choses à faire.

Configuration de la machine virtuelle dans l'environnement Podman

Il existe des podman, podman-machine et podman spécifiques à boot2 pour la construction de VM, mais je vais essayer de les construire avec le Vagrant familier. Tout d'abord, préparez un Vagrantfile. Le but est d'allouer une IP fixe pour le réseau privé

Vagrantfile


Vagrant.configure("2") do |config|
  config.vm.box = "fedora/32-cloud-base"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end

  config.vm.network :private_network, ip: "192.168.33.11"

end

Puis démarrez et connectez-vous

$ vagrant up
...

$ vagrant ssh
[vagrant@localhost ~]$

Après la connexion vagrant, définissez podman.

[vagrant@localhost ~]$ sudo dnf -y install podman

[vagrant@localhost ~]$ systemctl --user enable podman.socket
Created symlink /home/vagrant/.config/systemd/user/sockets.target.wants/podman.socket → /usr/lib/systemd/user/podman.socket.

[vagrant@localhost ~]$ sudo loginctl enable-linger $USER

[vagrant@localhost ~]$ systemctl --user status podman.socket
● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; vendor preset: disabled)
     Active: inactive (dead)
   Triggers: ● podman.service
       Docs: man:podman-system-service(1)
     Listen: /run/user/1000/podman/podman.sock (Stream)

[vagrant@localhost ~]$ systemctl --user start podman.socket

[vagrant@localhost ~]$ systemctl --user status podman.socket
● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; vendor preset: disabled)
     Active: active (listening) since Fri 2020-09-11 06:29:56 UTC; 3s ago
   Triggers: ● podman.service
       Docs: man:podman-system-service(1)
     Listen: /run/user/1000/podman/podman.sock (Stream)
     CGroup: /user.slice/user-1000.slice/[email protected]/podman.socket

Sep 11 06:29:56 localhost.localdomain systemd[2509]: Listening on Podman API Socket.

[vagrant@localhost ~]$ podman --remote info
host:
  arch: amd64
  buildahVersion: 1.15.1
  cgroupVersion: v2
...

C'est ça.

Configuration à distance Podman côté Mac

$ brew install podman

$ podman --version
podman version 2.0.6

$ podman system connection add vagrant --identity $HOME/podman_env/.vagrant/machines/default/virtualbox/private_key ssh://[email protected]/run/user/1000/podman/podman.sock

$ podman system connection list
Name      Identity                                                                      URI
vagrant*  /Users/seijitada/podman_env/.vagrant/machines/default/virtualbox/private_key  ssh://[email protected]:22/run/user/1000/podman/podman.sock

$ podman info
host:
  arch: amd64
  buildahVersion: 1.15.1
  cgroupVersion: v2
...

C'est ça.

Operation

J'ai souvent utilisé docker pour les faire avec podman par les opérations suivantes.

--docker-compose comme opération --Communication entre conteneurs --Utilisation du volume --Construction d'image

docker compose comme une opération

podman a également un outil non officiel de type docker-compose appelé podman-compose, J'utilise cela parce que la fonction de lecture de Kubernetes yaml intégrée à podman est bonne. Si vous êtes habitué à Kubernetes yaml, vous pouvez le créer à partir de zéro, mais ici, nous le générerons automatiquement à partir de podman.

$ podman pod create -n pod01
06267e4e35e53ff1c7cf843fd74c617601870a7b82e5eb2404053fdc2f54f1ce

$ podman run --pod pod01 -d --name postgres -e POSTGRES_PASSWORD=password postgres:13
f54a6902a3e0d7b62ec3a1b4c92f637b14c2ea6dd8fbd8856804e9692b870f50

$ podman pod ls
POD ID        NAME    STATUS   CREATED             # OF CONTAINERS  INFRA ID
06267e4e35e5  pod01   Running  About a minute ago  2                2a9e30d39f67

$ podman ps
CONTAINER ID  IMAGE                          COMMAND   CREATED             STATUS             PORTS   NAMES
2a9e30d39f67  k8s.gcr.io/pause:3.2                     About a minute ago  Up 21 seconds ago          06267e4e35e5-infra
f54a6902a3e0  docker.io/library/postgres:13  postgres  21 seconds ago      Up 20 seconds ago          postgres

$ podman generate kube pod01 > pod01.yaml

$ cat pod01.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-2.0.6
apiVersion: v1
kind: Pod

De cette manière, vous pouvez générer Kubernetes yaml à partir du pod ou du conteneur en cours d'exécution avec la commande podman generate kube. Ensuite, chargeons le fichier yaml Kubenetes généré.

$ podman pod rm pod01 -f
06267e4e35e53ff1c7cf843fd74c617601870a7b82e5eb2404053fdc2f54f1ce

$ podman pod ls
POD ID  NAME    STATUS  CREATED  # OF CONTAINERS  INFRA ID

$ podman play kube pod01.yaml
Pod:
4203ed53e966d6c0f8c2ae8008efe9fb9cc42fb73d9a1b06831de664cdfa5843
Container:
f62bf71b3f8ea19b0c2084bf21cd2d7dbfa9f18097d14c213a49fb9c562d3b6e

$ podman pod ls
POD ID        NAME    STATUS   CREATED         # OF CONTAINERS  INFRA ID
4203ed53e966  pod01   Running  11 seconds ago  2                4058387dce44

$ podman ps
CONTAINER ID  IMAGE                 COMMAND  CREATED         STATUS             PORTS   NAMES
4058387dce44  k8s.gcr.io/pause:3.2           22 seconds ago  Up 21 seconds ago          4203ed53e966-infra

$ podman ps -a
CONTAINER ID  IMAGE                          COMMAND   CREATED         STATUS                     PORTS   NAMES
4058387dce44  k8s.gcr.io/pause:3.2                     27 seconds ago  Up 26 seconds ago                  4203ed53e966-infra
f62bf71b3f8e  docker.io/library/postgres:13  postgres  27 seconds ago  Exited (1) 26 seconds ago          pod01-postgres

Je peux utiliser Kubernetes yaml avec la commande podman play kube, mais postgres ne fonctionne pas correctement. En regardant le journal, il semble que j'essaie de donner postgres en tant que root.

$ podman logs pod01-postgres
"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent
possible system security compromise.  See the documentation for
more information on how to properly start the server.

Quand je l'ai recherché, il semble que Kubernetes yaml ait une spécification qui écrase le point d'entrée de Image en spécifiant spec.containers.command. Il semble que cela ait été spécifié dans le yaml de Kubernetes généré par podman kube generate. Donc si vous le réparez ici, ok

$ cp pod01.yaml pod01.yaml.bk

# vim pod01.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-09-11T06:56:41Z"
  labels:
    app: pod01
  name: pod01
spec:
  containers:
  - command:               <----Pas besoin ici
    - postgres             <----Pas besoin ici
    env:

$ diff pod01.yaml.bk pod01.yaml
16,18c16
<   - command:
<     - postgres
<     env:
---
>   - env:

$ podman pod rm pod01 -f
4203ed53e966d6c0f8c2ae8008efe9fb9cc42fb73d9a1b06831de664cdfa5843

$ podman play kube pod01.yaml
Pod:
3cd402c2bc67b07fc31f845de84169ba574d8171c263c6a74aeec816fbf0e234
Container:
f6278b9af26d956185618b5424792f240d814cca3ed34d02ca0df63cc2c73fcb

$ podman ps
CONTAINER ID  IMAGE                          COMMAND               CREATED         STATUS             PORTS   NAMES
12f881ec8125  k8s.gcr.io/pause:3.2                                 11 seconds ago  Up 10 seconds ago          3cd402c2bc67-infra
f6278b9af26d  docker.io/library/postgres:13  docker-entrypoint...  10 seconds ago  Up 10 seconds ago          pod01-postgres

Maintenant, je peux confirmer que podman play kube peut être démarré à partir de kubernetes yaml.

Communication entre conteneurs

Pour la communication entre conteneurs, dans le cas de docker-compose, un réseau a été créé afin que l'accès puisse être effectué avec le nom du conteneur. Dans le cas de podman, puisqu'il s'agit d'un pod (partage d'ipc, net, uts), la communication sur l'hôte local et la communication inter-processus sont possibles.

Utilisation du volume

docker-compose a permis le montage de liaison et le montage de volume, mais podman play semble ne prendre en charge que hostPath (montage de liaison) pour le moment. Pour utiliser hostPath, il est nécessaire de créer au préalable un chemin côté vm, et il faut faire attention à la spécification liée à SELinux.

[vagrant@localhost ~]$ mkdir -p /tmp/pg_data


$ cat pod01.yaml
...
spec:
  containers:
  ...
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
      seLinuxOptions:
        type: spc_t              <----SELinux accorde des privilèges d'accès à l'hôte.
    workingDir: /
    volumeMounts:
    - mountPath: /var/lib/postgresql/data
      name: pg_data
  volumes:
  - name: pg_data
    hostPath:
      path: "/tmp/pg_data"

Création d'image

Quant à build, il ne peut pas être fait comme docker-compose, utilisez donc la commande podman.

$ podman build -t node_app:latest -f Dockerfile ./

Communication depuis l'extérieur du conteneur

Pour Kubernetes yaml, cela est possible en ajoutant spec.containers.ports. Vous pouvez accéder depuis le PC à l'adresse IP fixe définie dans Vagrant.

    ports:
    - containerPort: 5432
      hostPort: 5432
      protocol: TCP

Sommaire

Ce n'est pas compatible Docker, mais il semble qu'il puisse être utilisé à ce stade dans la mesure où ce n'est pas un problème pour une utilisation pratique. Attendez-vous à une nouvelle expansion à l'avenir.

Matériel de référence

Podman remote clients for macOS and Windows

Recommended Posts

Examinez le remplacement de Docker vers Podman.
[Docker] Comment accéder à l'hôte depuis l'intérieur du conteneur. http: //host.docker.internal:
La route de JavaScript à Java
Mettre à jour MySQL de 5.7 à 8.0 avec Docker
[Ruby] Des bases à la méthode inject
[Docker] Copie des fichiers du conteneur Docker vers l'hôte
Comment vérifier le journal dans le conteneur Docker
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
Migration d'Eclipse vers IntelliJ (en cours)
Comment obtenir un heapdump à partir d'un conteneur Docker
Paramètre pour quitter le conteneur Docker avec VScode
Copier les fichiers du conteneur Docker vers l'hôte (docker cp)
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
Présentez docker à l'application que vous créez
Poussez l'image vers le hub docker à l'aide de Jib
3. Créez une base de données à laquelle accéder à partir du module Web
De l'introduction de la conception à la création de la table des utilisateurs
[Java] Je souhaite calculer la différence par rapport à la date
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
Volume 3 types de Docker Compose considérés à partir de l'objectif
Comment écrire Scala du point de vue de Java
Comment déployer à partir d'une image Docker locale vers Heroku
[Java] Comment extraire le nom du fichier du chemin
Indiquez comment apprendre de Docker à AKS sur AWS
Comment déterminer la demande de prélecture depuis le navigateur
[Android] Téléchargement d'images du terminal vers le serveur
Kotlin peut faire passer le monde de l'application au Web
Commande pour essayer d'utiliser Docker pour le moment
Transférer une image Docker des actions GitHub vers GitHub Container Registry
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Migrer de JUnit 4 vers JUnit 5
Que faire si vous modifiez l'adresse d'écoute à partir de l'écran des paramètres dans le menu fixe Mattermost
Comment installer Docker
Quand j'ai commencé ansible + docker maintenant, j'ai trébuché depuis le début, mais j'ai réussi à le démarrer
De Java à Ruby !!
Je ne trouve pas l'image du docker après la mise à jour vers Docker Desktop 2.4.0.0
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Comprendre le flux approximatif de la demande à la réponse dans SpringWebMVC
[Introduction à Docker] ~ Explication la plus courte jusqu'au démarrage de jupyter lab ~
La clé pour exécuter Docker sur Raspberry Pi 4 (serveur Ubuntu 20.04)
[Note] Flux de l'installation de docker au démarrage de JupyterLab sur ubuntu
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
Générer JSON à partir du fichier de classe JVM pour voir la structure hiérarchique
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Comment créer un formulaire pour sélectionner une date dans le calendrier
Application Android qui sélectionne et affiche des images de la galerie
Comment obtenir les informations les plus longues de Twitter à partir du 12/12/2016
Comment désactiver Set-Cookie de l'API sur la face avant