docker run命令总结

2023-05-16

运行 docker 容器时,有时候我们希望它默认进入一个工作目录,我们可以在 docker run 命令后追加参数 -w 来实现,这样我们就不需要在启动 docker 容器后再进行一次 cd 命令了。

docker run --help 帮助中 -w 的释义如下:

-w, --workdir string Working directory inside the container

1

以构建 maven 项目为例如下:

docker run -it --rm \

-v /code/spring-boot-demo/:/spring-boot-demo \

-w /spring-boot-demo \

--name maven maven:3.8.6-jdk-8 \

mvn clean package -T 1C -Dmaven.test.skip=true -Dmaven.compile.fork=true

1

2

3

4

5

参数说明:

--name 指定了容器创建后的名称(使用 --rm 时不建议指定 --name,防止并发 run 时同名报错)

-v 参数挂载目录,将宿主机的文件夹挂载到容器中

--rm 表示容器运行退出后自动清除挂载卷,等价在容器退出后执行 docker rm -v,指定 --rm 参数启动容器时通常不使用 -d 参数

-w 指定容器启动后的默认工作目录,全称是 --workdir

-T 1C 参数表示使用每个 CPU 核心跑一个工程(适用 Maven 3.x 以后版本)

-Dmaven.test.skip=true 表示跳过执行 Unit 测试用例

-Dmaven.compile.fork=true 表示使用多线程进行编译

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。

譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

貌似简单,其实不然,下面我们来验证一下:

一、容器目录不可以为相对路径

