【Docker 那些事儿】如何安全地进入到容器内部

news2024/11/15 17:44:12

在这里插入图片描述

文章目录

  • 🌟 前言
  • 1. 容器运行
    • 🍇 自动重启的容器
    • 🍇 自定义名称的容器
    • 🍇 开启端口的容器
    • 🍇 与宿主机共享目录的容器
  • 2. 进入容器
    • 2.1 容器的三种状态
      • 🍑 运行状态
      • 🍑 暂停状态
      • 🍑 终止状态
    • 2.2 docker attach与docker exec
      • 🍑 docker attach
      • 🍑 docker exec

在这里插入图片描述

🌟 前言

镜像是构建容器的蓝图,Docker 以镜像为模板,构建出容器。
 
容器在镜像的基础上被构建,也在镜像的基础上运行,容器依赖于镜像。
 
本文将对 容器的运行 及相关内容进行详细讲解。
在这里插入图片描述

1. 容器运行

Docker 官方网站可以查询与 Docker 相关的资料以及帮助手册,但是内容都是英文的,可能会对一些小白造成困扰。(而且,访问 Docker 官方网站特别缓慢 ),所以这里向大家推荐 Docker 中文社区。

这是一个中文的 Docker 资料库,其中有很多整理好的技术文档,Docker 中文社区的官方介绍是:系统整理 Docker 官方的教程和手册、报道 Docker 相关动态和进展、整合网络上其他社区相关资源。

当然用户也可以将自己在学习过程中整理的技术文档上传与大家分享。

使用 docker run 命令可以运行容器,该命令底层其实是 docker createdocker start 两条命令的结合体,运行容器需要先基于镜像创建一个容器,然后启动容器,完成一个容器的运行,如图所示👇
在这里插入图片描述
例如,基于镜像启动一个新容器,并打印当月的日历,示例代码如下:
在这里插入图片描述
从以上示例中可以看到日历已经被打印出来,但无法看到容器是否运行。

ps 命令在 Linux 系统中被用来查看进程,在 Docker 中被用来查看容器,因为运行中的容器也是一个进程,示例代码如下:在这里插入图片描述
从以上示例中可以看到,一个 Docker 容器以 CentOS 镜像为基础运行,并传了一个 cal(打印当前月份日历)命令,容器正常启动并执行了 cal 命令。

除此之外,还可以通过指定参数,启动一个bash交互终端,代码如下:在这里插入图片描述
上述代码创建了一个交互式的容器,并分配了一个伪终端,使用户可以通过命令行与容器进行交互。终端对宿主机进行直接操作,宿主机通过一个虚拟终端将对 Docker 的指令传输给容器,这个虚拟终端就是伪终端,对容器进行直接操作。

执行 docker run 命令启动容器时,Docker 会进行如下操作。

(1)检测本地是否存在指定的镜像,不存在则从默认的 Docker Hub 公有仓库下载。

(2)使用镜像创建(docker create)并启动(docker run)容器。

(3)分配一个文件系统,并在只读层外面挂载一个可读可写层。

(4)从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去。

(5)从地址池分配一个 IP 地址给容器。

(6)执行用户指定的命令。

(7)执行之后容器被终止(docker stop)。

另外,在 docker run 命令中可以添加相应参数,实现不同的功能。

下面运行一个容器,并使用终端对其进行操作,示例代码如下:
在这里插入图片描述
以上命令执行成功的前提是本地含有 CentOS 镜像。其中,-i 表示捕获标准输入输出,-t 表示分配一个终端或控制台。

下面运行一个容器,并为其设置环境变量,示例代码如下:
在这里插入图片描述
其中,-e 参数是在创建容器时为容器配置环境变量。

此时已经成功创建了一个容器,接着查看它的环境变量,示例代码如下:
在这里插入图片描述
从以上示例中可以看到,key=1000 的环境变量已经设置成功。

🍇 自动重启的容器

下面运行一个正常的容器,示例代码如下:
在这里插入图片描述
在新创建的容器中,使用 exit 命令即可退出容器,但容器也将停止运行。

查看容器状态,示例代码如下:
在这里插入图片描述
可以看到,容器此时的状态为 “Exited”,说明容器处于终止状态。

下面运行一个添加参数的容器,示例代码如下:
在这里插入图片描述
不出意外的话,此时容器应该是终止状态。

接着,验证容器的状态,示例代码如下:
在这里插入图片描述
从示例中可以看到,容器此时不是终止状态,而是运行状态。这是由于添加了 –restart 参数的容器被终止后自动重启。

🍇 自定义名称的容器

