Docker 如何安全地进入到容器内部

33f69c874ecddde10604d556af68b239.gif

作者 | 飞向星的客机

来源 | CSDN博客

🌟 前言

镜像是构建容器的蓝图,Docker 以镜像为模板,构建出容器。

容器在镜像的基础上被构建,也在镜像的基础上运行,容器依赖于镜像。

本文将对 容器的运行 及相关内容进行详细讲解。

2793621fdbd5bd3681bf6a111c26b1a1.png

31cc42cb7da0ede70d66fcae82c1c1db.png

容器运行

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

使用 docker run 命令可以运行容器,该命令底层其实是 docker create 与 docker start 两条命令的结合体,运行容器需要先基于镜像创建一个容器,然后启动容器,完成一个容器的运行,如图所示👇

d5aa4f3d767a0a105490349f4ea4bbe3.png

例如,基于镜像启动一个新容器,并打印当月的日历,示例代码如下:

0d41d16ed3b1d3675060af152325481b.png

从以上示例中可以看到日历已经被打印出来,但无法看到容器是否运行。

ps 命令在 Linux 系统中被用来查看进程,在 Docker 中被用来查看容器,因为运行中的容器也是一个进程,示例代码如下:

fac1f0acf9736742b4e2e4a98b720956.png

从以上示例中可以看到,一个 Docker 容器以 CentOS 镜像为基础运行,并传了一个 cal(打印当前月份日历)命令,容器正常启动并执行了 cal 命令。

除此之外,还可以通过指定参数,启动一个bash交互终端,代码如下:

450c89763c8b7629e00fcfe6d1c6ab7f.png

上述代码创建了一个交互式的容器,并分配了一个伪终端,使用户可以通过命令行与容器进行交互。终端对宿主机进行直接操作,宿主机通过一个虚拟终端将对 Docker 的指令传输给容器,这个虚拟终端就是伪终端,对容器进行直接操作。

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

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

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

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

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

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

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

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

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

下面运行一个容器,并使用终端对其进行操作,示例代码如下:

f374eefc6925bfab6fa7aabaeaa479f1.png

以上命令执行成功的前提是本地含有 CentOS 镜像。其中,-i 表示捕获标准输入输出,-t 表示分配一个终端或控制台。

下面运行一个容器,并为其设置环境变量,示例代码如下:

19e0e4eb6cd57604069308261c1a5288.png

其中,-e 参数是在创建容器时为容器配置环境变量。

此时已经成功创建了一个容器,接着查看它的环境变量,示例代码如下:

0e77a4adb93741f7bbac0410d229c533.png

从以上示例中可以看到,key=1000 的环境变量已经设置成功。

🍇 自动重启的容器

下面运行一个正常的容器,示例代码如下:

91b44a67e3edf28528e5f328d4701ee6.png

在新创建的容器中,使用 exit 命令即可退出容器,但容器也将停止运行。

查看容器状态,示例代码如下:

2b99976366a54e577964eb42579c7727.png

可以看到,容器此时的状态为 “Exited”,说明容器处于终止状态。

下面运行一个添加参数的容器,示例代码如下:

7fa9c79c826a314c410573edc7611ec2.png

不出意外的话,此时容器应该是终止状态。

接着,验证容器的状态,示例代码如下:

adbbd39fda0a4694bfb471ff26a30e67.png

从示例中可以看到,容器此时不是终止状态,而是运行状态。这是由于添加了 –restart 参数的容器被终止后自动重启。

🍇 自定义名称的容器

下面运行一个自定义名称的容器,示例代码如下:

c42746ba168c56918e0b33f363f07643.png

从示例中可以看到,创建容器时添加了 -name 参数来定义容器名称。创建之后容器的名字就是指定的 “test”。

🍇 开启端口的容器

下面创建一个开启 80 端口的容器,示例代码如下:

3b301a1cfee7d2d77fdc2530482751c1.png

参数冒号之前是宿主机端口号,冒号之后是容器的端口号,表示宿主机的 80 端口映射到容器的 80 端口上。

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

为了验证,使用 curl 工具访问容器端口,示例代码如下:

137fdf7c6520bf5907108570d71e5060.png

访问容器 80 端口的返回值为 200,说明容器端口能够被用户正常访问。

接下来,将容器停止,并再次访问容器端口,示例代码如下:

2d8558a3d4af1bf22532a77db4d51799.png

再次访问容器端口时,连接被拒绝,说明先前的服务由是 Docker 容器来提供的,只是通过宿主机的端口向外网开放。

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

首先在宿主机上创建需要共享的目录与文件,示例代码如下:

