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);
        }

  

posted @ 2023-07-18 16:41  嘟嘟的园子  阅读(841)  评论(0)    收藏  举报