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: 把容器系统文件打包并导出来,方便分发给其他场景使用
相关推荐
MickeyCV11 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
藥瓿亭12 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_8097983212 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣13 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞13 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技15 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
江湖有缘15 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
猫咪老师199516 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
Nazi617 小时前
docker数据管理
运维·docker·容器
孔令飞19 小时前
Go 为何天生适合云原生?
ai·云原生·容器·golang·kubernetes