998aebd9fd1eded5d6804eef5dd3c3d6.png

已经在 /root/test/ 目录下别创建了 a.txt 与 b.txt 两个文件,接着创建一个可以共享这两个文件的容器,示例代码如下:

d20a510e69ef253beab60d06af130b1e.png

-v 参数用来指定文件路径,–privileged 参数用来给用户添加操作权限。

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

d11df5e0f5cce1d39288bb54ae46341f.png

进入容器

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

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

2.1 容器的三种状态

🍑 运行状态

运行一个名为 test-nginx 的 Nginx 容器,并将容器 80 端口映射到宿主机 80 端口,示例代码如下:

046669ddb88b5211e9a4ef3320d10766.png

这时,容器已经创建完成,通过 ps 命令查看容器是否为运行状态,示例代码如下:

fa0a726ff4fd6e5a275a0d99f5f05d56.png

从以上示例中可以看出,此时容器状态为运行状态。

🍑 暂停状态

下面通过命令使容器进入暂停状态,示例代码如下:

558bd2f7f9c07d354fdfe8f85cf7c7ed.png

docker pause 是暂停容器的命令,上述示例中,暂停了名为 test-nginx 的容器。

接着通过命令查看容器是否成功暂停,示例代码如下:

bb1791cd2ae2066182503a8854f11b5f.png

从以上示例中可以看到,容器仍是运行状态,但同时也是暂停状态。

接着通过 curl 工具对该容器进行访问测试,示例代码如下:

e01f64eab8907bf3980fa9542ee7dd01.png

通过访问测试发现,此时无法访问到容器网页,但是服务器没有拒绝连接,说明暂停容器的本质是暂停容器中的服务。

下面使用 docker unpause 命令使暂停状态的容器终止暂停状态,示例代码如下:

6aa8c365856eebcc432009d83bc2c33e.png

此时,命令执行完毕,接着查看容器状态,示例代码如下:

1c2ae111f899a687d713ffe73621fd21.png

从以上代码中可以看到,暂停状态已经被终止,容器只处于运行状态。

接着用 curl 工具对容器进行访问测试,示例代码如下:

cb41b964d03553e314e33ba824a5c58d.png

从以上示例中可以看到,此时网站已经可以正常访问,说明容器中的服务正常运行。

🍑 终止状态

当不再需要某一个业务继续运行时,就要通过命令使该业务的容器终止,示例代码如下:

0566b4238c5615c3b3fa1b65ed7ef962.png

以上示例使用 docker stop 命令终止了容器 test-nginx,接着验证容器状态,示例代码如下:

f92f241c3cdc382620000e587bc8a42b.png

从以上示例中可以看出,此时容器为终止状态,接着对容器进行访问测试,示例代码如下:

afb59ea12e6dcb03ce7d53254d470f72.png

从测试结果中可以看出,客户端请求被拒绝,服务已关闭。与暂停状态的容器不同是,终止状态的容器会给客户端发送拒绝的回应。

下面使用 docker start 命令将终止状态的容器唤醒,示例代码如下:

d02fdc25d1644138cd0efb0f4678f6ac.png

示例中使用 docker start 命令对处于终止状态的容器进行了唤醒,接着查看容器此刻状态,示例代码如下:

dec3c160c11c79454af3320dc42a8ea0.png

从以上示例中可以看出,此时容器状态为运行状态。接着对该容器进行访问测试,示例代码如下:

f7e09534a6b026673b9bb249f6432188.png

通过访问测试结果可以看出,此时容器中的服务已经可以正常访问。

2.2 docker attach 与 docker exec

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

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

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

🍑 docker attach

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

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

创建任意一个容器,这里以 CentOS 为例,示例代码如下:

5122d08ed74b9278884d5535e461fadc.png

此时 CentOS 容器已经创建成功,接着使用 docker attach 命令与容器 ID 号进入容器中,示例代码如下:

6b8b3d0d0873f4de3b8d0fb0e1bc0f5f.png

在以上示例中,不仅进入了容器,还对容器执行了 ls 命令,说明此时已经可以在命令行直接对容器进行操作。

在退出容器时需要注意的是,直接从容器中使用 exit 命令或者 Ctrl+d 组合键退出容器,会导致容器终止。如果想要退出当前容器,并且不终止容器,可以使用 Ctrl+P+Q 组合键退出终端。下面进行示例演示,示例代码如下:

02fcbc91395d615c30445bb671e6aa98.png

从以上示例中可以看到,容器已经被终止。接着将容器启动并进入容器,再使用 Ctrl+P+Q 组合键退出,示例代码如下:

