如何连接到一个Docker容器

108 阅读2分钟

在这一点上,我们对让容器在Docker中运行以及如何从Cli或Docker桌面监控它们已经相当熟悉。现在,我们想看看如何在docker容器运行时连接到它。连接到docker容器类似于你用SSH进入一个远程机器来执行管理任务。在Docker中,你实际上不需要SSH,因为Docker中内置了一些命令,允许你轻松地连接到运行中的容器的外壳。现在让我们看看连接到运行中的Docker容器的一些方法。


Docker容器运行-it

我们已经在之前的Docker教程中看到了docker容器运行命令。它为我们启动了一个容器。在这个过程中,我们可以从启动时就在终端连接到容器。这让我们快速讨论一下Docker选项。你可能也会看到选项被称为 "标志"。以下是我们在这个练习中感兴趣的选项。

  • -i或-interactive即使没有连接,也要保持STDIN开放。
  • -t或-tty 分配一个假的TTY

考虑到这些知识,连接到Docker容器的第一个方法是在交互式模式下运行一个新的容器。我们通过简单地输入-it,同时使用-i和-t。在命令的最后,我们指示Nginx启动一个bash shell,用 /bin/bash

$ docker container run -it --name webserver nginx /bin/bash

这就启动了Webserver容器,然后我们在容器内得到一个bash提示,如**root@6b2693e38c19:/#**提示。这意味着我们是根用户,@符号后面的字符是我们所在的容器的ID。一旦进入,我们做一个快速的 **ls -al**来查看容器的内容。

root@6b2693e38c19:/# ls -al
total 80
drwxr-xr-x   1 root root 4096 Oct  2 18:55 .
drwxr-xr-x   1 root root 4096 Oct  2 18:55 ..
-rwxr-xr-x   1 root root    0 Oct  2 18:55 .dockerenv
drwxr-xr-x   2 root root 4096 Sep  8 07:00 bin
drwxr-xr-x   2 root root 4096 Jul 10 21:04 boot
drwxr-xr-x   5 root root  360 Oct  2 18:55 dev
drwxr-xr-x   1 root root 4096 Sep 10 12:33 docker-entrypoint.d
-rwxrwxr-x   1 root root 1202 Sep 10 12:32 docker-entrypoint.sh
drwxr-xr-x   1 root root 4096 Oct  2 18:55 etc
drwxr-xr-x   2 root root 4096 Jul 10 21:04 home
drwxr-xr-x   1 root root 4096 Sep 10 12:33 lib
drwxr-xr-x   2 root root 4096 Sep  8 07:00 lib64
drwxr-xr-x   2 root root 4096 Sep  8 07:00 media
drwxr-xr-x   2 root root 4096 Sep  8 07:00 mnt
drwxr-xr-x   2 root root 4096 Sep  8 07:00 opt
dr-xr-xr-x 159 root root    0 Oct  2 18:55 proc
drwx------   2 root root 4096 Sep  8 07:00 root
drwxr-xr-x   3 root root 4096 Sep  8 07:00 run
drwxr-xr-x   2 root root 4096 Sep  8 07:00 sbin
drwxr-xr-x   2 root root 4096 Sep  8 07:00 srv
dr-xr-xr-x  11 root root    0 Oct  2 18:26 sys
drwxrwxrwt   1 root root 4096 Sep 10 12:33 tmp
drwxr-xr-x   1 root root 4096 Sep  8 07:00 usr
drwxr-xr-x   1 root root 4096 Sep  8 07:00 var
root@6b2693e38c19:/#

这显示了基于Nginx镜像的容器中的所有文件。一旦进入容器,你就可以改变配置文件,从互联网上下载文件,或者其他任何你可能从运行中的服务器的外壳上进行的普通管理任务。要离开容器中的shell,只需输入 exit.注意,由于我们对这个容器所做的只是运行bash,一旦你退出bash shell,容器就会停止运行。这是因为当你启动一个Nginx容器并覆盖运行Nginx进程的默认命令时,一旦退出shell,就没有什么东西可以让容器继续运行。换句话说,只要启动时运行的命令还在,容器就会一直运行。


Docker Container Exec -it

可能更有意义的方法是连接到一个已经在运行并且正在做正常工作的容器。因此,让我们再次启动一个新的Nginx webserver,但只是让正常的进程启动。我们不会在docker命令的后面添加任何命令。

$ docker container run --name webserver nginx

现在,容器正在运行,我们可以使用docker exec命令连接到它。

$ docker container exec -it webserver bash

我们再一次在bash提示下连接到容器。我们做一个pwd命令,可以看到我们在文件系统的根部。

root@e9108992aa35:/# pwd
/

我们甚至可以查看默认的index.html文件,如果你浏览容器的话,该文件会被提供。

root@e9108992aa35:/# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

这种方法可能是最有用和最常见的。


运行一次性命令

上面的部分使用了**-it**标志。这使得它具有交互性,并给我们一个终端来工作。通过省略-it选项,我们可以从Docker cli中运行命令,这些命令被代理到容器中,运行后,结果被打印回主机终端。为了看看这是如何工作的,我们可以重做上面的例子,同时省去-it选项。

> docker container exec webserver ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
>

我们一直在使用容器的名称来确定我们连接到哪个容器。如果你没有给你的容器命名,那么你只需用容器的id来代替命令。

> docker container exec e9108992aa35 ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

在接下来的例子中,我们可以以一次性的方式使用docker exec来查看容器中的nginx.conf文件。

> docker container exec webserver cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

总结

主要的启示是,如果你想连接到一个容器,你应该在docker container rundocker container exec中使用-it选项。当与run命令一起使用时,你将以交互方式启动一个新的容器。然而,更常见和有用的方法是在docker container exec命令中使用这个标志。