docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker进入容器运行命令

docker进入容器运行命令的使用及说明

作者:A_aspectJ项目开发

本文介绍了如何使用Docker进入容器进行调试、管理和运行命令,主要包括使用docker exec、docker attach和nsenter命令进入容器的方法,并详细介绍了docker inspect命令的使用以及如何获取容器/镜像的元数据

前言

Docker是一种流行的容器化平台,它能够快速构建、交付和运行应用程序。在使用Docker时,我们经常需要进入容器进行调试、管理和运行命令等操作。

进入 docker 容器需要执行以下步骤:打开终端窗口。使用 docker ps 命令查看正在运行的容器。使用 docker exec -it /bin/bash 命令进入容器,在容器内执行命令,使用 exit 命令退出容器。

一、使用docker exec进入Docker容器

进入 Docker 容器的步骤很简单,只需一条命令即可完成:

要在Docker容器中运行命令,您可以使用docker exec命令。这里是一个基本的例子:

docker exec -it <container_id_or_name> <command>

其中<container_id_or_name>是您想要运行命令的容器的ID或名称,<command>是您想要执行的命令。

例如,如果您想要在名为mycontainer的容器中执行bash shell,您可以使用:

docker exec -it mycontainer bash

如果您想要在容器中运行一个不需要交互的命令,比如查看容器中的某个文件,您可以直接执行:

docker exec mycontainer cat /path/to/file

这将在mycontainer容器中执行cat /path/to/file命令,并将结果直接输出到您的终端。

其他命令提示说明:

识别容器名称:使用以下命令查看正在运行的容器列表:

 docker ps

这将输出容器名称、镜像名称、启动时间等信息。

执行 exec 命令:使用 docker exec 命令进入容器。例如,要进入名为 "my-container" 的容器,可以使用以下命令:

docker exec -it my-container /bin/bash
  1. /bin/bash 命令:/bin/bash 命令在容器中启动一个 bash 会话。
  2. 提示符:成功进入容器后,您将在命令提示符中看到 root@。这表示您现在已作为 root 用户登录到容器中。
  3. 执行命令:您现在可以在容器内执行命令,就像在普通 Linux 系统中一样。
  4. 退出容器:要退出容器,只需键入 exit 命令即可。

二、使用docker attach进入Docker容器

接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。

$ sudo docker run -itd ubuntu:xx.xx /bin/bash  

 然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器

$ sudo docker attach container_id

 可以看到我们已经进入到该容器中了。但是,使用该命令有一个问题,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。

因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

通常情况下,需要查看docker容器内stdout,会使用命令 docker attach container_id 来查看容器输出.但是不知道如何退出,使用Ctrl+c直接卡死。正确的退出方式应该用一个组合键 Ctrl+p Ctrl+q 然后容器会关闭,界面也可恢复。

三、使用nsenter进入Docker容器。

nsenter是用来进入容器内部的一个命令,它的优势之处在于可以自己选择加载容器的哪些namespaces

可以直接选择yum安装

$ yum install util-linux -y

也可以选择源码安装 

系统默认将我们需要的nsenter安装到主机中

如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像)

具体的安装命令如下:

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
$ tar -xzvf util-linux-2.24.tar.gz  
$ cd util-linux-2.24/  
$ ./configure --without-ncurses  
$ make nsenter  
$ sudo cp nsenter /usr/local/bin 

 安装好nsenter之后可以查看一下该命令的使用。先使用--help查看一下nsenter的帮助信息

 ​$ nsenter --help

 用法:
  nsenter [options] <program> [<argument>...]
 ​
 Run a program with namespaces of other processes.
 ​
 选项:
  -t, --target <pid>     要获取名字空间的目标进程
  -m, --mount[=<file>]   enter mount namespace
  -u, --uts[=<file>]     enter UTS namespace (hostname etc)
  -i, --ipc[=<file>]     enter System V IPC namespace
  -n, --net[=<file>]     enter network namespace
  -p, --pid[=<file>]     enter pid namespace
  -U, --user[=<file>]    enter user namespace
  -S, --setuid <uid>     set uid in entered namespace
  -G, --setgid <gid>     set gid in entered namespace
  --preserve-credentials do not touch uids or gids
  -r, --root[=<dir>]     set the root directory
  -w, --wd[=<dir>]       set the working directory
  -F, --no-fork          执行 <程序> 前不 fork
  -Z, --follow-context   set SELinux context according to --target PID
 ​
  -h, --help     显示此帮助并退出
  -V, --version  输出版本信息并退出

 可以看到选项很多,但是大致上都是进入某个namespace

 --mount参数是进去到mount namespace中
 --uts参数是进入到uts namespace中
 --ipc参数是进入到System V IPC namaspace中
 --net参数是进入到network namespace中
 --pid参数是进入到pid namespace中
 --user参数是进入到user namespace中

nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来获取该PID。

四、docker inspect命令使用

$ sudo docker inspect --help  

 inspect命令可以分层级显示一个镜像或容器的信息。使用docker ps 查看我们当前有一个正在运行的容器,可以使用docker inspect来查看该容器的详细信息。

$ sudo docker inspect container_id

 如果要显示该容器第一个进程的PID可以使用如下方式

$ sudo docker inspect -f {{.State.Pid}} container_id

在获取到该进程PID之后我们就可以使用nsenter命令访问该容器了。

$ sudo nsenter --target PID --mount --uts --ipc --net --pid  

五、docker inspect : 获取容器/镜像的元数据。

语法

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明:

实例

获取镜像mysql:5.6的元信息。(展示部分信息)

命令:

xx@xx:~$ docker inspect mysql:5.6
[
    {
        "Id": "xx",
        "RepoTags": [
            "mysql:5.6"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "xx",
        "Container": "xx",
        "ContainerConfig": {
            "Hostname": "xx",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
...

获取正在运行的容器mysql02的 IP。

xx@xx:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql02

Docker 常用的命令集

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文