Docker技术入门与实战(第3版)
上QQ阅读APP看书,第一时间看更新

4.3 进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

这个时候如果需要进入容器进行操作,推荐使用官方的attach或exec命令。

1. attach命令

attach是Docker自带的命令,命令格式为:

        docker [container] 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版本起,Docker提供了一个更加方便的工具exec命令,可以在运行中容器内直接执行任意命令。

该命令的基本格式为:

        docker  [container]  exec  [-d|--detach]  [--detach-keys[=[]]]  [-i|--interactive]
            [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]

比较重要的参数有:

❑ -d, --detach:在容器中后台执行命令;

❑ --detach-keys="":指定将容器切回后台的按键;

❑ -e, --env=[]:指定环境变量列表;

❑ -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命令对容器执行操作是最为推荐的方式。

进一步地,可以在容器中查看容器中的用户和进程信息:

        root@243c32535da7:/# 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@243c32535da7:/# 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