Docker 进入容器并运行命令的方法

目录

 

理解 Docker 容器的基本概念

使用 docker exec 进入运行中的容器

基本用法

常用选项解析

选项详解

实际案例演示

1. 进入容器的交互式 Shell

2. 在容器中运行单个命令

3. 以指定用户运行命令

4. 设置环境变量并运行命令

5. 指定工作目录

使用 docker attach 附加到容器

docker attach 与 docker exec 的区别

使用场景及注意事项

示例

附加到容器

分离容器而不终止

使用 nsenter 命令进入容器

什么是 nsenter

使用步骤

1. 获取容器的 PID

2. 使用 nsenter 进入容器

3. 简化操作

通过 SSH 进入容器

配置 SSH 服务

1. 安装 SSH 服务

2. 配置 SSH

3. 暴露端口

安全性考虑

进入停止状态的容器

使用 docker commit 创建新镜像

1. 提交镜像

2. 启动新容器

使用 docker export 和 docker import

1. 导出容器文件系统

2. 导入为新镜像

3. 启动新容器

常见问题及解决方案

无法进入容器的常见原因

1. 容器已经停止

2. 容器内缺少必要的 Shell

容器中命令不可用的处理

1. 缺少必要的工具

2. 文件系统为只读

总结

参考资料


 

Docker 已经成为现代软件开发和部署的核心工具,它提供了一种轻量级的方式来运行和管理容器化应用程序。在日常使用中,开发者和运维人员经常需要进入容器内部进行调试、查看日志、运行命令等操作。本文将深入探讨各种进入 Docker 容器并运行命令的方法,包括基本命令、进阶技巧以及常见问题的解决方案,力求全面覆盖相关知识点。


理解 Docker 容器的基本概念

在深入探讨如何进入 Docker 容器之前,有必要对 Docker 容器的基本概念有一个清晰的理解。Docker 容器是运行在 Docker 引擎上的一个隔离的进程环境,它包含了应用程序及其所有依赖项。

Docker 容器的特点:

  • 轻量级:共享主机的内核,启动速度快,占用资源少。
  • 可移植性:容器化的应用可以在任何安装了 Docker 的机器上运行。
  • 隔离性:通过命名空间和控制组,实现进程和资源的隔离。

理解这些特点有助于我们更好地掌握如何与容器进行交互。


使用 docker exec 进入运行中的容器

docker exec 命令是进入运行中的 Docker 容器并在其中执行命令的主要方式。它允许我们在容器内启动一个新的进程,这对于调试和管理容器非常有用。

基本用法

 
docker exec [选项] <容器ID或名称> <命令>

 

常用选项解析

选项描述
-i保持标准输入打开,即使没有附加(attach)
-t分配一个伪终端(tty)
-d分离模式下运行命令
-u, --user以指定用户运行命令
-e, --env设置环境变量
-w, --workdir指定工作目录
--privileged授予扩展权限
--detach-keys覆盖容器的分离键序列

选项详解

  • -i-t

    这两个选项通常一起使用,-i 选项让容器的标准输入保持打开状态,-t 选项为容器分配一个伪终端。这使得我们可以与容器内的进程进行交互。

  • -d

    在后台运行命令,不会附加到容器的控制台。这对于在容器中运行后台任务很有用。

  • -u

    指定在容器内运行命令的用户,可以是用户名或 UID。例如,-u root 表示以 root 用户身份运行。

  • -e

    设置环境变量,可以多次使用该选项来设置多个环境变量。

  • -w

    设置容器内的工作目录,类似于在命令行中使用 cd 切换目录。

实际案例演示

1. 进入容器的交互式 Shell

 
docker exec -it <容器ID或名称> /bin/bash

 

如果容器的基础镜像是基于 Debian 或 Ubuntu,那么 /bin/bash 通常可用。如果是基于 Alpine,则需要使用 /bin/sh

示例:

 
docker exec -it my_container /bin/bash

 

2. 在容器中运行单个命令

 
https://store.steampowered.com/

这将在容器内的 /app 目录下列出文件,但不会进入交互式 Shell。

3. 以指定用户运行命令

docker exec -u www-data -it <容器ID或名称> /bin/bash

www-data 用户的身份进入容器的 Shell。

4. 设置环境变量并运行命令

docker exec -e ENV_VAR=value -it <容器ID或名称> /bin/bash

在容器内设置环境变量 ENV_VAR,然后进入 Shell。

5. 指定工作目录

docker exec -w /app -it <容器ID或名称> /bin/bash

进入容器后,当前目录为 /app