下面运行一个自定义名称的容器,示例代码如下:
在这里插入图片描述
从示例中可以看到,创建容器时添加了 -name 参数来定义容器名称。创建之后容器的名字就是指定的 “test”

🍇 开启端口的容器

下面创建一个开启 80 端口的容器,示例代码如下:
在这里插入图片描述
参数冒号之前是宿主机端口号,冒号之后是容器的端口号,表示宿主机的 80 端口映射到容器的 80 端口上。

从示例中可以看到,容器正在运行,并且可以看到开启了 80 端口。

为了验证,使用 curl 工具访问容器端口,示例代码如下:
在这里插入图片描述
访问容器 80 端口的返回值为 200,说明容器端口能够被用户正常访问。

接下来,将容器停止,并再次访问容器端口,示例代码如下:
在这里插入图片描述
再次访问容器端口时,连接被拒绝,说明先前的服务由是 Docker 容器来提供的,只是通过宿主机的端口向外网开放。

🍇 与宿主机共享目录的容器

首先在宿主机上创建需要共享的目录与文件,示例代码如下:
在这里插入图片描述
已经在 /root/test/ 目录下别创建了 a.txtb.txt 两个文件,接着创建一个可以共享这两个文件的容器,示例代码如下:
在这里插入图片描述
-v 参数用来指定文件路径,–privileged 参数用来给用户添加操作权限。

从示例中可以看到,目录与文件共享成功。

2. 进入容器

容器在宿主机中共有三种状态,分别为运行(Up)状态、暂停(Paused)状态与终止(Exited)状态。

下面通过示例来观察容器的三种状态。

2.1 容器的三种状态

🍑 运行状态

运行一个名为 test-nginxNginx 容器,并将容器 80 端口映射到宿主机 80 端口,示例代码如下:
在这里插入图片描述
这时,容器已经创建完成,通过 ps 命令查看容器是否为运行状态,示例代码如下:
在这里插入图片描述
从以上示例中可以看出,此时容器状态为运行状态。

🍑 暂停状态

下面通过命令使容器进入暂停状态,示例代码如下:
在这里插入图片描述
docker pause 是暂停容器的命令,上述示例中,暂停了名为 test-nginx 的容器。

接着通过命令查看容器是否成功暂停,示例代码如下:
在这里插入图片描述
从以上示例中可以看到,容器仍是运行状态,但同时也是暂停状态。

接着通过 curl 工具对该容器进行访问测试,示例代码如下:
在这里插入图片描述
通过访问测试发现,此时无法访问到容器网页,但是服务器没有拒绝连接,说明暂停容器的本质是暂停容器中的服务。

下面使用 docker unpause 命令使暂停状态的容器终止暂停状态,示例代码如下:
在这里插入图片描述
此时,命令执行完毕,接着查看容器状态,示例代码如下:
在这里插入图片描述
从以上代码中可以看到,暂停状态已经被终止,容器只处于运行状态。

接着用 curl 工具对容器进行访问测试,示例代码如下:
在这里插入图片描述
从以上示例中可以看到,此时网站已经可以正常访问,说明容器中的服务正常运行。

🍑 终止状态

当不再需要某一个业务继续运行时,就要通过命令使该业务的容器终止,示例代码如下:
在这里插入图片描述
以上示例使用 docker stop 命令终止了容器 test-nginx,接着验证容器状态,示例代码如下:
在这里插入图片描述
从以上示例中可以看出,此时容器为终止状态,接着对容器进行访问测试,示例代码如下:
在这里插入图片描述
从测试结果中可以看出,客户端请求被拒绝,服务已关闭。与暂停状态的容器不同是,终止状态的容器会给客户端发送拒绝的回应。

下面使用 docker start 命令将终止状态的容器唤醒,示例代码如下:
在这里插入图片描述
示例中使用 docker start 命令对处于终止状态的容器进行了唤醒,接着查看容器此刻状态,示例代码如下:
在这里插入图片描述
从以上示例中可以看出,此时容器状态为运行状态。接着对该容器进行访问测试,示例代码如下:
在这里插入图片描述
通过访问测试结果可以看出,此时容器中的服务已经可以正常访问。

2.2 docker attach与docker exec

在企业中,运维工程师与开发工程师都可能会有进入容器内部的需求。

但是不建议使用SSHSecure Shell)登录容器,因为这违背了一个容器里只有一个进程的原则,同时增加了被攻击的风险。

建议使用以下两种 Docker 原生方式进入容器。

🍑 docker attach

通过 docker attach 命令可以进入到一个已经在运行容器的虚拟输入设备,然后执行其他命令。

