docker进入容器运行命令

前言

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

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

一、使用docker exec进入Docker容器

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

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

bash 复制代码
docker exec -it <container_id_or_name> <command>

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

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

bash 复制代码
docker exec -it mycontainer bash

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

bash 复制代码
docker exec mycontainer cat /path/to/file

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

其他命令提示说明:

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

bash 复制代码
 docker ps

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

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

bash 复制代码
docker exec -it my-container /bin/bash
  • -i 选项表示在容器中打开一个交互式会话。
  • -t 选项表示为会话分配一个伪tty。
  1. /bin/bash 命令:/bin/bash 命令在容器中启动一个 bash 会话。
  2. **提示符:**成功进入容器后,您将在命令提示符中看到 root@。这表示您现在已作为 root 用户登录到容器中。
  3. **执行命令:**您现在可以在容器内执行命令,就像在普通 Linux 系统中一样。
  4. **退出容器:**要退出容器,只需键入 exit 命令即可。

二、使用docker attach进入Docker容器

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

bash 复制代码
$ sudo docker run -itd ubuntu:xx.xx /bin/bash  

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

bash 复制代码
$ sudo docker attach container_id

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

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

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

三、使用nsenter进入Docker容器。

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

可以直接选择yum安装

bash 复制代码
$ yum install util-linux -y

也可以选择源码安装

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

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

具体的安装命令如下:

bash 复制代码
$ 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的帮助信息

bash 复制代码
 ​$ 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

bash 复制代码
 --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命令使用

bash 复制代码
$ sudo docker inspect --help  

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

bash 复制代码
$ sudo docker inspect container_id

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

bash 复制代码
$ sudo docker inspect -f {{.State.Pid}} container_id

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

bash 复制代码
$ sudo nsenter --target PID --mount --uts --ipc --net --pid  

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

语法

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

OPTIONS说明:

-f :指定返回值的模板文件。

-s :显示总的文件大小。

--type :为指定类型返回JSON。

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

命令:xx@xx:~$ docker inspect mysql:5.6

html 复制代码
[
    {
        "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 常用的命令集:

  1. docker version: 显示Docker版本
  2. docker info: 显示Docker信息
  3. docker attach: 挂载正在后台运行的容器到前台
  4. docker run: 在一个新的容器中执行命令 (Ctrl+p CTRL+q 退出至后台运行)
  5. docker ps: 列出当前容器
  6. docker images: 列出当前镜像
  7. docker logs: 显示容器的日志
  8. docker inspect: 显示镜像或容器的详细信息
  9. docker stop: 停止运行中的容器 (Ctrl+d 强制退出, exited (0)表示正常退出)
  10. docker kill: 杀掉一个运行中的容器 (exited (-1)表示异常退出)
  11. docker start: 重启停止的容器
  12. docker restart: 重启运行中的容器
  13. docker cp: 拷贝容器中的文件
  14. docker rm: 删除容器
  15. docker top: 查看容器输出
  16. docker events: 实时监听容器的事件
  17. docker history: 显示镜像的历史记录
  18. docker pull: 从远程拉取镜像
  19. docker diff: 列出镜像中文件和目录的变化
  20. docker commit: 将容器打包成新的镜像
  21. docker build: 使用Dockerfile构建新镜像
  22. docker tag: 为镜像加上标签
  23. docker load: 将tar压缩文件保存为image
  24. docker export: 把容器系统文件打包并导出来,方便分发给其他场景使用
相关推荐
GJCTYU17 分钟前
阿里云多端低代码开发平台魔笔使用测评
低代码·阿里云·云原生·容器·serverless·云计算
铁锤妹妹头发多1 小时前
新手用docker真**难受
运维·docker·容器
南猿北者10 小时前
docker容器
docker·容器
YCyjs11 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R11 小时前
K8s小白入门
云原生·容器·kubernetes
€☞扫地僧☜€15 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
全能全知者16 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
景天科技苑1 天前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge1 天前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇1 天前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决