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

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

 

相关文章:

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

目录 理解 Docker 容器的基本概念 使用 docker exec 进入运行中的容器 基本用法 常用选项解析 选项详解 实际案例演示 1. 进入容器的交互式 Shell 2. 在容器中运行单个命令 3. 以指定用户运行命令 4. 设置环境变量并运行命令 5. 指定工作目录 使用 docker attach 附…...

2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析

问题1详细解答过程 (1) 交通流参数统计 数据预处理 数据读取&#xff1a; 从四个视频观测点提取交通流数据&#xff0c;包括每个时间段内的车流量、车速和车道占用率等。 交通流参数计算 3. 计算流量 (Q)&#xff1a; Q ( t ) N ( t ) Δ t Q(t) \frac{N(t)}{\Delta t} Q…...

伊犁云计算22-1 apache 安装rhel8

1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改...

概率论原理精解【13】

文章目录 在度量空间中&#xff0c;连续映射概述一、度量空间与距离函数二、连续映射的定义三、连续映射的等价定义四、连续映射的性质五、应用与例子 球形邻域刻画一、球形邻域的定义二、连续映射的球形邻域刻画三、等价性证明四、应用与例子 将度量空间上的连续映射推广到拓扑…...

年度巨献 | OpenCSG开源最大中文合成数据集Chinese Cosmopedia

01 背景 近年来&#xff0c;生成式语言模型&#xff08;GLM&#xff09;的飞速发展正在重塑人工智能领域&#xff0c;尤其是在自然语言处理、内容创作和智能客服等领域展现出巨大潜力。然而&#xff0c;大多数领先的语言模型主要依赖于英文数据集进行训练&#xff0c;中文数据…...

Mac 上,终端如何开启 proxy

文章目录 为什么要这么做前提步骤查看 port查看代理的port配置 bash测试 为什么要这么做 mac 上的终端比较孤僻吧&#xff0c;虽然开了&#xff0c;但是终端并不走&#x1fa9c;…产生的现象就是&#xff0c;浏览器可以访问&#x1f30d;&#xff0c;但是终端不可以访问&#…...

Linux中的进程入门

冯诺依曼体系结构 操作系统(Operator System) 进程控制块&#xff08;PCB&#xff09; struct task_struct{//该进程的所有属性//该进程对应的代码和属性地址struct task_struct* next; }; struct task_struct 内核结构体——>创建内核结构体对象(task_struct&#xff09;…...

Redis面试真题总结(三)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 什么是缓存雪崩&#xff1f;该如何解决&#xff1f; 缓存雪崩是指…...

ARM/Linux嵌入式面经(三三):大疆

嵌入式工程师考察主要蕴含:C/C++,处理器的架构,操作系统(linux或嵌入式实时操作系统),常见硬件接口协议/总线,文件存储系统等几方面 文章目录 1)C/C++static作用,变量加入static以后在内存中存储位置的变化。static的作用变量加入static后在内存中存储位置的变化面试官…...

《DevOps实践指南》笔记-Part 2

一篇文章显得略长&#xff0c;本文对应第3-4章。前言、第1-2章请参考Part 1&#xff1b;第5-6章、附录、认证考试、参考资源等内容&#xff0c;请参考Part 3。 流动的技术实践 持续交付&#xff1a;降低在生产环境中部署和发布变更的风险。包括&#xff1a;打好自动化部署流水…...

树莓派智能语音助手实现音乐播放

树莓派语音助手从诞生的第一天开始&#xff0c;我就想着让它能像小爱音箱一样&#xff0c;可以语音控制播放音乐。经过这些日子的倒腾&#xff0c;今天终于实现了。 接下里&#xff0c;和大家分享下我的实现方法&#xff1a;首先音乐播放模块用的是我在上一篇博文写的《用sound…...

【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">参数列表[逗号模式]<el-too…...

完整版:NacosDocker 安装

第一步&#xff1a;先直接通过命令安装 Nacos docker run --name nacos2.2.3 -d -p 8848:8848 -e MODEstandalone f151dab7a111 第二步&#xff1a;创建 Docker 挂载目录 # 创建 log 目录 mkdir -p /root/nacos 第三步&#xff1a;将 Docker 容器的文件复制到挂载目录中 …...

mysql RR是否会导致幻读?

除了rr级别的当前读&#xff0c;都会幻读 mysql不同隔离级别&#xff1a; 而对于RC级别的语句级快照和RR级别的事务级快照的之间的区别&#xff0c;其实是由read_view生成的时机来实现的。 RC级别在执行语句时&#xff0c;会先关闭原来的read_view&#xff0c;重新生成新的r…...

一篇进阶Python深入理解函数之高阶函数与函数式编程

当我们深入探讨了函数的作用域与闭包,了解到函数不仅是代码的执行单元,还能通过闭包完成数据的封装与保护.接下来,我们将进一步挖掘函数的强大特性,尤其是高阶函数与函数式编程,帮助你更全面地理解 Python 中函数的特性与应用. 高阶函数 高阶函数是指接受一个或多个函数作为参…...

python中Web开发框架的使用

Python 的 Web 开发框架种类繁多&#xff0c;常见的有 Django 和 Flask 这两个框架。它们各有优点&#xff0c;适合不同类型的 Web 应用开发需求。下面&#xff0c;我将详细介绍这两大主流框架的使用方法&#xff0c;让你快速上手 Python 的 Web 开发。 1. Django Django 是一…...

【AI视频】Runway:Gen-2 运镜详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;Camera Control&#xff08;运镜&#xff09;&#x1f4af;Camera Control功能测试Horizonta&#xff08;左右平移&#xff09;Vertical&#xff08;上下平移&#xff0…...

Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中函数的一些题目&#xff0c;方便学习完Python的函数之后进行一些知识检验&#xff0c;感兴趣的小伙伴可以试一试&#xff0c;含选择题、判断题、实战题、填空题&#xff0c;答案在第五章。 在做题之前可以先学习或者温习一下Python的函数&#xff0c;推荐…...

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言&#xff1a;​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…...

FB仿真模拟PID曲线数据

为了能直观的理解PID的参数调整与曲线数据的变化关系&#xff0c;使用FB写了一个模拟PID曲线数据的程序。 PID类如下&#xff1a; Type PIDController Private : kp_ As Double //比例增益 ki_ As Double //积分增益 kd_ As Double …...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...