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.
$ 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.
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.
$ 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
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.
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.
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"
Quant à build, il ne peut pas être fait comme docker-compose, utilisez donc la commande podman.
$ podman build -t node_app:latest -f Dockerfile ./
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
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.
Podman remote clients for macOS and Windows
Recommended Posts