Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1407804
  • 博文数量: 244
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 2704
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-26 08:17
个人简介

微信公众号:杰夫弹弹看

文章分类

全部博文(244)

文章存档

2018年(4)

2017年(32)

2016年(25)

2015年(28)

2014年(27)

2013年(34)

2012年(25)

2011年(30)

2010年(39)

分类: 虚拟化

2014-10-04 12:24:30

使用Docker部署container后,我们总有类似的需求:登录到container中进行一些操作。

常见的方式
1.有ssh方式,特点是不需要特别的root权限,但是container需要安装sshd
2.使用nsenter来从container获得一个shell实现登录
3.使用nsinit

本文主要介绍nsenter的使用

nsenter使用非常方便,但是有的操作系统发行版本util-linux包比较老,所以没有包含这个nsenter,那么你需要自己编译和安装,对于hacker们来说,源码编译安装不是小case嘛,走起!

注明: 下面的命令运行以Ubuntu 14.04为例
1)下载源码
git clone git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git util-linux
cd util-linux/

2)安装依赖包(这个具体缺少的情况,会在运行./autogen.sh的提示,你也可以直接运行3),根据提示来安装对应的依赖包
sudo apt-get install libtool
sudo apt-get install automake
sudo apt-get install autopoint
sudo apt-get install libncurses5-dev

3)编译安装
./autogen.sh 
./configure & make

4)测试安装成功
./nsenter -V

5) 将nsenter加入系统环境可执行路径中
sudo cp ./nsenter /usr/bin

如何使用nsenter,非常简单,
1) 首先找到container对应的进程ID
sudo docker inspect --format "{{ .State.Pid }}"  

2) 执行nsenter获得一个shell ,假设1)获得id是4308
sudo nsenter  --target 4308 --mount --uts --ipc --net --pid

这样就进入到了container中。
好了,有的人可能会说attach不是也可以吗?为什么用这个nsenter?
个人理解两个功能是完全不一样的,attach相当于找到原始的会话shell,而原始的shell可能是一个循环程序或者web server直接在shell下运行的,这样你如果执行Ctril-C,直接导致对应的container stop,所以这不是我们期望发生的。
nsenter则是新创建的一个shell,这样就是新的会话。



参考资料:
1. Why there is no nsenter in util-linux?
  
2. 在 UOS 上体验 CoreOS
 https://www.ustack.com/blog/running-coreos-on-uos/
3. Attaching to a container with Docker 0.9 and libcontainer 
  
4.Docker shell/provisioning without SSH
 


阅读(1543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~