使用docker-enter及nsenter来进入docker容器

使用docker-enter来进入docker容器

docker容器没起sshd服务的时候,还想进入docker怎么办,我们可以使用nsenter进入docker容器的命名空间namespace来虚拟登入docker容器。
nsenter一般默认自带了,没有的话,安装下。然后把如下这个脚本命名成docker-enter或者别的名字,赋执行权限,放入$PATH下即可,使用方式:docker-enter <container-id>

#!/bin/sh

if [ -e $(dirname "$0")/nsenter ]; then
    # with boot2docker, nsenter is not in the PATH but it is in the same folder
    NSENTER=$(dirname "$0")/nsenter
else
    NSENTER=nsenter
fi

if [ -z "$1" ]; then
    echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
    echo ""
    echo "Enters the Docker CONTAINER and executes the specified COMMAND."
    echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
    PID=$(docker inspect --format "{{.State.Pid}}" "$1")
    if [ -z "$PID" ]; then
      exit 1
    fi
    shift
    OPTS="--target $PID --mount --uts --ipc --net --pid --"
    if [ -z "$1" ]; then
      # No command given.
      # Use su to clear all host environment variables except for TERM,
      # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
      # and start a login shell.
      "$NSENTER" $OPTS su - root
    else
      # Use env to clear all host environment variables.
      "$NSENTER" $OPTS env --ignore-environment -- "$@"
    fi
fi

使用nsenter进入Docker容器

Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。

我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器?

浏览了Docker的文档,我没有找到答案。还是要求助于无所不能的Google,万能的Google告诉我用nsenter吧。

在大多数Linux发行版中,util-linux包中含有nsenter.如果没有,你需要安装它.

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
cp nsenter /usr/local/bin

使用shell脚本 docker-enter,将如下代码保存为docker-enter, chomod +x docker-enter

    #!/bin/sh

    if [ -e $(dirname "$0")/nsenter ]; then
        # with boot2docker, nsenter is not in the PATH but it is in the same folder
        NSENTER=$(dirname "$0")/nsenter
    else
        NSENTER=nsenter
    fi

    if [ -z "$1" ]; then
        echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
        echo ""
        echo "Enters the Docker CONTAINER and executes the specified COMMAND."
        echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
    else
        PID=$(docker inspect --format "{{.State.Pid}}" "$1")
        if [ -z "$PID" ]; then
            exit 1
        fi
        shift

        OPTS="--target $PID --mount --uts --ipc --net --pid --"

        if [ -z "$1" ]; then
            # No command given.
            # Use su to clear all host environment variables except for TERM,
            # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
            # and start a login shell.
            "$NSENTER" $OPTS su - root
        else
            # Use env to clear all host environment variables.
            "$NSENTER" $OPTS env --ignore-environment -- "$@"
        fi
    fi

运行 docker-enter <container id> ,这样就进入到指定的容器中

时间: 2024-09-20 06:39:16

使用docker-enter及nsenter来进入docker容器的相关文章

docker如何ssh连上自己的容器,一定要用ssh连么?

问题描述 docker如何ssh连上自己的容器,一定要用ssh连么? 解决方案 本帖最后由 weimochengxi 于 2014-08-27 09:19:46 编辑解决方案二:B:下午才看到一篇文章说容器最好不要用ssh这篇http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/CentOS6.5制作可以ssh登录的Docker看参考这篇http://my.oschina.net/feedao/blog/223795C:n

Ubuntu下用docker安装redis镜像和使用redis容器分享

Ubuntu下用docker安装redis镜像和使用redis容器分享   1. 安装Ubuntu 2. 用Putty登录Ubuntu Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-40-generic x86_64)  * Documentation:  https://help.ubuntu.com/   System information as of Wed Dec 31 06:41:16 UTC 2014   System load: 

Docker基础:查找镜像和运行容器

本文讲的是Docker基础:查找镜像和运行容器[编者的话]本文是作者学习Docker的笔记,涉及在Windows上的安装,介绍了镜像和容器的知识和基本操作,适合Docker初学者. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.Kubernetes Storage机制.容器网络实现原理和模型.Docker网络实现.网络插件.Calico.Cont