下面演示 docker attach 命令的使用方式。

创建任意一个容器,这里以 CentOS 为例,示例代码如下:
在这里插入图片描述
此时 CentOS 容器已经创建成功,接着使用 docker attach 命令与容器 ID 号进入容器中,示例代码如下:
在这里插入图片描述
在以上示例中,不仅进入了容器,还对容器执行了 ls 命令,说明此时已经可以在命令行直接对容器进行操作。

在退出容器时需要注意的是,直接从容器中使用 exit 命令或者 Ctrl+d 组合键退出容器,会导致容器终止。如果想要退出当前容器,并且不终止容器,可以使用 Ctrl+P+Q 组合键退出终端。下面进行示例演示,示例代码如下:
在这里插入图片描述
从以上示例中可以看到,容器已经被终止。接着将容器启动并进入容器,再使用 Ctrl+P+Q 组合键退出,示例代码如下:
在这里插入图片描述
上述示例启动了容器并使用 Ctrl+P+Q 组合键退出了容器,接着查看当前容器状态,示例代码如下:
在这里插入图片描述
上述示例中可以看到,容器处于运行状态,并没有被终止。

docker attach 还有有共享屏幕的功能,两个终端同时使用 docker attach 进入同一个容器时可以看到同步操作。如图所示:
在这里插入图片描述

🍑 docker exec

下面对 exec 的参数进行介绍,如表所示。
在这里插入图片描述
docker exec 可以在宿主机上向运行的容器传输命令,示例代码如下:
在这里插入图片描述
以上示例通过 docker exec 命令向容器发送 ls 命令,并将结果回显至终端。

下面创建一个新容器,并为容器启动一个虚拟终端,使用命令行对容器进行操作,示例代码如下:
在这里插入图片描述
上述示例通过虚拟终端对容器进行一系列的操作。接着使用 exit 命令退出容器,并查看容器状态,示例代码如下:
在这里插入图片描述
以上示例使用 exit 命令退出了容器,但容器仍在运行状态。

这说明 docker execdocker attach 不同,在使用 exec 进入的容器中执行 exit 命令不会终止容器,只会退出当前 bash 终端。

所以在工作中,建议大家使用 docker exec 命令进入容器,这样不容易出现操作失误。

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

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

相关文章

操作系统4

文件管理 文件的逻辑结构 文件的目录 文件的物理结构 文件存储空间管理 文件的基本操作

stm32内存杂记

从上图中可以看出SRAM空间用来存放:1.各个文件中声明和定义的全局变量、静态数据和常量;2.未初始化的全局变量;3.HEAP区;4.STACK区 这是在.map文件中,双击工程target打开 堆栈是处于以0x2000xx地址处的 EQU伪代码&…

跟着《代码随想录》刷题(七)——回溯算法

7.1 组合问题 77、组合 LeetCode&#xff1a;77、组合 &#xff08;1&#xff09;未剪枝优化 class Solution { private:vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, i…

SMB协议简单免费搭建个人winNAS

SMB协议&#xff0c;让PC变身小型winNAS&#xff0c;简单免费搭建个人winNAS 打开SMB服务设置共享文件夹远程连接 SMB 的优点之一是兼容性好&#xff0c;在各平台获得了广泛支持&#xff0c;包括 Windows、Linux、macOS 等各系统挂载访问都很方便。另外 SMB 也是各种电视、电视…

Arcgis通过模型构建器计算几何坐标

模型 模型中&#xff0c;先添加字段&#xff0c;再计算字段 计算字段 模型的计算字段中&#xff0c;表达式是类似这样写的&#xff0c;其中Xmin表示X坐标&#xff0c;Ymin表示Y坐标 !Shape.extent.Xmin!

免费商用 Meta 发布开源大语言模型 Llama 2

Meta 和微软深度合作&#xff0c;正式推出下一代开源大语言模型 Llama 2&#xff0c;并宣布免费提供给研究和商业使用。 Llama 2 论文地址&#xff1a;Llama 2: Open Foundation and Fine-Tuned Chat Models 据介绍&#xff0c;相比于 Llama 1&#xff0c;Llama 2 的训练数据多…

开源Blazor UI组件库精选:让你的Blazor项目焕然一新!

今天给大家推荐一些开源、美观的Blazor UI组件库&#xff0c;这些优秀的开源框架和项目不仅能够帮助开发者们提高开发效率&#xff0c;还能够为他们的项目带来更加丰富的用户体验。 注&#xff1a;排名不分先后&#xff0c;都是十分优秀的开源框架和项目 ​Ant Design Blazor…