[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash

invalid value "/test:soft" for flag -v: soft is not an absolute path

See 'docker run --help'.

直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。

二、宿主机目录如果不存在,则会自动生成

如果宿主机中存在/test目录,首先删除它

[root@localhost ~]# rm -rf /test

[root@localhost ~]# ls /

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

启动容器

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash

[root@a487a3ca7997 /]# ls

bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var

查看宿主机,发现新增了一个/test目录

[root@localhost ~]# ls /

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var

三、宿主机的目录如果为相对路径呢?

这次,我们换个目录名test1试试

# docker run -it -v test1:/soft centos /bin/bash

再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。

"Mounts": [

{

"Name": "test1",

"Source": "/var/lib/docker/volumes/test1/_data",

"Destination": "/soft",

"Driver": "local",

"Mode": "z",

"RW": true

}

],

可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录

原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。

四、如果只是-v指定一个目录,这个又是如何对应呢?

启动一个容器

[root@localhost ~]# docker run -it -v /test2 centos /bin/bash

[root@ea24067bc902 /]# ls

bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys test2 tmp usr var

同样使用docker inspect命令查看宿主机的挂载目录

"Mounts": [

{

"Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a",

"Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data",

"Destination": "/test2",

"Driver": "local",

"Mode": "",

"RW": true

}

],

可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。

五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢?

首先开启一个容器,查看容器内/soft目录的属性

[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash

[root@b5ed8216401f /]# ll -d /soft/

drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/

查看宿主机内/test目录的属性

[root@localhost ~]# ll -d /test/

drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/

在容器内新建用户,修改/soft的属主和属组

[root@b5ed8216401f /]# useradd victor

[root@b5ed8216401f /]# chown -R victor.victor /soft/

[root@b5ed8216401f /]# ll -d /soft/

drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/

再来看看宿主机内/test目录的属主和属组是否会发生变化?

[root@localhost ~]# ll -d /test/

drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/

竟然变为mycat了。。。

原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。

首先查看容器内victor对应的UID是多少,

[root@b5ed8216401f /]# cat /etc/passwd | grep victor

victor:x:1000:1000::/home/victor:/bin/bash

victor的UID为1000,那么宿主机内1000对应的用户是谁呢?

[root@localhost ~]# cat /etc/passwd |grep 1000

mycat:x:1000:1000::/home/mycat:/bin/bash

可以看出,宿主机内UID 1000对应的用户是mycat。

六、容器销毁了,在宿主机上新建的挂载目录是否会消失?

在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft

第一种情况:

[root@localhost ~]# rm -rf /test --首先删除宿主机的/test目录

[root@localhost ~]# ls / --可以看到,宿主机上无/test目录

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

[root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash --启动容器,为了删除方便,我用--name参数指定了容器的名字

[root@82ad7f3a779a /]# exit

exit

[root@localhost ~]# docker rm centos_test --删除容器

centos_test

[root@localhost ~]# ls / --发现 /test目录依旧存在

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var

可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。

第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除

首先启动容器

[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash

[root@6b75579ec934 /]# exit

exit

通过docker inspect命令查看容器在宿主机上生成的挂载目录

"Mounts": [

{

"Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301",

"Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data",

"Destination": "/soft",

"Driver": "local",

"Mode": "",

"RW": true

}

],

对应的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目录

销毁容器,看目录是否存在

[root@localhost ~]# docker rm centos_test

centos_test

[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301

total 0

drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

发现该目录依旧存在,即便重启了docker服务,该目录依旧存在

[root@localhost ~]# systemctl restart docker

[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301

total 0

drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。

可通过两种方式解决:

1> 关闭selinux。

临时关闭:# setenforce 0

永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。

2> 以特权方式启动容器

指定--privileged参数

如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash

八、docker -v需要挂在小层级目录,大目录可能会报错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker run命令总结 的相关文章

  • 2020电赛D题绕组飞行器

    在准备电赛的过程中 xff0c 做了一下去年的题 xff0c 本文将介绍我的方案及部分代码 xff0c 希望可以帮助到大家 一 我的装备 由于初学飞控所以主控用的是匿名的拓空者 xff0c 还有匿名的光流传感器 xff0c 北醒的激光雷达
  • nuxtjs常见问题

    1 在服务器端部署 xff0c 需要再服务器端安装node modules 2 本地忽略 nuxt文件夹 xff0c 这个需要在服务器端上执行npm run build生成 xff0c 然后执行 pm2 start npm name 34
  • Ubuntu学习笔记:sudo:vim:command not found

    Ubuntu学习笔记 xff1a sudo xff1a vim xff1a command not found 完成 xff01
  • Ubuntu学习笔记:查看所有用户

    Ubuntu学习笔记 xff1a 查看所有用户 输入 cat etc passwd cut f 1 d 注意 xff01 结尾有一个 xff1a 效果如下 xff1a
  • Ubuntu学习笔记:cd命令

    Ubuntu学习笔记 xff1a cd命令 命令顺序 xff1a 创建一个名为aaa的文件夹 进入指定文件夹 返回上一级文件夹 进入指定文件夹 返回上一级文件夹 退回上一次操作的文件夹 显示上一次操作的文件夹所在的路径 退回多级文件夹 退回
  • Ubuntu学习笔记:swapon 失败:设备或资源忙

    swapon 失败 xff1a 设备或资源忙 用命令swapoff xff0f 交换分区 将交换分区停止 然后再用swapon命令重新加载即可
  • Ubuntu学习笔记:使用命令查看当前登录系统的用户信息

    Ubuntu学习笔记 xff1a 使用命令查看当前登录系统的用户信息 1 查看当前登录的用户名 2 查看当前登录的用户名 终端类型 时间 IP地址 3 服务器连接的所有用户及正在使用的进程 4 显示系统中有哪些使用者正在上面 xff0c 显
  • Ubuntu学习笔记:使用命令查看系统资源,内存使用情况

    Ubuntu学习笔记 xff1a 使用命令查看系统资源 xff0c 内存使用情况 方法1 打开资源管理器 资源 gnome system monitor 方法2 top命令 方法3 下载htop apt get install htop h
  • Ubuntu学习笔记:使用命令修改 root 用户的密码

    Ubuntu学习笔记 xff1a 使用命令修改 root 用户的密码 Ubuntu 每次开机都有一个随机的新的 root 密码 在不知道密码的情况下 xff0c 要重新修改root密码 方法 xff1a sudo passwd 输入用户登录
  • C语言的特点

    1 语言简洁 紧凑 xff0c 使用方便 灵活 xff1b 2 运算符丰富 xff1b 3 数据类型丰富 xff1b 4 具有结构化的控制语句 xff08 例如if else语句 while语句 do while语句 switch语句和fo
  • Win11 更新绕过TPM2.0 方法 最新最简单 亲测有效 Win11系统更新 DEV方式

    最新的win11内测把不符合硬件规定的人都排除出去了 xff0c 虽然有注册表导入可以挤到DEV通道 xff0c 不过在更新到8 会弹出显示设备不支持提示 xff0c 关闭窗口后升级被取消 因此特在实践后教大家如何绕过TPM2 0 更新的方
  • iview常见问题

    1 radio组 label如果为字符串可以默认选中 xff0c 如果为数字 xff0c 却没有反应 答 xff1a label为数字时 xff0c 需要在label前加 xff1a 来绑定 xff0c 这样就可以实现默认选中了
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • 【通信协议】单总线协议详解——以DHT11为例

    单总线概述 1 单总线的介绍 xff08 1 xff09 单总线也称为1 Wire bus xff0c 它是由美国DALLAS xff08 达尔斯 xff09 公司推出的外围串行扩展总线 单总线系统中配置的各种器件 xff0c 由DALLA
  • 【STM32学习笔记】(4)—— STM32工程文件详解

    STM32工程文件构成 从下图可以看出我们的工程目录是由CORE OBJ STM32F10x FWLib USER SYSTEM以及HARDWARE文件夹组成的 此外还有一个文本文档README TXT 以及一个Windows 批处理文件
  • 【STM32学习笔记】(6)—— 跑马灯实验详解

    跑马灯实验 在前面五篇STM32学习笔记中 xff0c 我们已经初步认识了STM32芯片 xff0c 并且了解STM32的常用寄存器 xff0c 介绍了STM32的GPIO模式 xff0c STM32工程文件 xff0c 以及最终讲解了如何
  • 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1 1 xff08 精英板 库函数版本 xff09 xff0c 文章中大部分知识都是从两本书中提取出来 xff0c 串口通信协议的知识主要参考野火的书籍 xff
  • 【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

    NVIC xff08 嵌套向量中断控制器 xff09 简介 在讲如何配置中断优先级之前 xff0c 我们需要先了解下 NVIC NVIC 是嵌套向量中断控制器 xff0c 控制着整个STM32芯片中断相关的功能 xff0c 它跟Cortex
  • 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解

    窗口看门狗 WWDG 概述 窗口看门狗通常被用来监测 xff0c 由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障 除非递减计数器的值在T6位变成0前被刷新 xff0c 否则看门狗电路在达到预置的时间周期时 x
  • 【元器件学习笔记—电阻】(6)——电阻并联电路

    电阻串联和并联电路 任何复杂的电路经过各种等效和简化后都可以归纳为两种电路 xff1a 一是串联电路 xff0c 二是并联电路 电阻并联电路 并联电路与串联电路是完全不同的电路 xff0c 它们之间不能相互等效 xff0c 并联电路的一些特

随机推荐

  • 【元器件学习笔记—电阻】(7)——电阻串并联电路

    电阻串并联电路 电阻串并联电路是电阻串联电路与电阻并联电路的组合电路 下图所示是由 3 只电阻器构成的电阻器串并联电路 电路中的电阻 R1 和 R2 并联 xff0c 然后再与电阻 R3 串联 xff0c 这就是纯电阻的串并联电路 纯电阻器
  • 【元器件学习笔记—电阻】(8)——电阻分压电路

    电阻分压电路 电阻分压电路工作原理 下图所示是典型的电阻分压电路 xff08 没有接入负载电路 xff09 xff0c 电阻分压电路由 和 两只电阻构成 电路中有电压输入端和电压输出端 1 电路结构 输入电压 加在电阻 和 上 xff0c
  • 小程序验证手机号和身份证号码

    if isPhone params mobile Toast content 39 请填写正确的手机号 39 type 39 error 39 return false var idCardMsg 61 identityIDCard par
  • 神州战神笔记本清灰+换硅脂-记录

    文章目录 Introduction拆清灰涂抹硅脂安装开机测试 Introduction 笔记本购买于2020年4月份左右 xff0c 至今已使用2年半时间 CPU是i7 9750H xff0c 基准频率是2 6GHz 用control ce
  • 【PADS VX2.4下载与安装】

    PADS VX2 4下载与安装 电脑 xff1a Windows10 64bit 一 下载地址 链接 xff1a https pan baidu com s 1yTAU5Hymrc1i8MhALwbsrA 提取码 xff1a hljd 二
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

    讲解FreeRTOS中消息队列及其用法 使用消息队列的原因消息队列函数解析示例遇到的问题 使用消息队列的原因 在裸机系统中 xff0c 两个程序间需要共享某个资源通常使用全局变量来实现 xff1b 但在含操作系统 下文就拿FreeRTOS举
  • 【FreeRTOS】详细讲解FreeRTOS里中断管理并通过示例讲述其用法

    文章目录 中断函数解析FreeRTOS中断使用示例 中断 大家看到中断后 xff0c 有没有想到一个名词 异常呢 xff1f 若大家想到了 xff0c 但是记不起相关概念 xff1b 或者是 xff0c 大家没想到这个名词 xff0c 没关
  • 【嵌入式软件开发实习】个人面试记录及其总结(一)

    文章目录 问题一 xff1a 使用宏定义完成两个数据的交换问题二 xff1a 制作一个函数接口判断函数参数输入是否符合要求 xff0c 如果符合要求就返回部分输入 xff0c 如果不符合就返回no result问题三 xff1a 什么是结构
  • 嵌入式经典通信总线协议——RS232和RS485

    UART 通信的不足 注意 xff1a TTL电平信号通信距离应该 lt 61 1 5米 两种电平标准 RS232协议 因为控制器一般使用 TTL 电平标准 xff0c 所以常常会使用 MA3232 芯片对 TTL 及 RS 232电平的信
  • 把所阅读的文章背景/主题变成白色

    今天在CSDN找SVD分解的资料 xff0c 找到了一篇写的很好的文章 xff0c 但是它的主题是黑色的 xff0c 是黑色的 xff01 作为黑色主题深恶痛绝人士 xff0c 于是我便想把这篇文章的主题改成白色 我们作为读者似乎并没有这个
  • 计算机保研专业课必备之数据结构

    数据结构保研面试准备 算法的五大特征 有穷性 有限的步骤确定性 不可二义性可行性 每一步都是通过执行有限次数完成的输入 零个或多个输入输出 至少有一个或多个输出 O n 的大O是什么意思 xff1f 什么是时间复杂度 大O表示的是最坏情况下
  • Go语言快速的一键生成一个gRPC服务

    目录 前言 介绍 使用命令行工具 micro 生成 gRPC 服务 安装 xff1a 创建项目 xff1a 安装 protobuf 和依赖项 xff1a 构建并运行服务 xff1a 总结 前言 由于近期因为一些事情很久没更了今天带来一个Go
  • 编程实现在str1中查找str2的初始位置

    问题描述 有两个字符串str1和str2 xff0c 它们的长度都不超过100个字符 请编程实现在str1中查找str2的初始位置 输入形式 有两行输入 xff0c 第一行输入字串str1 xff0c 第二行输入字串str2 输出形式 一个
  • 数据挖掘Java——KNN算法的实现

    一 KNN算法的前置知识 k 近邻 xff08 kNN k NearestNeighbor xff09 是在训练集中选取离输入的数据点最近的k个邻居 xff0c 根据这个k个邻居中出现次数最多的类别 xff08 最大表决规则 xff09 x
  • thinkPHP生成微信支付平台证书

    1 先安装微信支付V3版本 xff1b 2 在目录 vendor wechatpay wechatpay下执行以下代码 xff1b 3 在本地VScode编辑器的终端运行命令行 xff0c 执行以下代码 xff1a composer exe
  • 数据挖掘Java——DBSCAN算法的实现

    一 DBSCAN算法的前置知识 DBSCAN算法 xff1a 如果一个点q的区域内包含多于MinPts个对象 xff0c 则创建一个q作为核心对象的簇 然后 xff0c 反复地寻找从这些核心对象直接密度可达的对象 xff0c 把一些密度可达
  • 数据挖掘Java——Kmeans算法的实现

    一 K means算法的前置知识 k means算法 xff0c 也被称为k 平均或k 均值 xff0c 是一种得到最广泛使用的聚类算法 相似度的计算根据一个簇中对象的平均值来进行 算法首先随机地选择k个对象 xff0c 每个对象初始地代表
  • 直立车学习笔记(一)

    直立车是通过两个电机的前后加速度来维持车体保持一定的角度 xff0c 调直立对于PID的理解有一个质的飞跃 xff0c 接下来我会不定期更新我学习直立车的成果和调PID的经历 xff0c 记录一下我的成果 xff0c 也让其他人学习一下 x
  • rtc使用

    首先我们要知道 xff0c rtc并非片上外设 xff0c 所以要通过连接总线以读取数据 什么是RTC RTC Real Time Clock xff1a 实时时钟 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在
  • docker run命令总结

    运行 docker 容器时 xff0c 有时候我们希望它默认进入一个工作目录 xff0c 我们可以在 docker run 命令后追加参数 w 来实现 xff0c 这样我们就不需要在启动 docker 容器后再进行一次 cd 命令了 doc