查看 Docker 容器的名字空间

本文介绍了如何使用ipnetns系列命令访问Docker容器内的Linux名字空间,包括创建、查看、执行命令及重建名字空间文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明 http://blog.youkuaiyun.com/yeasy/article/details/41694797


熟悉 Linux 技术的人都知道,容器只是利用名字空间进行隔离的进程而已,Docker 在容器实现上也是利用了 Linux 自身的技术。

有时候,我们需要在宿主机上对容器内进行一些操作,当然,这种绕过 Docker 的操作方式并不推荐。

如果你使用的是比较新的 Docker 版本,会尴尬的发现,直接使用系统命令,会无法访问到容器名字空间。

这里,首先介绍下 ip netns 系列命令。这些命令负责操作系统中的网络名字空间。

首先,我们使用 add 命令创建一个临时的网络名字空间

$ip netns add test

然后,使用 show 命令来查看系统中的网络名字空间,会看到刚创建的 test 名字空间。

$ip netns show
test

另外,一个很有用的命令是 exec,会在对应名字空间内执行命令。例如

$ ip netns exec test ifconfig

使用 del 命令删除刚创建的 test 名字空间。

$ip netns del test

接下来运行一个 Docker 容器,例如

$ docker run -it ubuntu

再次执行 ip netns show命令。很遗憾,这里什么输出都没有。

原因在于,Docker 启动容器后仍然会以进程号创建新的名字空间,但在较新的版本里面,默认删除了系统中的名字空间信息文件。

网络名字空间文件位于 /var/run/netns 下面,比如我们之前创建的 test 名字空间,则在这个目录下有一个 test 文件。诸如 netns 类似的系统命令依靠这些文件才能获得名字空间的信息。

在容器启动后,查看这个目录,会发现什么都没有。

OK,那让我们手动重建它。

首先,使用下面的命令查看容器进程信息,比如这里的 1234

$ docker inspect --format='{{. State.Pid}} ' $container_id
1234

接下来,在 /proc 目录(保存进程的所有相关信息)下,把对应的网络名字空间文件链接到 /var/run/netns 下面

$ ln -s /proc/1234/ns/net /var/run/netns/1234

然后,就可以通过正常的系统命令来查看或访问容器的名字空间了。例如

$ip netns show
1234
$ ip netns exec 1234 ifconfig eth0 172.16.0.10/16...

### 如何远程连接和管理Docker容器 #### 使用 VS Code 远程连接 Docker 容器 通过 Visual Studio Code (VS Code),可以方便地实现对远程服务器上 Docker 容器的操作与管理。以下是具体流程: 1. **安装必要插件** 首先需要在 VS Code 中安装两个主要的扩展:`Docker` 和 `Remote - Containers` 插件[^1]。 2. **查看远程服务器上的 Docker 资源** 安装完成之后,可以在左侧工具栏找到 Docker 图标。点击该图标后会显示当前已连接服务器上的所有可用镜像和容器列表[^2]。 3. **附着至目标容器** 在展示出来的容器列表里选择想要操作的目标容器,并右键菜单选项中选取“Attach to Container...”功能项来建立链接关系;或者也可以直接双击某个特定条目触发相同动作[^1]。如果遇到权限提示,则需提供相应认证信息(如 SSH 密码或其他形式的身份验证数据)才能继续执行下一步骤。 4. **打开工作区文件夹** 成功接入指定容器内部环境以后,建议进一步选定具体的项目路径作为默认的工作区域。这样做的好处在于能够确保本地所做的任何改动都会实时反映到远端实例之中[^1]。 5. **调试支持** 对于某些高级场景而言,可能还需要额外配置断点设置或者其他类型的开发者辅助特性以满足更复杂的业务需求[^1]。 6. **重载窗口** 当完成了初始设定或是进行了涉及全局范围的重大修改时,请记得利用快捷组合键 Ctrl+Shift+P 或者 Command+Shift+P 唤醒命令面板并输入 "Reload Window" 来刷新整个界面状态从而应用最新的调整成果[^2]。 #### 创建自定义 Docker 容器示例 除了上述基于现有容器的方法外,还可以手动构建新的容器来进行测试或生产用途。下面给出了一种典型创建过程的例子: ```bash docker run -itd \ -p 10008:10008 \ -v /dev/shm:/dev/shm \ --name huawei \ --runtime=nvidia \ swr.cn-south-1.myhuaweicloud.com/mindspore/mindspore-gpu-cuda11.1:1.10.1 \ /bin/bash ``` 此脚本片段展示了如何启动一个名为 'huawei' 的新容器,并将其绑定到宿主机的第 10008 号端口之上,同时还启用了 NVIDIA GPU 加速等功能模块[^3]。 #### Kubernetes 下 Kubectl 工具的应用 对于那些采用 Kubernetes 编排引擎的企业级解决方案来说,kubectl 是不可或缺的一个强大命令行实用程序。它允许管理员轻松管理和监控分布在集群节点间的众多 Pod 实体及其附属组件的状态变化情况。例如,要进入命名空间下的特定 pod 内部运行 bash shell session ,可以参照如下格式发出请求: ```bash kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- bash ``` 这里需要注意替换占位符 `<pod-name>` , `<container-name>` 和 `<namespace>` 分别代表实际对象的名字字符串值[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值