79de27410cf313ac2eb9ed78e80784d9.png

上述示例启动了容器并使用 Ctrl+P+Q 组合键退出了容器,接着查看当前容器状态,示例代码如下:

16ea55379642c20e4eb754c060a154c2.png

上述示例中可以看到,容器处于运行状态,并没有被终止。

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

4ae68f4f75a5f26b1cf59205339e7153.png

🍑 docker exec

下面对 exec 的参数进行介绍,如表所示。

c6234953479ae419981e87f3e3757970.png

docker exec 可以在宿主机上向运行的容器传输命令,示例代码如下:

3d1b13b503a0ba8de461f823e49750d0.png

以上示例通过 docker exec 命令向容器发送 ls 命令,并将结果回显至终端。

下面创建一个新容器,并为容器启动一个虚拟终端,使用命令行对容器进行操作,示例代码如下:

7e502ca8d1884deb7636cf8f71656b6e.png

上述示例通过虚拟终端对容器进行一系列的操作。接着使用 exit 命令退出容器,并查看容器状态,示例代码如下:

de5545d16206bf7a6ecbcc12e31941c3.png

以上示例使用 exit 命令退出了容器,但容器仍在运行状态。

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

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

9b3d17ab4265e95b83d1dafb6b3c7aa1.gif

往期推荐

read 文件一个字节实际会发生多大的磁盘IO?

Docker 容器为什么傲娇?全靠镜像撑腰!

Redis 内存满了怎么办?这样置才正确!

云原生的本手、妙手和俗手

968cd33c06dbbf568c588a95fa164e80.gif

点分享

da34ad72b761b13122c1185527a3e7b2.gif

点收藏

6b0f4ef5ab72bf74a3bbbb812d74b4ac.gif

点点赞

d9274d2d4fb456a1c659c1621127056b.gif

点在看

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

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

相关文章

KubeVela v1.2 发布:你要的图形化操作控制台 VelaUX 终于来了

简介:时间来到 2022 年,KubeVela 也正式进入了第四个阶段,在原先核心控制器 API 基本稳定的基础上,我们以插件的形式增加了一系列开箱即用的功能。让开发者可以通过 UI 控制台的方式,连接 CI/CD 完整流程,端…

c语言水仙花数(输入判断),用c语言判断一个数是否为水仙花数?

你的C语言程序我帮你改完了,完整的程序如下(改动的地方见注释)#includeint narcissistic(int number){//这里n1改成n0并加product变量保存连乘积int a,b0,n0,c,number2,number3,product;number2number;number3number;while(number>0){//这里把number>10改成number>0nu…

云原生的 CICD 框架:Tekton

作者 | AddoZhang来源 | 云原生指北Tekton 是 Google 开源的 Kubernetes 原生CI/CD 系统,功能强大扩展性强。前身是 Knavite 里的 build-pipeline 项目,后期孵化成独立的项目。并成为 CDF 下的四个项目之一, 其他三个分别是 Jenkins, Jenkins X, Spinnak…

人人都是 Serverless 架构师 | “盲盒抽奖”创意营销活动实践

简介:当 Serverless 与低代码这两个不同的技术共同相交于同一个业务时会有怎样的价值展现?本文以 “盲盒抽奖” 这个 Serverless Devs 做过的创意营销活动为例,为大家讲述 Serverless 和低代码是如何搭配来满足一个业务诉求的。 作者 | 寒斜 …

这样才是代码管理和 Commit 的正确姿势 | 研发效能提升36计

简介:效能提升从小习惯开始,这样才是代码管理和 Commit 的正确姿势! 专栏策划|雅纯 志愿编辑|张晟 软件交付是以代码为中心的交付过程,其中代码的作用有几点:第一,最终的制品要交付…

vSphere+、vSAN+来了!VMware 混合云聚焦:原生、快速迁移、混合负载

编辑 | 宋慧 出品 | CSDN云计算 vSphere、vSAN,从云计算兴起,就是 VMware 在虚拟化、分布式存储里大名鼎鼎的核心技术产品。不过随着云的发展到云原生、以及国内混合云快速发展的今天,虚拟化的领导者 VMware 有哪些最新的方案,值…

技术解读:实时数仓Hologres如何支持超大规模部署与运维

简介:在本次评测中,Hologres是目前通过中国信通院大数据产品分布式分析型数据库大规模性能评测的规模最大的MPP数据仓库产品。通过该评测,证明了阿里云实时数仓Hologres能够作为数据仓库和大数据平台的基础设施,可以满足用户建设大…

成功通航:用宜搭提升数字化管理效能,确保每次飞行任务安全执行

