Nomad podman Driver是HashiCorp Nomad的容器驱动插件,允许用户在Nomad集群中使用podman运行容器。该插件由@towe75和Pascom贡献,提供了容器生命周期管理、资源监控、网络配置等核心能力,适用于需要在Nomad中集成podman容器运行时的场景,尤其支持rootless容器及cgroup V2。
该项目包含go.mod定义,可克隆到任意目录,无需设置GOPATH。需使用Go 1.13或更高版本。
sh$ git clone ***:hashicorp/nomad-driver-podman cd nomad-driver-podman ./build.sh
podman的Linux主机需启用varlink的podman二进制文件和系统套接字激活单元,详见podman varlink文档。Nomad代理、驱动及podman位于同一主机,无需配置podman varlink的SSH相关功能。需确保Nomad能找到插件,配置方法见plugin_dir。
enabled - 默认true。允许任务将主机路径(卷)绑定到容器内。selinuxlabel - 允许管理员为分配和任务本地绑定挂载到容器的路径设置SELinux标签。若与volumes.enabled=false一起使用,标签仍会应用于容器中的标准绑定。hclplugin "nomad-driver-podman" { config { volumes { enabled = true selinuxlabel = "z" } } }
container - 默认true。可禁用Nomad在任务退出时删除容器。hclplugin "nomad-driver-podman" { config { gc { container = false } } }
默认true。允许驱动在Nomad客户端重启后启动并重用之前停止的容器。适用于单节点系统重启场景,可避免容器重建。
hclplugin "nomad-driver-podman" { config { recover_stopped = false } }
默认值:root用户或cgroup V1系统为"unix://run/podman/io.podman",rootless cgroup V2系统为"unix://run/user/<USER_ID>/podman/io.podman"。
hclplugin "nomad-driver-podman" { config { socket_path = "unix://run/podman/io.podman" } }
指定要运行的容器镜像。
hclconfig { image = "docker://redis" }
容器的入口点,默认为镜像中定义的入口点。
hclconfig { entrypoint = "/entrypoint.sh" }
启动容器时执行的命令。
hclconfig { command = "some-command" }
命令参数列表。若未指定command,参数将直接传递给容器。
hclconfig { args = [ "arg1", "arg2", ] }
容器的工作目录,默认为镜像中定义的默认目录。
hclconfig { working_dir = "/data" }
主机路径与容器路径绑定的字符串列表,格式为host_path:container_path。
hclconfig { volumes = [ "/some/host/data:/container/data" ] }
tmpfs挂载点的容器路径列表,详见podman run --tmpfs选项。
hclconfig { tmpfs = [ "/var" ] }
分配给容器的主机名。使用count启动多个任务实例时,所有容器将共享此主机名。
配置方法详见Docker驱动端口配置。
在容器内运行init进程,用于转发信号和回收子进程。
hclconfig { init = true }
容器init二进制文件的路径。
hclconfig { init = true init_path = "/usr/libexec/podman/catatonit" }
在容器内以指定用户/UID运行命令,详见任务用户配置。
hcluser = "nobody" config { }
内存软限制(单位:b/字节、k/千字节、m/兆字节、g/千兆字节)。当系统内存紧张时,容器将被限制在预留值内,需小于memory硬限制。
hclconfig { memory_reservation = "100m" }
内存+交换空间的总限制,必须大于内存资源值。单位同上,设置为-1表示无限制交换空间。
hclconfig { memory_swap = "180m" }
调整容器内存交换行为,取值范围0-100(整数)。
hclconfig { memory_swappiness = 60 }
设置容器网络模式:
bridge:(root用户默认)使用默认桥接网络none:禁用网络container:id:重用其他容器的网络栈host:使用主机网络栈(不安全,容器可访问主机系统服务)slirp4netns:(rootless默认)使用slirp4netns创建用户网络栈(root容器暂不支持)hclconfig { network_mode = "bridge" }
hcljob "redis" { datacenters = ["dc1"] type = "service" group "redis" { task "redis" { driver = "podman" config { image = "docker://redis" port_map { redis = 6379 } } resources { cpu = 500 memory = 256 network { mbits = 20 port "redis" {} } } } } }
运行任务:
shnomad run redis.nomad ==> Monitoring evaluation "9fc25b88" Evaluation triggered by job "redis" Allocation "60fdc69b" created: node "f6bccd6d", group "redis" Evaluation status changed: "pending" -> "complete" ==> Evaluation "9fc25b88" finished with status "complete"
验证容器运行:
shpodman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d2d700cbce6 docker.io/library/redis:latest docker-entrypoint... 16 seconds ago Up 16 seconds ago redis-60fdc69b-65cb-8ece-8554-df49321b3462
/etc/default/grub,添加内核参数GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=1"
更新grub:sudo update-grub
shsystemctl --user status io.podman ● io.podman.service - Podman Remote API Service Loaded: loaded (/usr/lib/systemd/user/io.podman.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2020-07-01 16:01:41 EDT; 7s ago TriggeredBy: ● io.podman.socket Docs: man:podman-varlink(1) Main PID: 25091 (podman) Tasks: 29 (limit: ***) Memory: 17.5M CPU: 184ms CGroup: /user.slice/user-1000.slice/***/io.podman.service ├─25091 /usr/bin/podman varlink unix:/run/user/1000/podman/io.podman --timeout=60000 --cgroup-manager=systemd ├─25121 /usr/bin/podman varlink unix:/run/user/1000/podman/io.podman --timeout=60000 --cgroup-manager=systemd └─25125 /usr/bin/podman
shcrun -V crun version 0.13.227-d38b commit: d38b8c28fc50a***a27fa6afc69a55bfdd2c11 spec: 1.0.0 +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +YAJL
example.nomadhcljob "example" { datacenters = ["dc1"] type = "service" group "cache" { count = 1 restart { attempts = 2 interval = "30m" delay = "15s" mode = "fail" } task "redis" { driver = "podman" config { image = "redis" port_map { db = 6379 } } resources { cpu = 500 # 500 MHz memory = 256 # 256MB network { port "db" {} } } } } }
提交任务:nomad job run example.nomad
shpodman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2423ae3efa21 docker.io/library/redis:latest redis-server 7 seconds ago Up 6 seconds ago 127.0.0.1:21510->6379/tcp, 127.0.0.1:21510->6379/udp redis-b640480f-4b93-65fd-7bba-c15722886395
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429