• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > Docker 容器操作退出后进入解决办法

Docker 容器操作退出后进入解决办法

作者:小白ing 字体:[增加 减小] 来源:互联网

本文主要包含Docker,退出后进入,Docker的退出后进入详解,Docker的退出后进入解决办法等服务器相关知识,小白ing 希望可以进行参考

在我们对Docker容器操作的时候,有时候会误操作或者其他的原因无意间退出了正在操作的容器,也许你会担忧你在其中的一些操作未保存下来,无须担忧,本文中将会提供各种方法供你参考(我的建议使用最后一种)。在本文,我们将讨论五种(4+1)连接Docker容器并与其进行交互的方法。例子中所有的代码都可以在GitHub中找到,你可以亲自对它们进行测试。

1.nsenter

安装

nsenter 工具在 util-Linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。

你也可以点击此链接进行下载  http://pan.baidu.com/s/1FEt8y

$ 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-ncurses 
$ make nsenter && sudo cp nsenter /usr/local/bin 

使用

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

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz 
$ cd util-linux-2.24 
$ ./configure --without-ncurses && make nsenter 
$ sudo cp nsenter /usr/local/bin 
 

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

cd /tmp

为了连接到容器,你还需要找到容器的第一个进程的PID,通过这个PID,你就可以连接到这个容器:

$ docker inspect --format "{{ .State.Pid }}" <container-id> 
//or run 'docker inspect -f "{{ .State.Pid }}" <container-id>' 
$ nsenter --target $PID --mount --uts --ipc --net --pid 

2.nsinit

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

$ apt-get installgit 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:

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

nsinit exec /bin/bash 

3.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:

docker ps --no-trunc  

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

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

 4.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只是访问了名字空间。Jerome Petazzoni在Docker博客文章里对这一点说的很透彻。 

上面的几种方法我也曾试过,他们基本上都是进入正在运行中的容器,nsenter还可实现多终端对一个容器的操作。如果进入已经终止的容器,第一次安装执行的时候是可以的,可以得到PID的值,不过之后再执行的时候发现PID的值为0,如果你接着执行

<del>nsenter --target $PID --mount --uts --ipc --net --pid</del> 

你会发现 切换到了宿主机的超级管理员权限。

正确的方法会在下面介绍,首先先补充一下一些命令的参数的含义:

 查看镜像

    docker images: 列出images

    docker images -a :列出所有的images(包含历史)

    docker images --tree :显示镜像的所有层(layer)

    docker rmi  <image ID>: 删除一个或多个image

查看容器

    docker ps :列出当前所有正在运行的container
    docker ps -l :列出最近一次启动的container
    docker ps -a :列出所有的container(包含历史,即运行过的container)
    docker ps -q :列出最近一次运行的container ID

 5.重点来了:

$ docker ps -a 
CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS      PORTS    NAMES 
9cff554fb6d7    ubuntuold:14.04   /bin/bash      About an hour ago  Up About an hour    condescending_blackwell   
e5c5498881ed    ubuntuold:14.04   /bin/bash      About an hour ago  Exited (0) 55 minutes ago backstabbing_bardeen  


    通过以上的信息可以看出两者之间的差别:前者是正在运行的容器;而后者是已经终止的容器(Exited(0))。

    docker start/stop/restart<container> :开启/停止/重启container
    docker start [container_id] :再次运行某个container(包括历史container)
    docker attach [container_id]:连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach一个container实例)
    docker start -i <container>:启动一个container并进入交互模式(相当于先start,在attach)
 

就以后者e5c5498881ed为例:首先执行




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • kvm虚拟机的创建与克隆操作方法
  • 如何隔离docker容器中的用户的方法
  • 详解Docker目录挂载的方法总结
  • VMware Workstation如何创建加密虚拟机
  • 服务器虚拟资源分配原则如何制定?
  • Docker实践--部署Nodejs应用
  • Docker 基础网络配置详解
  • 浅谈七种常见的Hadoop和Spark项目案例
  • openstack使用openvswitch实现vxlan的方法
  • VMware esxi 5.1安装配置的方法和设置步骤图文教程

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Docker出现Cannot connect to the Docker daemon. Is the docker daemon running on this host错误解决办法
    • docker守护进程的配置和操作的方法
    • Docker 容器虚拟化的实用技巧总结
    • Docker如何添加自定义网桥
    • 详解使用Dockerfile创建带Apache服务的CentOS Docker镜像
    • 初次使用Docker的体验笔记总结
    • VirtualBox配置虚拟网卡(桥接)——实现主机-虚拟机网络互通
    • Docker 教程之Docker Hub详细介绍
    • Docker基础 :网络配置详解
    • VirtualBox安装Ubuntu Server16.04虚拟机的图文教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有