docker container 反向操作宿主机,修改宿主机IP、重启宿主机
#Docker容器反向操作宿主机
#Docker容器重启宿主机
#Docker容器修改宿主机IP
目前开发中遇到容器内应用可以反向操作宿主机,修改宿主机IP、重启、关闭宿主机的需求
网上有很多NetCore修改主机IP,代码但太过繁琐。
我选择直接修改配置文件,这样代码简洁,配置更加自由,最后重启网络服务生效。
部署环境
Centos8 + Docker 24.0.4
docker run -v /:/host --net host --privileged -d {image}:{tag}
//image:应用镜像
//tag:应用标签版本号
举例:docker run -v /:/host -v /mnt/driver/:/app/Driver/ --net host --privileged -d iotapp:2.0.5
.net core 修改主机IP方法代码
public Task<string> ExecuteConfigureNetworkShellCommand(ConfigureHostNetworkCommand command)
{
var process = new Process
{
StartInfo = new ProcessStartInfo("/bin/bash")
};
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.Start();
process.StandardInput.WriteLine("chroot /host /bin/bash");
var file = $"/etc/sysconfig/network-scripts/ifcfg-{command.Device}";
process.StandardInput.WriteLine($"echo \"TYPE=Ethernet\" > {file}");
process.StandardInput.WriteLine($"echo \"PROXY_METHOD=none\" >> {file}");
process.StandardInput.WriteLine($"echo \"BROWSER_ONLY=no\" >> {file}");
process.StandardInput.WriteLine($"echo \"BOOTPROTO=static\" >> {file}");
process.StandardInput.WriteLine($"echo \"DEFROUTE=yes\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV4_FAILURE_FATAL=no\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV6INIT=yes\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV6_AUTOCONF=yes\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV6_DEFROUTE=yes\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV6_FAILURE_FATAL=no\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPV6_ADDR_GEN_MODE=stable-privacy\" >> {file}");
process.StandardInput.WriteLine($"echo \"NAME={command.Device}\" >> {file}");
process.StandardInput.WriteLine($"echo \"UUID={command.UUID}\" >> {file}");
process.StandardInput.WriteLine($"echo \"DEVICE={command.Device}\" >> {file}");
process.StandardInput.WriteLine($"echo \"ONBOOT=yes\" >> {file}");
process.StandardInput.WriteLine($"echo \"IPADDR={command.IPAddress}\" >> {file}");
process.StandardInput.WriteLine($"echo \"NETMASK={command.Netmask}\" >> {file}");
if(!string.IsNullOrEmpty(command.Gateway))
process.StandardInput.WriteLine($"echo \"GATEWAY={command.Gateway}\" >> {file}");
if(!string.IsNullOrEmpty(command.Dns1))
process.StandardInput.WriteLine($"echo \"DNS1={command.Dns1}\" >> {file}");
if(!string.IsNullOrEmpty(command.Dns2))
process.StandardInput.WriteLine($"echo \"DNS2={command.Dns2}\" >> {file}");
//重启network服务
process.StandardInput.WriteLine("nmcli c reload");
process.StandardInput.WriteLine($"nmcli c up {command.Device}");
process.StandardInput.Close();
var cpuInfo = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Dispose();
return Task.FromResult(cpuInfo);
}
//ConfigureHostNetworkCommand 类申明
public class ConfigureHostNetworkCommand
{
public ConfigureHostNetworkCommand(string uuid, string device, string ip, string netmask, string gateway,
string dns1,
string dns2)
{
UUID = uuid;
Device = device;
IPAddress = ip;
Netmask = netmask;
Gateway = gateway;
Dns1 = dns1;
Dns2 = dns2;
}
public string UUID { get; }
public string Device { get; }
public string IPAddress { get; set; }
public string Netmask { get; }
public string Gateway { get; }
public string Dns1 { get; }
public string Dns2 { get; }
}
//重启宿主机
public Task<string> ExecuteRebootCommand(ConfigureHostNetworkCommand command)
{
var process = new Process
{
StartInfo = new ProcessStartInfo("/bin/bash")
};
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.Start();
process.StandardInput.WriteLine("chroot /host /bin/bash");
process.StandardInput.WriteLine("reboot");
process.StandardInput.Close();
var cpuInfo = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Dispose();
return Task.FromResult(cpuInfo);
}

浙公网安备 33010602011771号