使用 docker attach 附加到容器

docker attach 命令用于附加到一个已经运行的容器的主进程上,与 docker exec 不同,它不会创建新的进程。

docker attachdocker exec 的区别

特性docker execdocker attach
是否创建新进程
是否需要指定命令
是否附加到主进程否,创建并附加到新进程是,附加到容器的主进程
多个会话支持可以创建多个独立的会话会共享同一个标准输入/输出
主要用途在容器内运行新命令或启动新 Shell查看容器主进程的输出或进行交互

使用场景及注意事项

  • 查看容器主进程的输出

    如果容器的主进程是一个交互式应用程序,如 redis-cli,可以使用 docker attach 进行交互。

  • 注意输入冲突

    多个会话同时使用 docker attach 附加到同一个容器时,输入会发生冲突,所有会话共享同一个标准输入。

  • 分离容器

    使用 Ctrl + PCtrl + Q 可以安全地从容器分离,而不终止容器。

示例

附加到容器

docker attach <容器ID或名称>

分离容器而不终止

在附加到容器的会话中,按下 Ctrl + P,然后按 Ctrl + Q,即可分离。


使用 nsenter 命令进入容器

nsenter 是 Linux 下的一个工具,可以让我们进入另一个进程的命名空间。Docker 容器的隔离性是通过命名空间实现的,使用 nsenter 可以直接进入容器的命名空间。

什么是 nsenter

nsenter 命令允许我们进入指定的命名空间,例如进程、网络、IPC、UTS、用户和挂载命名空间。

使用步骤

1. 获取容器的 PID

首先,需要获取容器在宿主机上的进程 ID。

docker inspect --format "{{ .State.Pid }}" <容器ID或名称>

示例:

CONTAINER_PID=$(docker inspect --format "{{ .State.Pid }}" my_container)

2. 使用 nsenter 进入容器

nsenter -t $CONTAINER_PID -n -m -u -i -p /bin/bash

选项解析:

  • -t:指定目标进程的 PID。
  • -n:进入网络命名空间。
  • -m:进入挂载命名空间。
  • -u:进入 UTS 命名空间(主机名和域名)。
  • -i:进入 IPC 命名空间。
  • -p:进入 PID 命名空间。

3. 简化操作

可以编写一个脚本或函数来简化上述操作。

示例脚本:

docker-enter() {CONTAINER_PID=$(docker inspect --format "{{ .State.Pid }}" $1)nsenter -t $CONTAINER_PID -n -m -u -i -p /bin/bash
}

然后使用:

 

docker-enter my_container


通过 SSH 进入容器

尽管 Docker 的设计初衷是不在容器内运行 SSH 服务,而是使用 docker exec 等命令,但某些情况下,可能需要通过 SSH 进入容器。

配置 SSH 服务

1. 安装 SSH 服务

在容器内安装 SSH 服务,例如 OpenSSH。

apt-get update && apt-get install -y openssh-server

2. 配置 SSH

  • 生成主机密钥:

    ssh-keygen -A
    
  • 设置 root 密码:

     

    echo 'root:password' | chpasswd

  • 启动 SSH 服务:

     

    /usr/sbin/sshd

3. 暴露端口

在启动容器时,映射 SSH 服务的端口。

docker run -d -p 2222:22 my_ssh_image

安全性考虑

  • 增加攻击面

    在容器内运行 SSH 服务会增加安全风险,因为它为潜在的攻击者提供了额外的入口点。

  • 最佳实践

    • 尽可能使用 docker exec 代替 SSH。
    • 如果必须使用 SSH,确保使用强密码或密钥认证。
    • 限制 SSH 的监听地址,仅允许内部网络访问。

进入停止状态的容器

有时候,容器已经停止运行,但我们需要查看其中的文件或配置。因为容器已经停止,无法直接进入,这里介绍几种方法来处理这种情况。

使用 docker commit 创建新镜像

将停止的容器提交为一个新镜像,然后基于该镜像启动一个新的容器。

1. 提交镜像

docker commit <容器ID或名称> new_image_name

2. 启动新容器

docker run -it new_image_name /bin/bash

使用 docker exportdocker import

导出容器的文件系统,然后重新导入为新镜像。

1. 导出容器文件系统

docker export <容器ID或名称> -o container.tar

2. 导入为新镜像

docker import container.tar new_image_name

3. 启动新容器

docker run -it new_image_name /bin/bash

常见问题及解决方案

无法进入容器的常见原因

1. 容器已经停止

如果容器已经停止,docker execdocker attach 都无法进入容器。

