在Docker容器中使用libvirt遇到连接问题的技术求助
解决步骤
1. 手动启动libvirtd守护进程
容器默认以bash作为PID 1,无法通过systemd管理服务,直接手动启动libvirtd后台进程:
libvirtd --daemon
启动后验证套接字是否生成:
ls /var/run/libvirt/libvirt-sock
2. 调整容器启动参数
除--privileged外,需要添加KVM设备访问、网络设备映射,可选共享宿主机libvirt套接字目录,完整启动命令:
sudo docker run -i --privileged -t --rm \ --device /dev/kvm \ --device /dev/net/tun \ -v /var/run/libvirt:/var/run/libvirt \ foo /bin/bash
--device /dev/kvm:让容器获取宿主机KVM虚拟化能力,是运行虚拟机的核心前提--device /dev/net/tun:支持TUN/TAP网络设备,满足虚拟机网络需求-v /var/run/libvirt:/var/run/libvirt:共享宿主机libvirt套接字(可选,若需复用宿主机libvirt资源则添加)
3. 配置容器内libvirt网络(按需操作)
若虚拟机需要联网,启动libvirtd后创建默认网络:
virsh net-define /usr/share/libvirt/networks/default.xml virsh net-start default virsh net-autostart default
也可替换为自定义的网络XML文件。
4. 验证并启动虚拟机
先确认virsh连接正常:
virsh uri
正常输出应为qemu:///system,随后定义并启动虚拟机:
virsh define /your-domain.xml virsh start your-vm-name
5. 优化Dockerfile(可选)
添加启动脚本自动启动libvirtd,避免每次手动操作:
修改后的Dockerfile
FROM ubuntu:18.04 RUN apt-get update -qy \ && apt-get upgrade -qy \ && apt-get install -y \ bridge-utils \ iproute2 \ python3-ipy \ socat \ qemu-kvm \ libvirt-daemon-system \ libvirt-clients \ virtinst \ bridge-utils \ iptables \ iproute2 \ dnsmasq \ vim \ && rm -rf /var/lib/apt/lists/* COPY *.qcow2 / COPY *.xml / COPY start-libvirt.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start-libvirt.sh CMD ["/usr/local/bin/start-libvirt.sh"]
start-libvirt.sh脚本内容
#!/bin/bash libvirtd --daemon exec bash
内容的提问来源于stack exchange,提问作者aaries
相关产品推荐
相关产品推荐

