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

【Docker学习】深入研究命令docker exec

使用docker的过程中,我们会有多重情况需要访问容器。比如希望直接进入MySql容器执行命令,或是希望查看容器环境,进行某些操作或访问。这时就会用到这个命令:docker exec。

命令:

docker container exec

描述:

在运行的容器中执行命令。

您使用 docker exec 指定的命令只会在容器的首要进程(PID 1)运行时执行,如果容器重启,该命令不会被重新启动。

该命令在容器的默认工作目录中运行。

该命令必须是一个可执行程序。链式命令或引号内的命令不起作用

这样是有效的:docker exec -it my_container sh -c “echo a && echo b” 

这样是无效的:docker exec -it my_container “echo a && echo b”

用法:

docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]

别名:

docker exec(docker的一些命令可以简写,docker exec和docker container exec是等价的)

选项:

选项描述
-d, –detach分离模式:在后台运行命令
–detach-keys覆盖用于分离容器的键序列
-e, –envAPI 1.25+ 设置环境变量
–env-file读取的环境变量文件
-i, –interactive即使未附着也保持 STDIN 打开
–privileged为命令提供扩展权限
-t, –tty分配一个伪TTY
-u, –user用户名或用户ID(格式:<name|uid>[:<group|gid>])
-w, –workdir容器内的工作目录

示例1:选项-d, –detach、-i, –interactive、-t, –tty

-d相当于后台运行,使用这个选项,不影响终端的进一步操作。-i和-t两个选项通常一起使用,在【Docker学习】docker run之黄金搭档-it选项 – 筑天兄的清净小站 (skycreator.top)有详细介绍。

关于这三个选项,官方给出的例子挺好。我就直接使用官方例子,在我的阿里云上操作,借花献佛了。

使用exec,首先要确保有一个运行着的容器。使用以下命令创建并启动一个名为mycontainer的基于alpine的容器,该容器以sh shell作为其主进程。其中,-d选项(–detach的简写形式)会让容器以后台运行的方式启动,即分离模式,并附加一个伪TTY(-t)。-i选项设置为保持STDIN附加(-i),这可以防止sh进程立即退出。

docker run --name mycontainer -d -i -t alpine /bin/sh

执行之后,使用ps来查看一下:

在这之后,我们使用-d选项,在运行的mycontainer容器中运行一个命令touch /tmp/execWorks。该命令在容器的根目录tmp下创建execWorks文件。

docker exec -d mycontainer touch /tmp/execWorks

这条命令执行之后没效果,需要进入容器的sh下查看。使用-it选项(-i加-t选项),直接与容器交互。

docker exec -it mycontainer sh

在容器的终端进入tmp文件夹查看,发现execWorks被创建。

示例2:选项–detach-keys

这个选项说起来比较复杂,在【Docker学习】docker start深入研究 – 筑天兄的清净小站 (skycreator.top)中有详细讲解,大家可以对照着来学习。

示例3:选项-e, –env和选项–env-file

这两个选项都是设置环境变量的,前者是直接设置,后者是通过一个文件设置。在【Docker学习】docker run的环境变量相关选项(-e, –env, –env-file) – 筑天兄的清净小站 (skycreator.top)中有详细讲解,这个不再赘述了。

示例4:–privileged

这个选项用于提升容器权限,它为容器提供了以下功能:

  • 启用所有Linux内核功能
  • 禁用默认的seccomp配置文件
  • 禁用默认的AppArmor配置文件 
  • 禁用SELinux进程标签 
  • 授予访问所有主机设备的权限 
  • 使/sys变为可读写 
  • 使cgroups挂载变为可读写 

换句话说,容器几乎可以做主机能做的任何事情。这个标志的存在是为了允许特殊用途,比如在Docker中运行Docker。

这个选项很强大,未来详细讲解,这里只简要介绍。

我们使用刚才的容器作测试,进入容器的终端,执行命令

docker exec -it mycontainer sh

在终端输入以下命令,将一个tmpfs文件系统挂载到/mnt目录,允许在这个目录下存储临时数据,这些数据在系统重启后不会保留。

/ # mount -t tmpfs none /mnt

这个命令具体作用如下:

  • mount:这是用来挂载文件系统的命令。
  • -t tmpfs:这指定了要挂载的文件系统类型为tmpfs,这是一种基于内存的文件系统,也称为临时文件系统。数据存储在内存中,而不是写入磁盘,这意味着它的读写速度非常快,但数据在系统重启后会丢失。
  • none:这里指定了设备的源,none表示没有实际的设备或文件名与tmpfs关联。因为tmpfs不依赖于具体的设备,所以使用none作为占位符。
  • /mnt:这是挂载点,即文件系统在目录树中的位置。在这个例子中,tmpfs将被挂载到/mnt目录下。

看看运行结果。显示permission denied,说明没有权限。默认情况下,Docker会丢弃大多数可能危险的核心功能,包括CAP_SYS_ADMIN(挂载文件系统所必需的)。

