4.3 进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。下面分别介绍一下。
1.attach命令
attach是Docker自带的命令,命令格式为:
- docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
支持三个主要选项:
·—detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
·—no-stdin=true|false:是否关闭标准输入,默认是保持打开;
·—sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。
下面示例如何使用该命令:
- $ docker run -itd ubuntu
- 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
- nostalgic_hypatia
- $ docker attach nostalgic_hypatia
- root@243c32535da7:/#
但是使用attach命令有时候并不方便。当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2.exec命令
Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任意命令。该命令的基本格式为:
- docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged]
- [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]。
比较重要的参数有:
·-i,—interactive=true|false:打开标准输入接受用户输入命令,默认为false;
·—privileged=true|false:是否给执行命令以高权限,默认为false;
·-t,—tty=true|false:分配伪终端,默认为false;
·-u,—user="":执行命令的用户名或ID。
例如进入到刚创建的容器中,并启动一个bash:
- $ docker exec -it 243c32535da7 /bin/bash
- root@243c32535da7:/#
可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。
注意
通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
3.nsenter工具
在util-linux软件包版本2.23+中包含nsenter工具。如果系统中的util-linux包没有该命令,可以按照下面的方法从源码安装:
- $ 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
为了使用nsenter连接到容器,还需要找到容器进程的PID,可以通过下面的命令获取:
- PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通过这个PID,就可以连接到这个容器:
- $ nsenter --target $PID --mount --uts --ipc --net --pid
下面给出一个完整的例子,通过nsenter命令进入容器:
- $ docker run -idt ubuntu
- 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
- nostalgic_hypatia
- $ PID=$(docker-pid 243c32535da7)
- 10981
- $ nsenter --target 10981 --mount --uts --ipc --net --pid
- root@243c32535da7:/#
进一步可在容器中查看用户和进程信息:
- root@ce554267d7a4:/# w
- 11:07:36 up 3:14, 0 users, load average: 0.00, 0.02, 0.05
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root@ce554267d7a4:/# ps -ef
- UID PID PPID C STIME TTY TIME CMD
- root 1 0 0 10:56 ? 00:00:00 /bin/sh -c while true; do echo hello
- world; sleep 1; done
- root 699 0 0 11:07 ? 00:00:00 /bin/bash
- root 716 1 0 11:07 ? 00:00:00 sleep 1
- root 717 699 0 11:07 ? 00:00:00 ps -ef