Elastic Search 8.9:与 RRF 的混合搜索、更快的矢量搜索和面向公众的搜索端点

作者&#xff1a;Nick Chow, Dana Juratoni, Gilad Gal Elastic Search 8.9 引入了带有倒数排名融合 (RRF) 的混合搜索&#xff0c;以结合矢量、关键字和语义技术以获得更好的结果。 此版本还提高了矢量搜索和摄取的性能&#xff0c;响应时间加快了 30% 以上。 用户还可以通过新…

制作DBC文件

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ DBC文件是CAN通讯的密码本&#xff0c;Matlab的SimuLink中常用DBC作为CAN通讯的解析桥梁 制作DBC文件&#xff0c;内容是转速、位置&…

爆肝!《Java 权威面试指南(阿里版)》,冲击“金九银十”有望了

这次金九银十你准备好了吗&#xff1f; 莫慌莫慌&#xff0c;“面试造火箭&#xff0c;工作拧螺丝” 说得不无道理&#xff0c;偶然从朋友那得到的这份 Alibaba 内部疯传《Java 权威面试指南&#xff08;阿里版&#xff09;》堪称精品&#xff0c;或可能助你一臂之力&#xff…

源码安装lighttpd

lighttpd是一个德国人领导的开源web服务器软件&#xff0c;其根本的目的是提供一个专门针对高性能网站&#xff0c;安全、快速、兼容性好并且灵活的webserver环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。 1、准备环境&#xff1a; yum -y install…

RabbitMQ 教程 | RabbitMQ 进阶

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

动手学深度学习v2笔记 —— 线性回归 + 基础优化算法

二 动手学深度学习v2 —— 线性回归 基础优化算法 目录: 线性回归基础优化方法 1. 线性回归 总结 线性回归是对n维输入的加权&#xff0c;外加偏差使用平方损失来衡量预测值和真实值的差异线性回归有显示解线性回归可以看作是单层神经网络 2. 基础优化方法 梯度下降 小批量…

Qt/C++音视频开发50-不同ffmpeg版本之间的差异处理

一、前言 ffmpeg的版本众多&#xff0c;从2010年开始计算的项目的话&#xff0c;基本上还在使用的有ffmpeg2/3/4/5/6&#xff0c;最近几年版本彪的比较厉害&#xff0c;直接4/5/6&#xff0c;大版本之间接口有一些变化&#xff0c;特别是一些废弃接口被彻底删除了&#xff0c;…

Arcis中三维面转二维面

1、如何查看面是三维面 打开面属性表&#xff0c;查看SHAPE字段&#xff0c;是带“ZM”的就是三维面 不带”ZM“的就是二维面 2、三维面转二维面 在转换的过程中&#xff0c;通过设置环境下的参数&#xff0c;可以转换

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(3)

1005 Out of Control 先将序列a升序,然后离散化 比如说序列a为1000 1000 500 200 10,然后升序后为10 200 500 1000 1000,映射到从1开始的数,为1 2 3 4 4,此即为前缀最大值序列,比如说5 3 4 6 7的前缀最大值序列为5 5 5 6 7 动态规划 f[i][j]表示长度为i的前缀最大值序列中,j为…

leetcode 1005. K 次取反后最大化的数组和

2023.7.30 本题思路如下&#xff1a; 按绝对值大小将数组进行从大到小的排序。遍历数组&#xff0c;若当前元素为负数则修改其符号。遍历完之后&#xff0c;判断k是否为奇数&#xff0c;若为奇数&#xff0c;则还需要修改一次符号&#xff0c;此时修改绝对值最小的那个数的符号…

opencv顺时针,逆时针旋转视频并保存视频

原视频 代码 import cv2# 打开视频文件 video cv2.VideoCapture(inference/video/lianzhang.mp4)# 获取原视频的宽度和高度 width int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建视频编写器并设置输出视频参数 fourcc …

无涯教程-jQuery - Dropable移动函数

Drop-able 功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用可放置功能。 Drop able - 语法 $( "#droppable" ).droppable(); Drop able - 示例 以下是一个简单的示例&#xff0c;显示了drop-able的用法- <html><head><title>…

【数理知识】刚体 rigid body 及刚体的运动

文章目录 1 刚体2 刚体一般运动1 平移运动2 旋转运动 Ref 1 刚体 刚体是指在运动中和受力作用后&#xff0c;形状和大小不变&#xff0c;而且内部各点的相对位置不变的物体。绝对刚体实际上是不存在的&#xff0c;只是一种理想模型&#xff0c;因为任何物体在受力作用后&#…