Nomad podman Driver是HashiCorp Nomad的容器驱动插件,允许用户在Nomad集群中使用podman运行容器。该插件由https://github.com/towe75%E5%92%8CPascom%E8%B4%A1%E7%8C%AE%EF%BC%8C%E6%8F%90%E4%BE%9B%E4%BA%86%E5%AE%B9%E5%99%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86%E3%80%81%E8%B5%84%E6%BA%90%E7%9B%91%E6%8E%A7%E3%80%81%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE%E7%AD%89%E6%A0%B8%E5%BF%83%E8%83%BD%E5%8A%9B%EF%BC%8C%E9%80%82%E7%94%A8%E4%BA%8E%E9%9C%80%E8%A6%81%E5%9C%A8Nomad%E4%B8%AD%E9%9B%86%E6%88%90podman%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E7%9A%84%E5%9C%BA%E6%99%AF%EF%BC%8C%E5%B0%A4%E5%85%B6%E6%94%AF%E6%8C%81rootless%E5%AE%B9%E5%99%A8%E5%8F%8Acgroup V2。
该项目包含go.mod定义,可克隆到任意目录,无需设置GOPATH。需使用Go 1.13或更高版本。
sh$ git clone git@github.com: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: 18808) Memory: 17.5M CPU: 184ms CGroup: /user.slice/user-1000.slice/user@1000.service/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: d38b8c28fc50a14978a27fa6afc69a55bfdd2c11 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 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务