• cd /tmp; curl

    | tar -zxf-; cd util-linux-2.25;

  • sudo apt-get install autopoint
    autoconf libtool automake
  • ./configure –without-python
    –disable-all-programs –enable-nsenter –without-ncurses
  • make nsenter; cp nsenter
    /usr/local/bin

使用docker-enter来进入docker容器

转自:

docker容器没起sshd服务的时候,还想进入docker如何是好,大家得以接收nsenter步向docker容器的命名空间namespace来设想登陆docker容器。
nsenter平日暗许自带了,未有的话,安装下。然后把之类这一个剧本命名成docker-enter大概别的名字,赋推行权限,归入$PATH下就能够,使用方式:docker-enter
<container-id>

登录容器的方式                       

ssh登录                                                              

第三方工具(nsenter、nsinit)                                            

                                                                 

docker提供的工具(attach、exec)

                                                        

优点                    

符合平时登录服务器习惯,不用额外学习
使用方便快捷
使用方便快捷                              
缺点
秘钥管理
ssh升级
监控
需要学习第三方工具使用规则
docker宿主机root权限
使用attach登录容器,exit退出容器
docker宿主机root权限
同屏
适用范围                      

适用docker宿主机登录至容器内部
远程登录该容器
适用docker宿主机登录至容器内部
适用docker宿主机登录至容器内部

#!/bin/sh

  • SSH
    采用方法:ssh用户@IP地址 -p 端口
    通常ssh登入走22端口,然则在docker中bridge网络形式采取NAT做端口映射,端口须求独特注解
    适用范围:docker宿主机内部登入容器,外界终端直接登入容器 
    优点:符合管理员、开采者登入服务器的习于旧贯,没有需求进行额外的读书 
    缺点:1.秘钥管理

    假定将秘钥写到镜像中,当须求更新秘钥时须要再行制作镜像,陈设,重启容器,纵然那几个手续繁杂,不过个人认为依旧安全的。如若将秘钥写到卷中,首先要作保该容器未有那么些卷的写权限,不然存在秘钥被歪曲的高风险。

    2.ssh晋级或打补丁

    ssh有漏洞依然版本进级时,须要对每四个容器进行打补丁也许进级操作

     

  • docker
    attach

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

          使用办法:docker attach  [container name]

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宿主机内部登入容器 

使用nsenter进入Docker容器

          优点:高效方便

Docker容器运维后,如何走入容器进行操作呢?发轫笔者是用SSH。假诺只运维一个器皿,用SSH仍可以够应付,只必要将容器的22端口映射到本机的叁个端口就能够。当本身起步了四个容器后,各类容器默认是未曾配备SSH
Server的,安装配置SSHD,映射容器SSH端口,实乃劳动。

          缺点**:**1.exit后向来退出该container

自家开采大多Docker镜像都以不曾设置SSHD服务的,难道有任何措施步入Docker容器?

     
               2.多屏联袂
这一定于同期最五只可以有叁个终极连接容器

浏览了Docker的文书档案,作者还未有找到答案。依然讲求助于三头六臂的Google,万能的谷歌告诉本身用nsenter吧。

图片 1

在大多数Linux发行版中,util-linux包中带有nsenter.若无,你必要安装它.

图片 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-ncurses
make nsenter
cp nsenter /usr/local/bin

  • docker exec
    运用办法
    :docker exec -it [container name]
    [command]
    适用范围:docker宿主机内部登入容器
    优点:连忙方便
    缺点:外界终端无法使用这种措施登陆容器
    动用参数介绍
    -i, –interactive               Keep STDIN open even if not
    attached ————交互 
    -t, –tty                        Allocate a pseudo-TTY————分配伪终端
    相符景观会使用-it那一个组成命令,假若单用也只可以单独使用-i命令 
    -i 参数不会时有产生伪终端,不过会有正确的回来

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

图片 3

    #!/bin/sh

    
     使用-it时,则和大家日常操作console分界面相仿。并且也不会像attach格局因为脱离,引致整个容器退出。这种方法得以代替ssh恐怕nsenter、nsinit形式,在容器内进行操作。

    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

  • nsenter工具

    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

           nsenter工具的装置:

        OPTS=”–target $PID –mount –uts –ipc –net –pid –”

           wget https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.tar.gz 

        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

           tar -xzvf
util-linux-2.28.tar.gz          

运行 docker-enter <container id> ,那样就进来到内定的容器中

           cd util-linux-2.28

          ./configure –without-ncurses

          make nsenter

          cp nsenter /usr/local/bin

          安装到位后,使用nsenter —help
命令查看,能够观察使用方法及参数则表明安装成功。

图片 4

              使用nsenter 命令登入docker 容器

图片 5

             在应用nsenter登入docker
容器时,常常选拔前6个参数(我看外人都如此写的,想了想原因,大概使用前6个参数就能够饱含互联网,磁盘,进度管理操作系统基本的音信,小编尝试只行使个中三个或多少个参数登录容器,成功精晓而操作系统成效接纳上受节制,举个例子不可能使用网络布局作用等卡塔尔国。