Docker常见故障排查指南 - 阿里云容器服务

对于Docker的初学者而言,当容器或应用出现了问题不知从何入手进行排查.为此,我们准备了一个简单指南来帮助阿里云容器服务的用户进行故障排查. 由于阿里云容器服务完全兼容Docker Swarm,并支持使用原生Docker Client/API,所以很多内容对于 Docker/Docker Swarm的用户也是适用的. Docker问题分类 我们可以把Docker在使用中的问题分为如下几类, 安装故障:Docker Engine 无法正常配置使用 应用故障:应用执行状态与预期不一致 容器故障:无

《循序渐进学Docker》——第2章 初步体验 Docker 2.1 Windows下安装Docker

第2章 初步体验Docker 上一章概括性地介绍了Docker的发展历史.组织结构.功能特性和使用场景等方面的内容.本章主要从实践的角度,介绍如何在本地搭建一个Docker运行环境. 由于大多数用户的个人电脑用的都是Windows系统,所以我们就先来讲讲在Windows环境下如何安装和运行Docker. 2.1 Windows下安装Docker 为了运行Docker,你的电脑必须安装64位Windows 7及以上版本的系统(包含Windows 8/8.1和Windows 10).另外,你要确保C

docker如何创建一个运行后台进程的容器并同时提供shell终端

只看标题还不是很明显,本文实现docker的这样一种比较常用的功能:通过docker run启动一个容器后,容器中已经运行了一个后台进程(这里以监听80端口的nginx为例),同时进入一个shell终端可供操作,而不受限于只能在前台运行nginx与运行shell终端之间的一种.这个例子实现了,那么其他类似的运行多任务docker就可以以此类推.另外本文还提供了一种在docker容器内部安装软件(vim)的方法,对于定制自己需要的镜像大有帮助. 你可能需要先阅读docker专题(2):docker

在Hyper-V的Docker主机上使用Visual Studio Docker工具

本文讲的是在Hyper-V的Docker主机上使用Visual Studio Docker工具[编者的话]本文主要介绍了在Windows下使用Hyper-V和Visual Studio来进行容器化的实践,及遇到的问题和相应解决方法. 在过去的几周,我一直在研究使用Visual Studio的Docker工具来将ASP.NET核心应用容器化.这使得你可以在Docker容器内本地开发和调试应用.为了实现这个目标,你需要一个本地的Docker主机.虽然你可以向IT部门申请提供一个,但是发现在我笔记本上

【Docker官方文档】理解Docker

本文讲的是[Docker官方文档]理解Docker,[编者的话]本文来自Docker的官方文档,详细介绍了Docker的体系结构.重要概念.内部工作机理等内容,推荐不了解Docker内部原理的同学阅读. 什么是Docker? Docker是一个用于开发.交付和运行应用的开放平台,Docker设计用来更快的交付你的应用程序.Docker可以将你的应用程序和基础设施层隔离,并且还可以将你的基础设施当作程序一样进行管理.Docker可以帮助你更块地打包你代码.测试以及部署,并且也可以减少从编写代码到部

在阿里云上体验Docker 1.12的路由能力和容器应用分发部署

阿里云容器服务团队将为大家奉献一系列深入学习的文章来帮助大家了解Docker 1.12的最新动态. 第一部分:在阿里云上体验Docker 1.12内置的编排能力 第二部分:在阿里云上体验Docker 1.12的路由能力和容器应用分发部署 (本文) 简述 Docker 1.12除了提供内置的编排能力,也提供了服务路由支持 routing mesh,和新的多容器应用分发和部署机制. 这里我们先介绍两个概念 分布式应用打包 (Distributed Application Bundle,简称DAB):

Docker入门教程(四)Docker Registry

本文讲的是Docker入门教程(四)Docker Registry,[编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它是Docker中的重要组件.本文通过情景演绎的方式对其进行了介绍,图文并茂,强烈推荐读者阅读. 在Docker系列教程的上一篇文章中,我们讨论了Dockerfile的重要性并提供了一系列Dockerfile的命令,使镜像的自动构建更加容易.在这篇文章中,我们将介绍Docker的一个重要组件