通过nsenter连接docker容器

通常连接Docker容器并与其进行交互有四种方法。详情见:https://github.com/berresch/Docker-Enter-Demo,下面摘录nsenter连接的方式。

  • 查看是否安装nsenter
[[email protected] ~]# whereis nsenter
nsenter: /usr/bin/nsenter /usr/share/man/man1/nsenter.1.gz

  如果没安装可创建install.sh,并执行

#!/bin/bash

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
cd .. && rm -rf util-linux-2.24
  • 方式一:创建docker-enter并置于$PATH下
#!/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
"$NSENTER" $OPTS /bin/su - root
  else
    # Use env to clear all host environment variables.
    "$NSENTER" $OPTS env --ignore-environment -- "[email protected]"
  fi
fi

  常见问题:nsenter: failed to execute su: No such file or directory

  这是由于容器中的PATH 路径问题,使用/bin/su 即可。

  • 方式二:也可以将其放在.bashrc中,就可以方便的使用了。(运行source ./bashrc不重启生效)
#docker
#export DOCKER_HOST=tcp://localhost:4243
alias docker-pid="sudo docker inspect --format ‘{{.State.Pid}}‘"
alias docker-ip="sudo docker inspect --format ‘{{ .NetworkSettings.IPAddress }}‘"

#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
    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
    [ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return

    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=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
        if [ -z "$PID" ]; then
            echo "WARN Cannot find the given container"
            return
        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.
            #sudo $NSENTER "$OPTS" su - root
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
        else
            # Use env to clear all host environment variables.
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i [email protected]
        fi
    fi
}

  执行:source ./bashrc,让修改生效。

  进入容器:

docker-enter 容器ID
时间: 2024-08-03 23:15:19

通过nsenter连接docker容器的相关文章

Docker入门实战-SSH连接docker容器

简介 什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.Redhat 已经在其 RHEL6.5 中集中支持 Docker:Google 也在其 PaaS

使用nsenter进入Docker容器

Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH.如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可.当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦. 我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器? 浏览了Docker的文档,我没有找到答案.还是要求助于无所不能的Google,万能的Google告诉我用nsenter吧. 在大多数Li

ssh连接docker容器

有两种方法: 1.通过宿主机的端口映射访问docker 在宿主机上启动容器,分配端口,启用ssh服务: docker run -p 10022:22 -d sshd:ubuntu /usr/sbin/sshd -D ssh连接: ssh 用户名@192.168.163.131 -p 10022 https://www.jb51.net/article/114048.htm 2.ssh直接访问docker 启动sshd服务 创建ssh用户admin.密码 ifconfig配置ip ssh [ema

客户端远程连接docker容器中的mysql 报1251错误

1.启动容器: [[email protected] ~]# docker run -d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql2.进入容器: [[email protected] ~]# docker exec -it 容器id bash3.进入mysql: [email protected]:/# mysql -uroot -p4.输入密码,进入到mysql界面: 5.对远程连接进行授权: mysql> GRANT ALL ON *.

工具系列 | PHPSTROM 连接Docker容器 && 配置XDEBUG调试

1.什么是docker? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 2.服务模式 C/S模式.Docker是一个客户端-服务端(c/s)的架构程序.docker是以客户端(client)和守护进程(server)来运行. 3.通信方式 Unix的socket套接字,如:unix:///var/run/docker/s

docker 容器常用命令

1 启动容器 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. 新建并启动 所需要的命令主要为 docker run 例如,下面的命令输出一个 "Hello World",之后终止容器. [[email protected] ~]# docker run docker.io/centos:v1 /bin/echo "hello wor

Docker容器进入的4种方式

原文地址:http://www.cnblogs.com/xhyan/p/6593075.html 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见的几种做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一.使用docker attach进入Docker容器 Docker提供了attach命令来进入Docker容器

如何进入docker容器

在使用docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 1.使用docker attach进入Docker容器 Docker提供了attach命令来进入Docker容器.接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器. $ sudo docker run -itd ubuntu:16.04 /bin/bash 然后我们使用docker ps查

Docker容器学习整理

一.使用Docker镜像1.1 docker常用命令1.2 创建镜像1.3 存出和载入镜像1.4 上传镜像 二.操作docker容器2.1 创建容器2.2 终止容器2.3 进入容器2.4 删除容器2.5 导入和导出容器 三.访问Docker仓库 一.docker基本管理1.1 docker常用命令1.1.1 docker images # 列出本机已有镜像1.1.2 tag命令添加镜像标签1.1.3 docker inspect 查看镜像详细信息1.1.4 history 查看镜像历史1.1.5