解决方案:

  • 使用 docker start 启动容器。
  • 使用 docker commitdocker export 创建新镜像。

2. 容器内缺少必要的 Shell

有些轻量级的基础镜像(如 alpine)可能没有 /bin/bash,只有 /bin/sh

解决方案:

  • 使用 /bin/sh 进入容器:

    docker exec -it <容器ID或名称> /bin/sh
    

容器中命令不可用的处理

1. 缺少必要的工具

容器内可能缺少某些命令或工具,如 viping 等。

解决方案:

  • 使用包管理器安装所需工具。

    Debian/Ubuntu:

    apt-get update && apt-get install -y vim
    

    Alpine:

    apk update && apk add vim
    

2. 文件系统为只读

某些容器可能以只读模式运行,无法安装新软件。

解决方案:

  • 重新启动容器,移除只读限制。

    docker run -it --read-only=false <镜像名称> /bin/bash
    

总结

掌握如何进入 Docker 容器并在其中运行命令是日常开发和运维工作中必不可少的技能。本文详细介绍了多种进入容器的方法,包括 docker execdocker attachnsenter、通过 SSH 进入容器,以及处理停止状态容器的方法。还讨论了常见问题及解决方案。

以下是各种方法的对比总结:

方法适用场景是否创建新进程是否需要容器运行
docker exec在运行中的容器内执行新命令或进入交互式 Shell
docker attach附加到容器的主进程,查看输出或进行交互
nsenter需要深入容器命名空间,或在特殊情况下使用
通过 SSH 进入容器特殊需求下的远程登录,但不推荐
docker commit + 新容器处理停止状态的容器,查看文件系统否(创建新容器)
docker export + 导入处理停止状态的容器,备份或迁移否(创建新镜像)

最佳实践:

  • 优先使用 docker exec

    它是进入运行中容器的最安全、最便捷的方法。

  • 避免在容器内运行 SSH 服务

    这与 Docker 的设计理念不符,增加了安全风险。

  • 熟悉基础镜像的特点

    根据镜像类型选择正确的 Shell,如 /bin/bash/bin/sh

  • 处理停止的容器

    通过提交镜像或导出文件系统来查看或恢复数据。

希望本文能帮助您更深入地理解 Docker 容器的操作,提高工作效率。在实际工作中,根据具体情况选择最合适的方法。

914063483fce4c9bb2baa3a1de47f4b3.jpeg

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1539597.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机安装xubuntu

新建一个新的虚拟机&#xff0c;选择自定义安装 默认下一步 选择稍后安装操作系统 选择所要创建的系统及版本 填写虚拟机的名称及创建的虚拟机保存的位置 选择处理器和内核的数量 处理器数量指的是&#xff1a;虚拟的CPU数量。 每个处理器的内核数量指的是&#xff1a;虚拟CPU…

智能BI项目第四期

开发图表管理功能 规划思路 首先需要做一个列表页。后端已经在星球提供了一个基础的万能项目模板&#xff0c;包含增删改查接口&#xff0c;我们只需要在此基础上进行定制化开发即可。所以本期后端的开发量不多&#xff0c;只需要复用即可&#xff0c;主要是前端。 规划功能…

Ubuntu20.04 搜索不到任何蓝牙设备

电脑信息 联想扬天YangTianT4900k 问题描述 打开蓝牙之后&#xff0c;一直转圈&#xff0c;搜索不到任何蓝牙设备 排查 dmesg | grep -i blue 有如下错误&#xff1a; Bluetooth: hci0: RTL: unknown IC info, lmp subver 8852, hci rev 000b, hci ver 000b lsusb 芯片型号如…

基于springboot+vue图书管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

C语言菜鸟入门·各种typedef用法超详细解析

目录 1. 什么是typedef 2. typedef的用法 2.1 对于数据类型的重定义 2.2 对于函数的重定义 2.3 对于指针的重定义 2.4 对于数组指针的重定义 2.5 对于指针数组的重定义 2.6 对于结构体的重定义&#xff08;typedef struct&#xff09; 2.6.1 对结构体起别名 …

2.4 数据库表字段约束

一、数据库三大范式 我们构造数据库的时候必须要遵守一定的原则&#xff0c;那这个规则就是范式关系型数据库&#xff0c;一共有六种范式&#xff0c;一般情况下只需要满足第三范式即可。 ​第一范式&#xff1a;原子性构造数据库必须遵循一定的规则&#xff0c;这种规则就是…

语音识别与语音控制的原理介绍