那么我们执行–privileged选项看看。

居然没有效果!!!好吧,看来只能放大招了。

官网讲解–privileged选项时,也讲解了docker run 的–cap-add选项,该选项可以为容器添加linux功能。而SYS-ADMIN是linux系统管理必备的功能。因此我使用该选项,先给mycontainer加入这个功能。

docker run --cap-add SYS_ADMIN --name mycontainer -dit  alpine /bin/sh

执行之后,我尝试进行挂载,这次成功了。通过df -h命令查看文件系统磁盘空间使用情况。可以看到最下面一行,文件系统是none的就是我进行的挂载。不过这么做也用不着–privileged选项了。

官网的例子使用的并不是alpine,而是ubuntu。通过对比–privileged使用与否的情况,可以看到ubuntu的/dev目录发生了明显的变化:

上面是不使用–privileged选项的/dev目录。

上面是使用–privileged选项的/dev目录。

可以明显看出两者的不同,说明使用–privileged选项,为/dev目录增加了不少特性。

回过头再来看alpine,使用不使用/dev的目录是相同的。如下图所示:

也就是说,alpine这个镜像并没有为–privileged选项预留功能。毕竟alpine是阉割版的linux系统,它的大小只有4m多。下面是几个linux官方镜像的大小对比。

另外,docker run的–cap-add选项,没有加入到docker exec中,可能是因为这只能是创建时加入,运行中的容器是不能直接设置的。

示例5:-u, –user选项

这个选项用于以某个用户身份进入容器。

还是使用alpine这个镜像的mycontainer容器,进入容器的shell下,添加一个普通用户zl

adduser zl

然后exit退出,重新使用docker exec进入,这次加入-u选项

docker exec -it -u zl  mycontainer sh

在shell中输入id,查看当前用户的信息

可以看出,当前用户是zl,uid,gid和groups均显示出来了。

示例6:-w, –workdir选项

该选项用于设置容器的工作目录。不指定的情况下,工作目录就是/,如下图所示:

下面指定了工作目录为/etc,使用pwd查看当前工作目录,即是/etc。

关于alpine

Alpine是一个轻量级的Linux发行版,它基于musl libc和 BusyBox,旨在提供一个小巧、安全、简单且高效的操作系统。Alpine特别适合用于容器和云环境,因为它的大小很小,启动速度快,同时提供了一个包管理器工具apk,可以用来安装、更新和管理软件包。

在Docker等容器平台中,Alpine经常被用作基础镜像,因为它可以创建出非常小的容器镜像,这对于开发和部署都非常有利。由于它的体积小,Alpine在资源有限的场景下也非常受欢迎,比如在嵌入式设备或者需要快速部署的应用中。

Alpine 官网:https://www.alpinelinux.org/

Alpine 官方仓库:https://github.com/alpinelinux

Alpine 官方镜像:https://hub.docker.com/_/alpine/

Alpine 官方镜像仓库:https://github.com/gliderlabs/docker-alpine

关于–privileged

请谨慎使用–privileged标志。带有–privileged的容器并不是一个安全沙箱化的进程。在此模式下的容器可以在主机上获取root权限的shell并控制系统。

对于大多数用例来说,这个标志不应该是首选解决方案。如果您的容器需要提升的权限,您应该更愿意明确授予必要的权限,例如通过使用–cap-add添加单个内核功能。

关于df -h命令

在Linux和类Unix操作系统中,df -h是一个常用的命令,用于显示文件系统的磁盘空间使用情况。df代表disk free,即磁盘空闲空间。-h选项表示human-readable,它会以更易于阅读的格式显示大小,例如将字节转换为千字节、兆字节或吉字节,并附加适当的单位(K、M、G)。

df -h命令的输出通常包括以下信息:

  • 文件系统的挂载点(Mounted on)
  • 文件系统的总大小(Size)
  • 已使用的空间大小(Used)
  • 可用的空闲空间(Avail)
  • 使用百分比(Use%)
  • 文件系统的标识(Filesystem)

相关文章:

【Docker学习】深入研究命令docker exec

使用docker的过程中&#xff0c;我们会有多重情况需要访问容器。比如希望直接进入MySql容器执行命令&#xff0c;或是希望查看容器环境&#xff0c;进行某些操作或访问。这时就会用到这个命令&#xff1a;docker exec。 命令&#xff1a; docker container exec 描述&#x…...

C语言中的文件操作

前言 嗨&#xff0c;我是firdawn&#xff0c;在本章中我们将介绍&#xff0c;文件的概念&#xff0c;文件的打开和关闭&#xff0c;在篇末我们将介绍文件缓冲区的作用&#xff0c;下面是本章的思维导图&#xff0c;接下来&#xff0c;让我们开始今天的学习吧&#xff01; 一…...

python使用xlrd读取excel的时候把字符串读成了数字

