mirror of
https://github.com/containers/podman.git
synced 2025-10-17 19:24:04 +08:00
rootless: support podman network create
(CNI-in-slirp4netns)
Usage: ``` $ podman network create foo $ podman run -d --name web --hostname web --network foo nginx:alpine $ podman run --rm --network foo alpine wget -O - http://web.dns.podman Connecting to web.dns.podman (10.88.4.6:80) ... <h1>Welcome to nginx!</h1> ... ``` See contrib/rootless-cni-infra for the design. Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
@ -4,6 +4,7 @@ package libpod
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"io"
|
||||
@ -208,6 +209,20 @@ func checkSlirpFlags(path string) (*slirpFeatures, error) {
|
||||
|
||||
// Configure the network namespace for a rootless container
|
||||
func (r *Runtime) setupRootlessNetNS(ctr *Container) error {
|
||||
if ctr.config.NetMode.IsSlirp4netns() {
|
||||
return r.setupSlirp4netns(ctr)
|
||||
}
|
||||
if len(ctr.config.Networks) > 0 {
|
||||
// set up port forwarder for CNI-in-slirp4netns
|
||||
netnsPath := ctr.state.NetNS.Path()
|
||||
// TODO: support slirp4netns port forwarder as well
|
||||
return r.setupRootlessPortMappingViaRLK(ctr, netnsPath)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// setupSlirp4netns can be called in rootful as well as in rootless
|
||||
func (r *Runtime) setupSlirp4netns(ctr *Container) error {
|
||||
path := r.config.Engine.NetworkCmdPath
|
||||
|
||||
if path == "" {
|
||||
@ -711,7 +726,7 @@ func (r *Runtime) teardownNetNS(ctr *Container) error {
|
||||
|
||||
logrus.Debugf("Tearing down network namespace at %s for container %s", ctr.state.NetNS.Path(), ctr.ID())
|
||||
|
||||
// rootless containers do not use the CNI plugin
|
||||
// rootless containers do not use the CNI plugin directly
|
||||
if !rootless.IsRootless() && !ctr.config.NetMode.IsSlirp4netns() {
|
||||
var requestedIP net.IP
|
||||
if ctr.requestedIP != nil {
|
||||
@ -738,6 +753,13 @@ func (r *Runtime) teardownNetNS(ctr *Container) error {
|
||||
}
|
||||
}
|
||||
|
||||
// CNI-in-slirp4netns
|
||||
if rootless.IsRootless() && len(ctr.config.Networks) != 0 {
|
||||
if err := DeallocRootlessCNI(context.Background(), ctr); err != nil {
|
||||
return errors.Wrapf(err, "error tearing down CNI-in-slirp4netns for container %s", ctr.ID())
|
||||
}
|
||||
}
|
||||
|
||||
// First unmount the namespace
|
||||
if err := netns.UnmountNS(ctr.state.NetNS); err != nil {
|
||||
return errors.Wrapf(err, "error unmounting network namespace for container %s", ctr.ID())
|
||||
|
Reference in New Issue
Block a user