当前位置: 首页 > article >正文

【Docker】 进入容器的几种方式

进入正在运行的 Docker 容器有几种方法,最常用的是使用 docker exec 命令。以下是具体步骤和一些常见的用法:

使用 docker exec 进入容器

docker exec 命令允许你在运行中的容器里执行命令。要进入容器并打开一个交互式的 shell 会话,你可以这样做:

  1. 找到容器的 ID 或名称: 如果你不知道容器的 ID 或名称,可以使用 docker ps 命令来列出所有正在运行的容器。

    docker ps

    输出示例:

    CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS     NAMES
    abcdef123456   my_image       "bash"                   5 minutes ago  Up 5 minutes             my_container
  2. 使用 docker exec 打开一个交互式 shell 会话: 使用 -it 选项来启动一个交互式的终端会话,并指定要使用的 shell(如 bashsh)。

    docker exec -it <container_id_or_name> /bin/bash

    或者如果容器中没有 bash 只有 sh

    docker exec -it <container_id_or_name> /bin/sh

    例如,如果你的容器 ID 是 abcdef123456,你可以这样进入:

    docker exec -it abcdef123456 /bin/bash

    如果你的容器名称是 my_container,你可以这样进入:

     
    docker exec -it my_container /bin/bash

使用 docker attach 进入容器

docker attach 命令可以将你的终端连接到一个已经运行的容器的标准输入/输出/错误流上。这通常用于重新连接到一个之前分离的会话。

docker attach <container_id_or_name>

但是,这种方法有一些缺点:

  • 如果你在容器内退出了 shell(例如通过 exit 命令),那么整个容器也会停止。
  • 如果多个用户同时 attach 到同一个容器,他们共享同一个标准输入/输出流,可能会导致混乱。

因此,除非你需要重新连接到一个已经分离的会话,否则推荐使用 docker exec

使用 nsenter 进入容器

nsenter 是一个更底层的工具,它可以让你进入容器的命名空间。这个方法比较复杂,通常不需要手动操作,但了解它是有用的。

  1. 安装 nsenter: 如果你的系统上没有 nsenter,可以通过以下方式安装(以 Debian/Ubuntu 为例):

    sudo apt-get update
    sudo apt-get install util-linux
  2. 获取容器的 PID: 使用 docker inspect 获取容器的进程 ID (PID)。

    docker inspect --format '{{.State.Pid}}' <container_id_or_name>
  3. 使用 nsenter 进入容器: 使用 nsenter 进入容器的命名空间。

    nsenter -t <container_pid> -m -u -i -n -p

    例如,如果容器的 PID 是 12345:

    nsenter -t 12345 -m -u -i -n -p

总结

  • docker exec -it <container_id_or_name> /bin/bash:这是最常见的方法,适用于大多数情况。
  • docker attach <container_id_or_name>:适用于重新连接到一个已经分离的会话。
  • nsenter:这是一个更底层的方法,通常不需要手动操作。

选择适合你需求的方法即可。对于日常使用,docker exec 通常是最佳选择。


http://www.kler.cn/a/331635.html

相关文章:

  • RabbitMQ 路由(Routing)通讯方式详解
  • (五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建
  • Linux crontab 使用教程
  • day38-SSH安全登录
  • vue 文本域 展示的内容格式要和填写时保持一致
  • QT c++ 测控系统 一套报警规则(上)
  • 【源码+文档+调试讲解】基于微信小程序的医院医疗设备管理系统springboot
  • 【算法】---快速排序
  • gdb 调试 linux 应用程序的技巧介绍
  • jmeter学习(2)变量
  • Linux驱动开发(速记版)--设备树插件
  • spring boot jar 分离自动部署脚本
  • PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)
  • AI换脸技术新纪元:直播与视频创作的新利器
  • 在Git中操作失误,如何撤回
  • 微信小程序实战教程:轻松实现列表批量选择功能
  • 已解决:ImportError: cannot import name ‘get_column_letter‘
  • 51单片机应用开发(进阶)---数码管显示按键“加”“减”计数
  • PIKACHU | PIKACHU 靶场 XSS 后台配置
  • Web 网站服务(二):深入探索 Apache 的高级功能
  • 加油站智能视频监控预警系统(AI识别烟火打电话抽烟) Python 和 OpenCV 库
  • java版基于Spring Boot + Mybatis在线招投标|评标|竞标|单一采购|询价|邀标|在线开标|招标公告发布|评审专家|招投标采购系统源码
  • 紫光 FPGA固化RAM位置的操作流程
  • Mybatis知识
  • JAVA就业笔记2——第一阶段(2)
  • 【IDE】解决 IDEA-Maven Dependencies 中出现红色波浪线的问题