xlrd 是一个 Python 库&#xff0c;用于读取 Excel 文件&#xff08;.xls 和 .xlsx&#xff0c;但 .xlsx 需要 openpyxl 或 xlrd 的较新版本&#xff09;。然而&#xff0c;xlrd 在读取 Excel 文件时通常会将单元格的内容按其原始数据类型&#xff08;如字符串、数字、日期等&a…...

【C语言】走进指针世界(下卷)

前言 在“走进指针世界&#xff08;上卷&#xff09;”中&#xff0c;我们已经说过&#xff1a;什么是指针、内存和地址&#xff0c;指针的使用、声明、初始化&#xff0c;取地址运算符、解引用运算符以及这两者关系&#xff0c;还有指针赋值。 在正式使用指针进行各种代码的…...

【Spring】SSM整合_入门代码实现

1. Maven依赖 在pom.xml中添加SSM框架的依赖 <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.x</version> </dependency>…...

C++代码错误解决1(函数模板)

1、代码如下 //示例函数模板的使用 #include <iostream> #include <string> using namespace std; template <typename T>//函数模板 T max(T a,T b) {return a>b?a:b; } int main() {int a,b;cout<<"input two integers to a&b:"…...

idea configuration 配置 方便本地启动环境切换

idea 再项目启动的时候避免切换环境导致上线的时候出现环境配置问题 可以再idea 的 configuration 中配置项目的 vm options 虚拟机的内容占用 -Xmx256m -Xms256m -Xmn100m -Xss256k program arguments properties 文件中需要修改的配置参数 active profiles 指定启动的本…...

win10配置wsl的深度学习环境

# 1、一步完成wsl&#xff1a;开启虚拟机、linux子系统、并下载ubuntu # 官方文档: https://learn.microsoft.com/zh-cn/windows/wsl/install wsl --install# 2、打开windows terminal&#xff0c;选ubuntu交互环境 # 第一次需要配置用户名和密码 # 接下来正常使用即可# 3、cud…...

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…...

fastapi中实现多个路由请求

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 最近在写机器人相关的接口&#xff0c;顺手学了学python&#xff0c;发现这是个好东西&#xff0c;写代码效率比java要高很多&#xff0c;比如写个词云呀&#xff0c;写个回调呀&am…...

前端框架选择指南:React vs Vue vs Angular

选择前端框架时&#xff0c;React、Vue 和 Angular 都是流行的选择&#xff0c;各有优缺点。我们可以从各个维度进行比较和选择&#xff1a; React 核心理念&#xff1a; 组件化开发&#xff0c;专注于视图层。学习曲线&#xff1a; 相对平缓&#xff0c;因为重点在于JSX和组…...

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…...

并发编程笔记8--ThreadLocal结构详解

ThreadLocal&#xff0c;即线程变量&#xff0c;是一个以ThreadLocal对象为键&#xff0c;任意对象为值的存储结构。这个结构被附带在线程上&#xff0c;也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的值。可以通过set(T)方法来设置一个值&#xff0c;在…...

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …...

【C++STL详解(四)------vector的模拟实现】

文章目录 vector各函数接口总览vector当中的成员变量介绍默认成员函数构造函数1构造函数2构造函数3拷贝构造函数赋值运算符重载函数析构函数 迭代器相关函数begin和end 容量和大小相关函数size和capacityreserveresizeempty 修改容器内容相关函数push_backpop_backinserterases…...

租赁系统|北京租赁系统|租赁软件开发流程

在数字化时代的浪潮下&#xff0c;小程序成为了各行各业争相探索的新领域。租赁行业亦不例外&#xff0c;租赁小程序的开发不仅提升了用户体验&#xff0c;更为商家带来了更多商业机会。本文将详细解析租赁小程序的开发流程&#xff0c;为有志于进军小程序领域的租赁行业从业者…...

JAVA面试题大全(十四)

1、Kafka 可以脱离 Zookeeper 单独使用吗&#xff1f;为什么&#xff1f; kafka不能脱离zookper单独使用&#xff0c;因为kafka使用zookper管理和协调kafka的节点服务器。 2、Kafka 有几种数据保留的策略&#xff1f; Kafka提供了多种数据保留策略&#xff0c;这些策略用于定…...

Web Accessibility基础:构建无障碍的前端应用

Web Accessibility&#xff08;网络无障碍&#xff09;是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例&#xff1a; 2500G计算机入门到高级架构师开发资料超级大礼包免…...

谈谈你对 SPA 的理解?

1 理解基本概念 SPA&#xff08;single-page application&#xff09;单页应用&#xff0c;默认情况下我们编写 Vue、React 都只有一个html 页面&#xff0c;并且提供一个挂载点&#xff0c;最终打包后会再此页面中引入对应的资源。&#xff08;页面的渲染全部是由 JS 动态进行…...

JAVA给一个JSON数组添加对象

操作Mysql表的json字段&#xff0c;查询json字段的内容&#xff0c;将新增的内容添加到查询的json数组中 String a "[{\"name\": \"张三\", \"age\": 10, \"gender\": \"男\", \"email\": \"123qq.co…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...