【Docker】docker容器内获取宿主机的信息和执行宿主机的脚本

思路

我们可以通过在容器内远程连接宿主机,然后对宿主机进行操作。

使用 sshpass (我的是CentOS 7.9环境)

1.安装sshpass

apt-get update //更新一下
apt-get -y install sshpass //安装 

2.连接宿主机执行命令

 sshpass -p '宿主机用户密码' ssh -o StrictHostKeyChecking=no -p 22 用户名@宿主机ip 命令
 列如:
  注意:这是在容器中运行的,查出了宿主机的ip配置信息。
  sshpass -p 'abc@1234' ssh -o StrictHostKeyChecking=no -p 22 tmsceshi@10.73.100.6 ifconfig 
  

在这里插入图片描述

3.连接执行宿主机的脚本

vim hello.sh //在宿主机建一个脚本文件

脚本内容
#!/bin/bash
echo "hello woshikunkun"

 注意:这是在容器中运行的,执行了宿主机的脚本。
  sshpass -p 'abc@1234' ssh -o StrictHostKeyChecking=no -p 22 tmsceshi@10.73.100.6 sh hello.sh

在这里插入图片描述

4.当然也可以自动化,比如:java项目部署在docker容器内,然后java项目在某一时刻执行宿主机的脚本或者宿主机的命令

注意: 要先安装 sshpass命令才行。 Dockerfile文件可以在你部署容器的时候自动安装。
docker部署springboot项目


Runtime rt = Runtime.getRuntime();

//执行 ifconfig -a 命令,查询宿主机的ip配置
String[] shell = {"/bin/bash", "-c", "sshpass -p 'abc@1234' ssh -o StrictHostKeyChecking=no -p 22 tmsceshi@10.73.100.6 ifconfig -a "};

//执行hello.sh 脚本
String[] shell = {"/bin/bash", "-c", "sshpass -p 'abc@1234' ssh -o StrictHostKeyChecking=no -p 22 tmsceshi@10.73.100.6 sh hello.sh "};
Process exec = Runtime.getRuntime().exec(shell);
BufferedReader in = null;
try {
    in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String str = null;
    String[] strArray = null;
    //逐一对每行内容进行操作
    while ((str = in.readLine()) != null) {
    	System.out.println(str);
    }
} catch (Exception e) {
    System.out.println(e);
} finally {
    in.close();
}
### 如何在Docker容器获取宿主机IP地址 为了使Docker容器能够访问其宿主机的IP地址,可以采用多种方法实现这一目标。以下是几种常见的解决方案: #### 方法一:通过环境变量传递宿主机IP地址 当启动容器时,可以通过`--env`选项向容器内部注入宿主机的IP地址作为环境变量[^3]。例如,在Linux系统上运行以下命令: ```bash docker run --rm -it \ --env HOST_IP=$(ip route show | grep ^default | awk '{print $3}') \ ubuntu bash ``` 在此示例中,宿主机默认网关(通常是外部网络接口的IP地址)会被设置为名为`HOST_IP`的环境变量。 #### 方法二:利用特殊DNS名称 `host.docker.internal` 对于Mac OS X Windows 平台上的 Docker Desktop 用户而言,官方提供了一个特殊的 DNS 名称——`host.docker.internal`,该名称始终解析到当前正在运行 Docker 的机器的 IP 地址[^1]。因此无需额外配置即可轻松连接回宿主机服务。 需要注意的是此功能仅适用于上述两种操作系统;如果是在 Linux 上部署,则需手动完成相应操作[^5]。 #### 方法三:绑定宿主机网络模式 (`--network="host"`) 另一种简单的方式就是让容器共享宿主机本身的网络栈而不是创建独立的新网络命名空间。这样做的好处在于容器可以直接使用宿主机的真实IP而不需要任何转换或代理层介入其中[^2]: ```bash docker run --rm -it --network="host" ubuntu ip addr show eth0 ``` 然而这种方法也有局限性,比如可能会破坏某些依赖于隔离性的应用程序行为逻辑等,所以在实际生产环境中应谨慎考虑是否适用这种做法[^4]。 #### 方法四:查询默认路由网关 最后一种通用的技术是从容器内部执行标准 shell 脚本来找出通往外界流量所经过的第一个跃点设备即所谓的“缺省网关”,这实际上也就是我们常说的那个虚拟桥接器(`docker0`)对应的IPv4数值形式表示出来而已: ```bash #!/bin/sh DEFAULT_GATEWAY=$(ip route | awk '/default/{print $3}') echo "$DEFAULT_GATEWAY" ``` 以上脚本片段展示了如何捕获并打印出默认网关的信息给终端用户查看。 --- ### 总结 综上所述,有四种主要途径可以帮助开发者解决从Docker容器内检索到所属物理机公网可达唯一标识符的问题。每种方式都有各自的特点以及适应场景,请根据具体需求选择最合适的方案加以实施应用。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱穿背带裤的馫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值