简介:宜搭帮助山西成功通航节省了100万左右的成本,同时使管理运营效率提升了76%。 山西成功通用航空股份有限公司 50-100人 / 航空运输 / 山西-长治 / 成功通航综合管理平台 “通用航空迎来发展机遇,随着通航行业‘放管服’政策的不断推进…

用键盘输入一条命令

作者 | 闪客来源 | 低并发编程新建一个非常简单的 info.txt 文件。name:flash age:28 language:java在命令行输入一条十分简单的命令。[rootlinux0.11] cat info.txt | wc -l 3这条命令的意思是读取刚刚的 info.txt 文件,输出它的行数。我们先从最初始的状态开始说起…

Redis 7.0 Multi Part AOF的设计和实现

简介:本文将详解Redis中现有AOF机制的一些不足以及Redis 7.0中引入的Multi Part AOF的设计和实现细节。 Redis 作为一种非常流行的内存数据库,通过将数据保存在内存中,Redis 得以拥有极高的读写性能。但是一旦进程退出,Redis 的数…

面向B端算法实时业务支撑的工程实践

简介:在营销场景下,算法同学会对广告主提供个性化的营销工具,帮助广告主更好的精细化营销,在可控成本内实现更好的ROI提升。我们在这一段时间支持了多个实时业务场景,比如出价策略的实时化预估、关键词批量服务同步、实…

中间表是如何被消灭的?

作者 | 不吃西红柿来源 | CSDN博客中间表的产生中间表是数据库中专门存放中间计算结果的数据表,往往是为了前端查询统计更快或更方便而在数据库中建立的汇总表,由于是由原始数据加工而成的中间结果,因此被称为中间表。在某些大型机构中&#…

自定义控件android.r,Android控件架构与自定义控件

前言最近在开发的路上越走越远了,每天在看各位大神公众号更新内容是自定义View的时候,一些小的内容有点模具,决定回过头来温习一下过往的内容。此篇也是根据android群英传来总结的一篇文章。1 Android控件架构Android的每个控件都是占一块矩形…

基于 PTS 压测轻松玩转问题诊断

简介:性能测试 PTS(Performance Testing Service)是具备强大的分布式压测能力的 SaaS 压测平台,可模拟海量用户的真实业务场景,全方位验证业务站点的性能、容量和稳定性。 作者:智云 为什么要做压测的问题…

阿里云开源业内首个应用多活项目 AppActive,与社区共建云原生容灾标准

简介:继高可用架构团队的 Sentinel、Chaosblade 开源后,第三个重磅高可用产品:应用多活 AppActive 正式开源,形成高可用的三架马车,帮助企业构建稳定可靠的企业级生产系统,提高企业面对容灾、容错、容量等问…

清晰还原31年前现场,火山引擎超清修复Beyond经典演唱会

7月3日晚,抖音携手环球音乐旗下厂牌宝丽金,直播经过火山引擎超清修复的Beyond Live1991生命接触演唱会及纪念音乐会精选内容,吸引了超1.4亿人次观看。 Beyond是一支成立于1983年的摇滚乐队,随着粤语音乐的兴起,Beyond…

如何定位并修复 HttpCore5 中的 HTTP2 流量控制问题

简介:开篇吹一波阿里云性能测试服务 PTS,PTS 在 2021 年 5 月份已经上线了对 HTTP2 协议的支持(底层依赖 httpclient5),在压测时会通过与服务端协商的结果来决定使用 HTTP1.1 或者 HTTP2 协议。 作者:风起…

全链路灰度之 RocketMQ 灰度

简介:本文将以上次介绍过的《如何用 20 分钟就能获得同款企业级全链路灰度能力?》中的场景为基础,来进一步介绍消息场景的全链路灰度。 作者:亦盏 之前的系列文章中,我们已经通过全链路金丝雀发布这个功能来介绍了 M…

普洛斯数据中心发布DC Brain系统,科技赋能智慧化运营管理

7月5日,普洛斯数据中心发布了DC Brain智慧化运营管理系统。该系统由普洛斯历时两年自主研发,契合现代化数据中心平台的发展趋势。目前已应用于普洛斯旗下数据中心,并有对外输出的成功案例,面向行业,赋能中小规模运营商…

mi6 android版本,小米6:我依旧是王,MIUI10.4.2稳定版与AndroidP同时到来

原标题:小米6:我依旧是王,MIUI10.4.2稳定版与AndroidP同时到来小米6作为小米数字系列最受欢迎的机型之一,从上市到下架热度一直未减,它也是众多米粉心目中小米数字系列最成功的机型没有之一。但是,再怎么讲…