硬件平台 机器硬件&#xff1a;OriginBot(导航版/视觉版)PC主机&#xff1a;Windows&#xff08;>10&#xff09;/Ubuntu(>20.04)扩展硬件&#xff1a;X3语音版 运行案例 首先进入OriginBot主控系统&#xff0c;运行一下指令。请注意&#xff0c;部分操作OriginBot内暂…

深度学习笔记(8)预训练模型

深度学习笔记&#xff08;8&#xff09;预训练模型 文章目录 深度学习笔记&#xff08;8&#xff09;预训练模型一、预训练模型构建一、微调模型&#xff0c;训练自己的数据1.导入数据集2.数据集处理方法3.完形填空训练 使用分词器将文本转换为模型的输入格式参数 return_tenso…

docker从容器提取镜像并上传至dockerhub

一、使用commit从容器中提取镜像 例如 //docker commit 容器名 想要创建的镜像名:版本号 docker commit epsilon_planner epsilon_planner:latest导出完成后镜像如图所示 二、登陆dockerhub并创建仓库 登陆dockerhub&#xff0c;点击Create repository创建仓库&#xff0c…

【机器学习(八)】分类和回归任务-因子分解机(Factorization Machines,FM)-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09; FM表达式&#xff08;二&#xff09;时间复杂度&#xff08;三&#xff09;回归和分类 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、FM分类任务实现对比&#xff08;一&…

【ShuQiHere】 探索数据挖掘的世界:从概念到应用

&#x1f310; 【ShuQiHere】 数据挖掘&#xff08;Data Mining, DM&#xff09; 是一种从大型数据集中提取有用信息的技术&#xff0c;无论是在商业分析、金融预测&#xff0c;还是医学研究中&#xff0c;数据挖掘都扮演着至关重要的角色。本文将带您深入了解数据挖掘的核心概…

机械设备产品资料方案介绍小程序系统开发制作

设备产品资料介绍小程序系统&#xff0c;是一家工业机械设备生产厂家为了更好的服务客户而定制开发的一套小程序系统&#xff0c;让用户通过小程序就可以了解公司产品介绍的详细参数、售后服务和产品操作手持等。 该小程序系统里面主要开发的功能模块有&#xff1a; 1、产品目…

智慧课堂学生行为数据集

智慧校园数据集合集概述 智慧校园旨在通过整合先进的信息技术来提升教育环境的安全性、效率以及互动性。一个关键组成部分是利用计算机视觉技术对校园内的各种活动进行监控与分析。为此&#xff0c;构建了一个全面的数据集合集&#xff0c;包含了密集行人、头部检测、抽烟行为…

一个手机号注册3个抖音号的绿色方法?一个人注册多个抖音号的方法!

下面这是我注册的新账号&#xff0c;显示未实名&#xff0c;在手机号这里显示辅助手机号绑定&#xff0c;手机号绑定这里显示未绑定。如果你需要矩阵&#xff0c;那么&#xff0c;还需要设置好头像&#xff0c;以及介绍&#xff0c;这些都可以正常设置。 再好的方法&#xff0c…

C++笔记21•C++11的新特性•

相比于 C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简…

VS code 创建与运行 task.json 文件

VS code 创建与运行 task.json 文件 引言正文创建 .json 文件第一步第二步第三步 运行 .json 文件 引言 之前在 VS code EXPLORER 中不显示指定文件及文件夹设置&#xff08;如.pyc, pycache, .vscode 文件&#xff09; 一文中我们介绍了 settings.json 文件&#xff0c;这里我…

唯徳知识产权管理系统 UploadFileWordTemplate 任意文件读取

0x01 漏洞描述&#xff1a; 唯徳于2014年成立&#xff0c;是专业提供企业、代理机构知识产权管理软件供应商&#xff0c;某公司凭借领先的技术实力和深厚的专利行业积累&#xff0c;产品自上市推广以来&#xff0c;已为1000多家企业及代理机构提供持续稳定的软件服务。其知识产…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…

L67 【哈工大_操作系统】操作系统历史 学习任务

L6 操作系统历史 线条一 1、上古神机 IBM7094 专注于计算批处理操作系统&#xff08;Batch system&#xff09; 2、OS/360 一台计算机干多种事&#xff0c;多道程序作业之间的 切换和调度 成为核心 &#xff08;多进程结构和进程管理概念萌芽&#xff01;&#xff09; 3…

链式栈讲解

文章目录 &#x1f34a;自我介绍&#x1f34a;链式栈入栈和出栈linkstack.hlinkstack.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要…