如何连接到Docker容器

时间:2020-03-05 15:25:18  来源:igfitidea点击:

当我们想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助。
如果Docker容器无法按预期工作,则可以将其连接到该容器或者将Shell获取到该容器,然后运行“ ps”或者“ top”之类的命令。

我们还可以输入容器,安装新软件包,并从中构建新的Docker镜像。

在本教程中,我们将说明如何添加到容器的主要运行过程以及如何将shell安装到正在运行的容器中。

添加到容器

尽管可以在一个容器中运行多个进程,但大多数docker容器仅运行一个进程。
使用“ ENTRYPOINT”和/或者“ RUN”指令指定启动容器时执行的命令。

使用“ docker attach”命令,我们可以将终端连接到正在运行的容器。

当我们想实时查看标准输出中写的内容或者以交互方式控制过程时,此功能很有用。

为了更好地理解“ attach”命令的工作原理,我们使用官方的Nginx镜像运行一个新的分离的Nginx容器。

docker container run --name my_nginx -d -p 8080:80 nginx

'-p 8080:80'选项告诉Docker将容器中的端口80映射到主机上的端口8080。

列出容器以确保“ my_nginx”容器正在运行:

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
8e1c4974a8d8        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 2 seconds        0.0.0.0:8080->80/tcp   my_nginx

使用容器的ID或者名称将其添加到容器上:

docker container attach my_nginx

运行容器时执行的nginx图像的默认命令设置为'CMD [“ nginx”,“-g”,“ daemon off;”]“。
当我们运行“ attach”命令时,终端将添加到“ nginx”进程。

在浏览器中打开“ 127.0.0.1:8080”,我们可以实时观看nginx进程的输出。

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET/HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

要访问容器日志,我们应该更喜欢使用“ docker logs”命令。

要从容器中分离而不停止容器,请使用'CTRL-p''CTRL-q'组合键。
按“ CTRL-C”停止容器。

如果要添加的正在运行的进程接受输入,则可以向其发送指令。

将shell带到容器

使用“ docker exec”命令,我们可以在正在运行的容器中运行命令。

要查看“ exec”命令的工作方式以及如何使用它进入容器shell,请首先启动一个新容器。
我们将使用官方的MySQL镜像:

docker container run --name my_mysql -d mysql

这将创建一个名为“ my_mysql”的容器。

要在容器内执行命令,请运行以下命令:

docker container exec -it my_mysql ls /var

'-i'选项代表交互式,'-t'告诉Docker分配一个伪TTY设备。
“ ls”命令将列出容器的“/var”目录中的所有文件和目录:

backups  cache	lib  local  lock  log  mail  opt  run  spool  tmp

要将Shell放入容器,即进入容器内部,请通过执行Shell二进制文件来启动新的Shell会话。
我们可以使用'sh','bash'或者镜像中包含的任何其他shell。

下面的命令将在容器内创建一个新的Bash会话:

docker container exec -it my_mysql /bin/bash

命令提示符将更改,表明我们正在使用容器shell。

其中我们可以以与在其他Linux服务器上相同的方式运行命令。
例如,要获取当前环境变量的列表,请输入'env':

env

输出将如下所示:

HOSTNAME=e0214d97e0fe
MYSQL_ROOT_PASSWORD=my-secret-pw
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.17-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env