在历时3天,无数次重装服务器后,终于探索出了一种在无嵌套虚拟化支持的条件下通过docker搭建虚拟化小鸡的方案。
一、构建 docker 镜像
本例中使用centos:centos7 版本的镜像作为范例,其它操作系统类似,自行参考
1.从 docker hub 中拉取镜像
docker pull centos:centos7
2.使用拉取的官方镜像创建一个容器
docker run -itd --privileged=true --name="<容器的名称>" centos:centos7 /usr/sbin/init
请注意 , 一定要添加 --privileged=true 这个选项,同时 容器启动后执行的 命令必须是 /usr/sbin/init , 否则会出现 systemctl 报错 ,无法挂载磁盘等问题
3.进入容器中安装一些基本的工具,并设置root 密码
1.查看当前容器的id(container-id)
docker ps
2.进入容器,设置root密码,安装一下必要的组件
docker exec -it /bin/bash
在容器中执行
yum install -y net-tools iproute openssh-server sudo
sudo -i
passwd
<输入root密码>
<重复root密码>
exit
exit
3.commit 容器,并push 到仓库中,或导出成 tar 文件
二、实例化 docker 容器
1.创建docker bridge 网段(仅第一次)
docker network create --driver bridge --subnet <x.x.x.x/x(子网)> --gateway <x.x.x.x(网关)>
2.实例化容器
需固定容器的ip,且以root 权限运行,并执行的/usr/sbin/init
docker run -itd --privileged=true --network --ip <容器的虚拟ip> --name="<容器的名称>" /usr/sbin/init
三、使用firewalld 进行 IP 转发(核心)
1.关闭 selinux
2.开启 ip 转发功能
3.将ISP 提供的富裕IP 添加到 网卡上
4.使用firewall-cmd 实现端口转发
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A PREROUTING -d <外网ip> -j DNAT --to-destination
firewall-cmd --reload
注:1.可通过下述命令查询 firewall 的流量透传规则(可参阅本文查询 firewall 的命令 ps:这是我目前发现的最全最好的firewall-cmd 文档)
firewall-cmd --permanent --direct --get-all-passthroughs
2.可通过这条命令删除 流量透传
firewall-cmd --permanent --direct --remove-passthrough
附录
1.实例化的新的docker 容器 , 出现 unknow host
修改系统的 resolv.conf
rm -rf /etc/resolv.conf
# 国内
echo -e "nameserver 223.5.5.5\nnameserver 119.29.29.29" >> /etc/resolv.conf
# 国外
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" >> /etc/resolv.conf
2.自己封装的 宝塔[lnmp] docker 镜像
sudemqaq/centos_btpanel
3.自己封装的 centos 7.9.2009.1 镜像
sudemqaq/centos_mini
4.如何快速安装docker
#国内
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#国外
curl -fsSL https://get.docker.com | bash -s docker