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.
$ 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.
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.
$ 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
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.
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).
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"
Der Build kann nicht wie Docker-Compose ausgeführt werden. Verwenden Sie daher den Befehl podman.
$ podman build -t node_app:latest -f Dockerfile ./
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
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.
Podman remote clients for macOS and Windows
Recommended Posts