Untersuchen Sie den Ersatz von Docker zu Podman.

Einführung

Es gibt einen Austauschfluss von Docker zu Podman. Mit Docker für Mac konnte ich Docker transparent vom Mac aus bedienen und mit Docker-Compose bequeme Vorgänge ausführen. Aber wie sieht es mit der aktuellen Situation mit Podman aus? In diesem Artikel werde ich diesen Bereich zusammenfassen.

Umweltinformationen

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

$ VBoxManage -v
6.0.8r130520

$ vagrant -v
Vagrant 2.2.9

Setup

Es gibt zwei Dinge zu tun.

VM-Setup in der Podman-Umgebung

Es gibt boot2 podman, podman-machine und podman-spezifische zum Erstellen von VMs, aber ich werde versuchen, sie mit dem bekannten Vagrant zu erstellen. Bereiten Sie zuerst eine Vagrant-Datei vor. Der Punkt ist, eine feste IP für das private Netzwerk zuzuweisen

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

Dann starten und anmelden

$ vagrant up
...

$ vagrant ssh
[vagrant@localhost ~]$

Stellen Sie nach dem Anmelden des Vagabunden den Podman ein.

[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
...

Das ist es.

Podman-Remote-Setup auf der Mac-Seite

$ 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
...

Das ist es.

Operation

Ich habe Docker oft verwendet, um dies mit Podman durch die folgenden Operationen zu tun.

--docker-compose like operation

Docker komponieren wie Operation

podman hat auch ein Docker-Compose-ähnliches inoffizielles Tool namens podman-compose. Ich benutze dies, weil die Funktion zum Lesen von Kubernetes Yaml in Podman gut ist. Wenn Sie an Kubernetes Yaml gewöhnt sind, können Sie es von Grund auf neu erstellen, aber hier werden wir es automatisch aus Podman generieren.

$ 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

Auf diese Weise können Sie mit dem Befehl podman generate kube aus dem aktuell ausgeführten Pod oder Container Kubernetes yaml generieren. Als nächstes laden wir das generierte Kubenetes-Yaml.

$ 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

Ich kann Kubernetes yaml mit dem Befehl podman play kube verwenden, aber irgendwie funktioniert postgres nicht richtig. Wenn ich mir das Protokoll anschaue, scheint es, dass ich versuche, Postgres als Root anzugeben.

$ 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.

Als ich es nachgeschlagen habe, scheint es, dass Kubernetes yaml eine Spezifikation hat, die den Einstiegspunkt von Image durch Angabe von spec.containers.command überschreibt. Es scheint, dass dies in Kubernetes yaml angegeben wurde, das von podman kube generate generiert wurde. Also, wenn Sie es hier beheben, 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:               <----Keine Notwendigkeit hier
    - postgres             <----Keine Notwendigkeit hier
    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

Jetzt kann ich bestätigen, dass podman play kube von kubernetes yaml aus gestartet werden kann.

Kommunikation zwischen Containern

Für die Kommunikation zwischen Containern wurde im Fall von Docker-Compose ein Netzwerk erstellt, damit der Zugriff mit dem Containernamen erfolgen kann. Im Fall von podman ist die Kommunikation über localhost und die Kommunikation zwischen Prozessen möglich, da es sich um einen Pod handelt (gemeinsame Nutzung von ipc, net, uts).

Verwendung von Volumen

Docker-Compose erlaubt Bind Mount und Volume Mount, aber Podman Play scheint derzeit nur HostPath (Bind Mount) zu unterstützen. Um hostPath verwenden zu können, muss im Voraus ein Pfad auf der VM-Seite erstellt werden, und es muss auf die SELinux-Spezifikation geachtet werden.

[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 gewährt Host-Zugriffsrechte.
    workingDir: /
    volumeMounts:
    - mountPath: /var/lib/postgresql/data
      name: pg_data
  volumes:
  - name: pg_data
    hostPath:
      path: "/tmp/pg_data"

Image erstellen

Der Build kann nicht wie Docker-Compose ausgeführt werden. Verwenden Sie daher den Befehl podman.

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

Kommunikation von außerhalb Container

Für Kubernetes yaml ist es möglich, spec.containers.ports hinzuzufügen. Sie können vom PC aus auf die in Vagrant festgelegte feste IP zugreifen.

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

Zusammenfassung

Es ist nicht Docker-kompatibel, aber es scheint, dass es in diesem Stadium verwendet werden kann, sofern es für den praktischen Gebrauch kein Problem darstellt. Erwarten Sie in Zukunft eine weitere Expansion.

Referenzmaterial

Podman remote clients for macOS and Windows

Recommended Posts

Untersuchen Sie den Ersatz von Docker zu Podman.
[Docker] Zugriff auf den Host aus dem Container heraus. http: //host.docker.internal:
Der Weg von JavaScript nach Java
Aktualisieren Sie MySQL mit Docker von 5.7 auf 8.0
[Ruby] Von den Grundlagen bis zur Injektionsmethode
[Docker] Kopieren Sie Dateien aus dem Docker-Container auf den Host
So überprüfen Sie das Protokoll im Docker-Container
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Migration von Eclipse zu IntelliJ (unterwegs)
So erhalten Sie einen Heapdump aus einem Docker-Container
Einstellung zum Verlassen des Docker-Containers mit VScode
Kopieren Sie Dateien vom Docker-Container auf den Host (Docker-CP).
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Führen Sie Docker in die Anwendung ein, die Sie erstellen
Schieben Sie das Image mit Jib zum Docker-Hub
3. Erstellen Sie eine Datenbank für den Zugriff über das Webmodul
Von der Einführung des Geräts bis zur Erstellung der Benutzertabelle
[Java] Ich möchte die Differenz zum Datum berechnen
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Band 3 Arten von Docker Compose aus dem Zweck betrachtet
Wie schreibe ich Scala aus der Perspektive von Java
Bereitstellen von einem lokalen Docker-Image auf Heroku
[Java] So extrahieren Sie den Dateinamen aus dem Pfad
Führen Sie auf, wie Sie in AWS von Docker zu AKS lernen können
So ermitteln Sie die Prefetch-Anforderung (Prefetch) im Browser
[Android] Hochladen von Bildern vom Terminal auf den Server
Kotlin kann die Welt von der App ins Web bringen
Befehl, um Docker vorerst zu verwenden
Übertragen Sie ein Docker-Image von GitHub Actions in die GitHub Container Registry
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Migrieren Sie von JUnit 4 zu JUnit 5
Was tun, wenn Sie die Listen-Adresse im Einstellungsbildschirm des Dockers Mattermost ändern?
So installieren Sie Docker
Als ich jetzt ansible + docker gestartet habe, bin ich von Anfang an gestolpert, aber ich habe es geschafft, es zu starten
Von Java zu Ruby !!
Ich kann das Docker-Image nach dem Update auf Docker Desktop 2.4.0.0 nicht finden
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Lassen Sie uns schreiben, wie API mit SpringBoot + Docker von 0 erstellt wird
Verstehen Sie den groben Fluss von der Anforderung zur Antwort in SpringWebMVC
[Einführung in Docker] ~ Kürzeste Erklärung bis zum Start von Jupyter Lab ~
Der Schlüssel zum Ausführen von Docker auf Raspberry Pi 4 (Ubuntu Server 20.04)
[Hinweis] Ablauf von der Docker-Installation bis zum Start von JupyterLab unter Ubuntu
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Generieren Sie JSON aus der JVM-Klassendatei, um die hierarchische Struktur anzuzeigen
Kommen Sie zu den Abkürzungen aus den fünf Beispielen für kursive Java-Listen
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
Android App, die Bilder aus der Galerie auswählt und anzeigt
So erhalten Sie die längsten Informationen von Twitter ab dem 12.12.2016
So deaktivieren Sie Set-Cookie über die API auf der Vorderseite