转载

进入docker容器方法与常用命令

原文链接:https://my.oschina.net/jiangchike/blog/416691

centos安装docker: yum install docker

查看docker容器: docker ps -a

查看docker镜像: docker images

新建容器:docker run -ti 镜像名 命令如/bash/bin

运行已有容器:docker start containID

停止已有容器:docker stop containID

挂载主机文件到容器: 新建容器时 -v  主机文件夹:容器文件夹

主机上查看容器ip: docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

提交容器生成新镜像: docker commit containerID 镜像名

载入镜像:docker load 镜像文件(一般为.tar文件)

打包镜像:docker save 镜像名 > /root/debian02.tar


若新建容器时运行了/bin/bash,则退出容器会话后可使用,docker attach containerID重新回到bash命令行


四种进入容器的方法:

nsenter

从util-linux版本2.23开始,nsenter工具就包含在其中。它用来访问另一个进程的名字空间。nsenter要正常工作需要有 root权限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤:

?

1
2
cd  /tmp
curl https: //www .kernel.org /pub/linux/utils/util-linux/v2 .24 /util-linux-2 .24. tar .gz |  tar  -zxf- cd  util-linux-2.24. /configure  --without-ncursesmake nsentercp nsenter  /usr/local/bin

为了连接到容器,你还需要找到容器的第一个进程的PID。

1
docker inspect -- format  "{{ .State.Pid }}"  <container- id >

通过这个PID,你就可以连接到这个容器:

1
nsenter --target $PID -- mount  --uts --ipc --net --pid

nsinit

从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。在安装nsinit之前,你首先需要安装Go运行时环境:

1
2
3
4
apt-get  install  git golang-go
  mkdir  -p $HOME /go-dev/binmkdir  -p $HOME /go-dev/src
  echo  "export GOPATH=\$HOME/go-dev"  >> ~/.profileecho  "PATH=\$PATH:\$GOPATH/bin"  >> ~/.profile
  source  ~/.profile

接下来才安装nsinit:

1
2
3
mkdir  -p $GOPATH /src/github .com /dotcloudcd  $GOPATH /src/github .com /dotcloud
  git clone https: //github .com /dotcloud/docker .gitcd $GOPATH /src/github .com /dotcloud/docker
  /usr/bin/go  get - v  github.com /dotcloud/docker/vendor/src/github .com /docker/libcontainer/nsinit

nsinit 读取的是位于/var/lib/docer/execdriver/native/<container-id>容器目录下的配置数据。要运 行nsinit,你需要切换到容器目录下。由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过 docker的ps命令,你可以确定容器ID。一旦你进入/var/lib/docker目录,你就可以连接容器了:

1
nsinit  exec  /bin/bash

lxc(-attach)

直到Docker 0.8.1版本为止,LXC一直是管理容器的基本工具,Docker一直支持这个工具。但是从0.9.0版本开始,Docker默认使用libcontainer管理容器,不再依赖LXC了。因此默认情况下,你不能使用lxc-attach了。

如果你仍然希望使用lxc-attach,那么你需要使用-e lxc选项来重新启动Docker服务进程。使用这个选项,Docker的内部将再次使用LXC管理容器了。完成这个任务最简单的做法就是创建/etc /default/docker文件(如果这个文件仍然不存在),并添加以下内容:

DOCKER_OPTS=" -e lxc"

现在你可以重新启动Docker服务了。要连接容器,你需要知道完整的容器ID:

1
docker  ps  --no-trunc

接下来,你就可以连接这个容器了。要完成下面工作,你还需要root权限:

1
lxc-attach -n <container- id > --  /bin/bash

sshd

上面所有三种方法都要求具有主机系统的root权限。为了不采用root权限,通过ssh访问容器将是一个很好的选择。

要做到这一点,你需要构建一个支持SSH服务的基础映像。此时,我们可能遇到这样的问题:我们是不是用Docker CMD或者ENTRYPOINT运行一条命令就可以了?如果此时有sshd进程运行,那么我们就不要再运行其他进程了。接下来的工作是创建一个脚本或者使 用像supervisord这样的进程管理工具来启动其它所有需要启动的进程。有关如何使用supervisord的 优秀的文档可以在Docker的web站点上找到。一旦你启动了具有sshd进程的容器,你就可以像以往一样通过ssh客户端了连接这个容器了。

结论

sshd方法可能是最简单的连接容器的方法,而且大多数用户习惯通过ssh连接虚拟机。另外,连接容器时你也不需要一定使用root权限。不过,对 于是否一个容器是否应当管理不止一个进程仍然存在许多争议。这种方法最终使得每个容器了多了一个sshd进程,这从根本上来说不是进程虚拟化的所提倡的。

另外三种方法都需要root权限。到0.8.1版本为止,Docker都是使用LXC来管理容器的。正是由于这个原因,使用lxc-attach连 接容器就非常容易。不过从版本0.9.0开始Docker服务就必须使用 -e lxc选项启动才能在内部支持LXC管理容器。不过,由于设置了这个选项,Docker将再次依赖LXC,而LXC可能随着发布或者安装的不同可能被剔 除。

nsenter和nsinit总的来说是相同的。这两个工具的主要区别是nsinit在本身的容器了建立了一个新的进程,而nsenter只是访问了名字空间。


转载于:https://my.oschina.net/jiangchike/blog/416691

展开阅读全文
博主设置当前文章不允许评论。

没有更多推荐了,返回首页

博客模板©2019 由CSDN提供 模版主题为:skin3-template by CSDN官方博客 设计