容器 订阅
容器是指用以容纳物料并以壳体为主的基本装置。常用作储存设备或其他化工设备的外壳。主要由壳体、封头、接管、法兰和支座组成。对容器的基本要求是:满足工艺需要;保证操作安全,包括具有足够的强度、刚度以及密封性;耐腐蚀,具有一定的使用寿命;便于制造、安装、维修和使用;成本低,材料节省,尤其要节约不锈钢和有色金属等贵重材料。容器在化工生产中应用广泛,按压力分有真空、常压、外压的压力容器,压力容器又可分低压、中压、高压及超高压容器;按温度分有常温、低温及高温容器;按筒体结构分有单层容器和多层容器;按工艺用途分有储存、分离、反应及换热容器;按厚度分有薄壁和厚壁容器。 [1] 展开全文
容器是指用以容纳物料并以壳体为主的基本装置。常用作储存设备或其他化工设备的外壳。主要由壳体、封头、接管、法兰和支座组成。对容器的基本要求是:满足工艺需要;保证操作安全,包括具有足够的强度、刚度以及密封性;耐腐蚀,具有一定的使用寿命;便于制造、安装、维修和使用;成本低,材料节省,尤其要节约不锈钢和有色金属等贵重材料。容器在化工生产中应用广泛,按压力分有真空、常压、外压的压力容器,压力容器又可分低压、中压、高压及超高压容器;按温度分有常温、低温及高温容器;按筒体结构分有单层容器和多层容器;按工艺用途分有储存、分离、反应及换热容器;按厚度分有薄壁和厚壁容器。 [1]
信息
定义1
包装或装载物品的贮存器
外文名
container;vessel
材    质
金属 非金属
用    途
装载物品
中文名
容器
定义2
能将其他控件放置在其上面的控件
容器计算机
能够将其他控件放置在其上面的控件,如VB中的Frame控件或PictureBox控件等。容器是应用服务器中位于组件和平台之间的接口集合。容器是伴随着瘦客户端系统的发展而诞生的。在开发瘦客户端系统时,开发人员要花费大量的精力去关注线程安全、事务、网络、资源等等细节,从而降低了开发效率。由于这些对这些细节的解决方法一般是固定不变,或者只有参数改变的,所以从代码重用和设计模式的角度出发,开发人员将这些底层细节提取出来,做成平台,并提供一定的接口。这样,业务开发人员就不需要在关注与这些底层细节的实现,而专注于业务逻辑的实现。容器一般位于应用服务器之内,由应用服务器负责加载和维护。一个容器只能存在于一个应用服务器之内,一个应用服务器可以建立和维护多个容器。容器一般遵守可配置的原则,即容器的使用者可以通过对容器参数的配置,来达到自己的使用需求,而不需要修改容器的代码。定义容器是用来存储和组织其他对象的对象。实现链表的类就是一个容器的示例。如vectormydata;//创建存储double类型值的容器mydata可以在容器中存储基本类型或任何类类型的条目。如果STL容器模板的类型实参是一个类类型,那么容器可以存储该类型的对象或者任何派生类类型的对象。通常,容器存储我们存储在其中的对象的副本,它们自动分配和管理对象占用的内存。当销毁某个容器的对象时,容器会负责销毁它包含的对象并释放它们占用的内存。使用STL容器存储对象的一个优点是我们不用费心管理它们的内存。 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。STL容器类的模板容器部分主要由头文件,,,,,组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。数据结构描述实现头文件向量(vector)连续存储的元素列表(list)由节点组成的双向链表,每个结点包含着一个元素双队列(deque)连续存储的指向不同元素的指针所组成的数组集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的位次排列,没有两个不同的元素能够拥有相同的次序多重集合(multiset)允许存在两个次序相等的元素的集合栈(stack)后进先出的值的排列队列(queue)先进先出的值的排列优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列多重映射(multimap)允许键对有相等的次序的映射为所有容器定义的操作
收起全文
精华内容
下载资源
问答
  • 2022-06-04 20:19:18

    🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
    ✒️个人主页:小鹏linux
    💊个人社区:小鹏linux(个人社区)欢迎您的加入!
    🧊系列专栏:
            🎒  阶段一:windows基础
            🎒  阶段二:Linux基础知识
            🎒  阶段三:shell基础+shell高级
            🎒  阶段四:学会python,逆天改命
            🎒  阶段五:Linux网络服务
            🎒  阶段六:集群原理及架构
            🎒  阶段七:云计算之Docker 
            🎒  阶段八:云计算之kubernetes(k8s)
            🎒  阶段九:云服务器的使用和故障解决
            🎒  阶段十:技能提升

    目录

    1. 镜像和容器

    2. 新建并启动容器

    3. 使用第一个容器

    4. 容器命名

    5.重启容器

    6. 附着到容器上

     👑👑👑结束语👑👑👑


    1. 镜像和容器

    看待镜像和容器的一种方式是将它们类比成程序与进程。一个进程可以视为一个被执行的应用程序,同样,一个Docker容器可以视为一个运行中的Docker镜像。
    标题Docker镜像与容器
    如果大家熟悉面向对象原理,看待镜像和容器的另一种方法是将镜像看作类而将容器看作对象。对象是类的具体实例,同样,容器是镜像的实例。用户可以从单个镜像创建多个容器,就像对象一样,它们之间全都是相互隔离的。不论用户在对象内修改了什么,都不会影响类的定义——它们从根本上就是不同的东西。

    2. 新建并启动容器

    首先,我们会查看Docker是否能正常工作,然后学习基本的Docker的工作流:创建并管理容器。我们将浏览容器的典型生命周期:从创建、管理到停止,直到最终删除。
    第一步,查看docker程序是否存在,功能是否正常:
    [root@localhost ~]# sudo docker info
    Containers: 1
    Images: 8
    Storage Driver: aufs
        Root Dir: /var/lib/docker/aufs
        Backing Filesystem: extfs
        Dirs: 10
    Execution Driver: native-0.2
    Kernel Version: 3.13.0-43-generic
    Operating System: Ubuntu 14.04.2 LTS
    CPUs: 1
    Total Memory: 994 MiB
    Name: riemanna
    ID: DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:GO3V:NDR7:YW6E:VFXT:FXHM WARNING: No swap limit support

    在这里我们调用了docker可执行程序的info命令,该命令会返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。

    Docker是基于客户端-服务器构架的。它有一个docker程序,既能作为客户端,也可以作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求(如请求返回守护进程自身的信息),然后再对返回的请求结果进行处理。
    现在,让我们尝试启动第一个Docker容器。我们可以使用docker run命令创建容器。
    docker run命令提供了Docker容器的创建到启动的功能:
    [root@localhost ~]# sudo docker run -i -t ubuntu /bin/bash
    Unable to find image 'ubuntu' locally
    ubuntu:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete
    d497ad3926c8: Pull complete
    ccb62158e970: Pull complete
    e791be0477f2: Pull complete
    3680052c0f5c: Pull complete
    22093c35d77b: Pull complete
    5506de2b643b: Pull complete
    Status: Downloaded newer image for ubuntu:latest
    root@fcd78e1a3569:/#
    官方文档列出了完整的Docker命令列表,也可以使用docker help获取这些命令。此外,还可以使用Docker的man页(即执行man docker-run)。
    [root@localhost ~]# sudo docker run -i -t ubuntu /bin/bash

    上述命令中:

            -t  选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
            -i  则让容器的标准输入保持打开。
    利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
            ·检查本地是否存在指定的镜像,不存在就从公有仓库下载;
            ·利用镜像创建一个容器,并启动该容器;
            ·分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
            ·从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
            ·从网桥的地址池配置一个IP地址给容器;
            ·执行用户指定的应用程序;
            ·执行完毕后容器被自动终止。
    官方文档上列出了docker run命令的所有标志,此外还可以用命令docker help run查看这些标志。或者,也可以用Docker的man页(也就是执行man docker-run命令)。
    接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker HubRegistry上。可以以ubuntu基础镜像(以及类似的fedora、debian、centos等镜像)为基础,在选择的操作系统上构建自己的镜像。到目前为止,我们基于此基础镜像启动了一个容器,并且没有对容器增加任何东西。
    首先Docker会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么Docker就会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
    随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个Bash shell。
    当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,这时就可以看到容器内的shell了,如下:
    root@f7cbdac22a02:/#

    3. 使用第一个容器

    现在,我们已经以root用户登录到了新容器中,容器的ID f7cbdac22a02,乍看起来有些令人迷惑的字符串`。这是一个完整的Ubuntu系统,可以用它来做任何事情。下面就来研究一下这个容器。首先,我们可以获取该容器的主机名,如下:
    root@f7cbdac22a02:/# hostname 
    f7cbdac22a02
    可以看到,容器的主机名就是该容器的ID。再来看看/etc/hosts文件内容:
    root@f7cbdac22a02:/# cat /etc/hosts
    172.17.0.4 f7cbdac22a02
    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    Docker已在hosts文件中为该容器的IP地址添加了一条主机配置项。
    再来看看容器的网络配置情况,如下:
    root@f7cbdac22a02:/# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state
        UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
        state UP group default qlen 1000
    link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 scope global eth0
    inet6 fe80::1450:3aff:feb6:f2cc/64 scope link valid_lft forever preferred_lft forever
    可以看到,这里有lo的环回接口,还有IP为172.17.0.4的标准 eth0网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程,如下:
    root@f7cbdac22a02:/# ps -aux
    USER PID %CPU %MEM    VSZ RSS TTY    STAT START TIME COMMAND
    root    1 0.0 0.0    18156 1936 ?    Ss    May30 0:00 /bin/bash 
    root    21 0.0 0.0   15568 1100 ?    R+    02:38 0:00 ps -aux
    接下来尝试安装一个软件包:
    root@f7cbdac22a02:/# apt-get update && apt-get install vim
    通过上述命令,就在容器中安装了Vim编辑器软件。
    用户可以继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。
    但是,容器现在已经停止运行了!只有在指定的/bin/bash命令处于运行状态的时候,我们的容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。
    但容器仍然是存在的,可以用docker ps -a命令查看当前系统中容器的列表,如下:
    CONTAINER ID IMAGE     COMMAND    CREATED  STATUS PORTS NAMES
    1cd57c2cdf7f ubuntu:14.04 "/bin/bash" A minute Exited
        gray_cat
    默认情况下,当执行docker ps命令时,只能看到正在运行的容器。如果指定-a标志的话,那么docker ps命令会列出所有容器,包括正在运行的和已经停止的。
    注意:也可以为docker ps命令指定-l标志,列出最后一个运行的容器,无论其正在运行还是已经停止。也可以通过--format标志,进一步控制显示哪些信息,以及如何显示这些信息
    从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)。我们还可以看到,每个容器都有一个名称。
    有3种方式可以唯一指代容器:短UUID(如f7cbdac22a02)、长UUID(如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名称(如gray_cat)。

    4. 容器命名

    Docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面我们刚刚创建的容器就被命名为gray_cat。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现,如下:
    [root@localhost ~]# sudo docker run --name bob_the_container -i -t ubuntu /bin/bash 
    root@aa3f365f0f4e:/# exit
    上述命令将会创建一个名为bob_the_container的容器。一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字 0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-])
    在很多Docker命令中,都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了。我推荐大家都使用容器名称,以更加方便地管理容器。
    容器的命名必须是唯一的。如果试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。

    5.重启容器

    容器已经停止了,我们可以用下面的命令重新启动一个已经停止的容器,如下:
    [root@localhost ~]# sudo docker start bob_the_container
    除了容器名称,也可以用容器ID来指定容器,
    [root@localhost ~]# sudo docker start aa3f365f0f4e
    也可以使用docker restart命令来重新启动一个容器。
    这时运行不带-a标志的docker ps命令,就应该看到我们的容器已经开始运行了。
    类似地,Docker也提供了docker create命令来创建一个容器,但是并不运行它。这让我们可以在自己的容器工作流中对其进行精准化的控制。

    6. 附着到容器上

    Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们的容器重新启动后会运行一个交互式会话shell。此外,也可以用docker attach命令,重新附着到该容器的会话上,如下:
    [root@localhost ~]# sudo docker attach bob_the_container
    也可以使用容器ID,重新附着到容器的会话上,如下:
    [root@localhost ~]# sudo docker attach aa3f365f0f4e
    现在,又重新回到了容器的Bash提示符,如下:
    root@aa3f365f0f4e:/_#_
    可能需要按下回车键才能进入该会话。
    如果退出容器的shell,容器会再次停止运行。
    容器是直接提供应用服务的组件,也是Docker实现快速启停和高效服务性能的基础。
    在生产环境中,因为容器自身的轻量级特性,推荐大家使用容器时在一组容器前引入HA(High Availability,高可靠性)机制。例如使用HAProxy工具来代理容器访问,这样在容器出现故障时,可以快速切换到功能正常的容器。此外,建议通过指定合适的容器重启策略,来自动重启退出的容器。

     👑👑👑结束语👑👑👑

    更多相关内容
  • 一、服务器和容器 1. Web服务器 2. Web容器 ① Web容器的组成 ② Web容器的作用 3. Servlet容器 ① Servlet容器的作用 ② Servlet容器的工作过程 ③ Servlet ④ Servlet的工作过程 ⑤ Servlet变化过程 4. Spring容器...


    一、服务器和容器

    1. Web服务器

    广义的Web服务器(Web Server):提供web服务的软件或主机,即Web服务器软件或装有Web服务器软件的计算机。

    Web服务器可以处理 HTTP 协议,响应针对静态页面或图片的请求(静态请求),进行页面跳转。

    有的Web服务器还能处理动态请求,它会把动态请求委托其它程序(它的扩展、某种语言的解释引擎(php)、Web容器)。

    常见的Web服务器有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等。

    2. Web容器

    Web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,这个程序就是用来处理从客户端发出的请求的。一个服务器可以有多个容器。

    常见的Web容器有:IIS(asp容器)、Tomcat(servlet容器)、Jboss(EJB容器)。

    其实现在在很多时候,大家对Web服务器和Web容器已经没有了明确的界限。通常把Web服务器和Web容器当成同一个东西在讲。

    文章后面部分所讲的web容器都是以Tomcat容器为例。

    ① Web容器的组成

    Web容器管理Servlet(通过Servlet容器)、监听器(Listener)、过滤器(Filter)等。

    • Servlet:称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,是一个Java类。它负责客户端和服务端的信息交互和处理。

      Servlet不能独立运行(没有main方法),必须存放在Servlet容器中,由Servlet容器去管理Servlet。

    • Filter:Servlet的作用是处理请求,而Filter的作用是拦截请求和放行,在拦截请求后可以修改request和response,实现我们想实现的功能。Filter不能产生一个请求或者响应,只是能对请求或者响应进行拦截。

    • Listener:监听器。它可以监听Application、Session、Request对象,当这些对象发生变化的时候就会调用对应的监听方法。

    ② Web容器的作用

    • 管理和布置Web应用
    • 响应针对静态页面或图片的请求(静态请求
    • 动态请求委托给其他程序(Servlet容器、CGI等等技术)

    ServletFilterListener这些都是在Web容器的掌控范围里。但不在Spring容器和SpringMVC容器的掌控范围里。所以无法在这些类中直接使用Spring注解的方式来自动装配需要的对象,因为Web容器是无法识别Spring注解的。

    Web容器没有Servlet容器,也是可以直接访问静态页面的,比如Apache服务器。但是如果要显示jsp/servlet,就必需要Servlet容器。可是光有Servlet容器也是不够的,因为它需要被解析成html输出,所以仍需要一个Web容器。

    大多数的Web容器都包含Servlet容器,如:Tomcat、Jetty、webLogic。

    3. Servlet容器

    Servlet容器全称server applet,意为服务程序。Servlet容器负责管理Servlet,用与处理动态请求。

    Servlet容器是与Servlet交互的Web服务器的一部分,它可以从Web页面接收请求后再将这些请求重定向到Servlet对象中,然后将动态生成的结果返回到正确的位置中。

    Servlet容器给上级容器(Tomcat)提供doGet()和doPost()等方法。其生命周期实例化、初始化、调用、销毁受控于Tomcat容器。

    利用Servlet容器提供的方法,能轻松的让Servlet与Web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等等。容器知道自己与Web服务器之间的协议,不用担心Web服务器和你自己的Web代码之间的API,只需要考虑如何在Servlet中实现业务逻辑。

    大家通常把Tomcat称作Servlet容器,因为Tomcat就是一个围绕着Servlet工作的一个服务器软件。

    ServletContext与Servlet容器的关系

    ServletContext是Servlet与Servlet容器之间的直接通信的接口。

    Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象。每个web应用有唯一的ServletContext对象。
    同一个Web应用的所有Servlet对象共享一个ServletContext,Servlet对象可以通过它来访问容器中的各种资源。

    为了方便描述,后文直接将ServletContext称作Servlet容器。

    ① Servlet容器的作用

    • 管理Servlet(业务类)

      • 负责加载类、实例化和初始化Servlet
      • 调用Servlet的service方法提供服务
      • 管理Servlet实例的垃圾回收
      • 管理Servlet之间的共同资源(servletContext)
    • 处理动态请求

      • 解析包装请求
      • 调用某个Servlet
      • 将Servlet的执行结果返回给请求端
    • 多线程

      • 自动为它所接收的每个Servlet请求创建一个新的java线程
      • 但是也会出现线程安全问题
    • 实现简便安全

      • 使用xml部署描述文件来配置和修改安全性
    • JSP支持

      • 负责将jsp代码翻译为真正的java代码
    • 管理通信

      • 负责管理servlet与web服务器之间的通信

    ② Servlet容器的工作过程

    • Web服务器接收HTTP请求。
    • Web服务器将请求转发到Servlet容器。
    • 如果对应的Servlet不在容器中,那么将被动态检索并加载到容器的地址空间中。
    • 容器调用init()方法进行初始化(仅在第一次加载 Servlet 时调用一次)。
    • 容器调用Servlet的service()方法来处理HTTP请求,即读取请求中的数据并构建响应。Servlet将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求。
    • Servlet容器将结果返回给Web服务器,Web服务器将动态生成的结果返回到浏览器/客户端。

    ③ Servlet

    Servlet是用来处理客户端请求并产生动态网页内容的Java类,Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

    所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。
    在这里插入图片描述

    ④ Servlet的工作过程

    • 客户端发送请求,请求传递到Servlet容器;
    • Servlet容器将数据转换成服务端可以处理的数据后发给服务端;
    • 当服务端处理完成之后,返回给Servlet容器;
    • Servlet容器将其转换成客户端可以处理的数据交给客户端。

    ⑤ Servlet变化过程

    • 不同请求的处理逻辑不同,于是将逻辑处理这块单独抽取出来成了Servlet
    • 但是Servlet并不擅长往浏览器输出HTML页面,所以出现了JSP
    • 随着三层架构的出现,一些逻辑从Servlet抽取出来,分担到Service和Dao
    • 随着Spring的出现,Servlet开始退居幕后,取而代之的是方便的SpringMVC。

    SpringMVC的核心组件DispatcherServlet其实本质就是一个Servlet。它在原来HttpServlet的基础上,又封装了一条逻辑。

    4. Spring容器

    Spring容器用来管理Service和Dao。

    5. SpringMVC容器

    SpringMVC容器用来管理Controller、视图解析器(view resolvers)等。

    6. SpringBoot容器

    SpringBoot容器是一个应用容器,管理所有bean。

    大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

    二、容器相关知识归纳

    1. 各种容器的管理范围

    • Web容器:管理Listener(监听器)、Filter(过滤器)、间接管理Servlet(通过Servlet容器)
    • Servlet容器:管理Servlet
    • Spring容器:管理Service、Dao
    • SpringMVC容器:管理Controller
    • SpringBoot容器:管理所有Bean

    2. 为何设计父子容器

    在早期的Spring+SpringMVC的项目中,会有父子容器这个概念(Spring容器:父容器;SpringMVC容器:子容器)。

    早期为什么会这样设计呢?

    • 早期Spring为了划分框架边界。将Service、Dao层交给Spring来管理(父容器)、Controller层交给SpringMVC管理(子容器)
    • Spring规定:子容器可以获取父容器的bean,但父容器不可以获取子容器的bean(父子容器的关系就像子类和父类的关系)

    可见,父子容器的设计主要是要是为了方便子容器的切换

    比如:我们想把Web层从SpringMVC替换成Struts, 那么只需要将spring­mvc.xml替换成Struts的配置文件struts.xml即可,而spring­core.xml不需要改变。

    因此才会有网络上大家常说的:Service、Dao无法注入Controller,ControllerService、Dao。

    但需注意:这概念只在Spring+SpringMVC项目中,SpringBoot项目并没有父子容器这个概念。

    3. 父子容器的事务问题

    事务管理器属于Spring容器管理,SpringMVC容器无法访问到事务相关的对象,所以不能在Controller上配置事务。

    三、各种项目中的容器

    1. SpringMVC项目

    ① 项目背景

    • SpringMVC+Tomcat
    • 配置DispatcherServlet的为dispatcherServlet。

    项目用到的容器:Web容器、Servlet容器、SpringMVC容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    Servlet容器的属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的SpringMVC容器就在里面。

    ③ SpringMVC容器

    SpringMVC容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

    SpringMVC容器的主要属性:

    • servletContext:Servlet容器的引用
    • servletConfig:servletConfig的引用
    • beanFactory:DefaultListableBeanFactory类型,管理SpringMVC容器中的所有bean
    • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
    • parent:父容器,值为null

    ④ 容器关系图

    在这里插入图片描述

    2. Spring+SpringMVC项目

    ① 项目背景

    • Spring+SpringMVC+Mybatis+Tomcat
    • 配置DispatcherServlet的为dispatcherServlet。

    项目用到的容器:Web容器、Servlet容器、Spring容器、SpringMVC容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    Servlet容器的属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的Spring容器和SpringMVC容器都在里面。

    ③ Spring容器

    Spring容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是Spring容器对象。

    Spring容器主要属性:

    • servletContext:Servlet容器的引用
    • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
    • parent:父容器,这里Spring容器就是父容器,所以值为null

    ④ SpringMVC容器

    SpringMVC容器是一个XmlWebApplicationContext类型的对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的就是SpringMVC容器对象。

    SpringMVC容器主要属性:

    • servletContext:servletContext的引用
    • servletConfig:servletConfig的引用
    • beanFactory:DefaultListableBeanFactory类型,管理Spring容器中的所有bean
    • configLocations:SpringMVC的配置文件路径,如classpath:springMVC.xml
    • parent:父容器,也就是Spring容器

    ⑤ 父子容器

    在Spring+SpringMVC项目中,Spring容器和SpringMVC容器为父子容器:

    • Spring容器和SpringMVC容器共同管理所有的bean
    • Spring容器管理Service和Dao,SpringMVC容器管理Controller
    • Spring容器为父容器,SpringMVC容器为子容器
    • SpringMVC容器有指向Spring容器的引用,但Spring容器没有指向SpringMVC容器的引用

    所以Controller可以注入Service和Dao对象,但是在Service和Dao里不可以注入Controller对象。

    SpringMVC的拦截器(Interceptor)也是SpringMVC容器管理的,所以Interceptor也是可以可以注入Service和Dao对象的。

    ⑥ 容器创建过程

    容器的创建过程:

    1. Tomcat服务器启动,Servlet容器启动
    2. 创建Spring容器的实例
    3. 创建SpringMVC容器的实例

    容器的详细创建过程可参考文章:Spring+SpringMVC项目中的容器初始化过程

    ⑦ 容器关系图

    在这里插入图片描述

    3. SpringBoot项目

    ① 项目背景

    SpringBoot+内置Tomcat

    SpringBoot项目中的容器:Web容器、Servlet容器、SpringBoot容器。

    对于SpringBoot项目中的容器,大家也常叫做Spring容器,这为了和上面的Spring容器区分开来,称他为SpringBoot容器。

    ② Servlet容器

    全局上下文servletContext(Servlet容器)是一个ApplicationContextFacade类型的对象。

    servletContext对象有三个属性:

        private final Map<String, Class<?>[]> classCache;
        private final Map<String, Method> objectCache;
        private final ApplicationContext context;
    

    servletContext中context属性就是Tomcat的上下文信息。它是一个ApplicationContext类型的对象。

    context中有一个Map类型的属性attributes,我们的SpringBoot容器就在里面。

    ③ SpringBoot容器

    SpringBoot容器是一个AnnotationConfigServletWebServerApplicationContext类型的对象。

    attributes中键为org.springframework.web.context.WebApplicationContext.ROOT的值存的就是SpringBoot容器对象。

    attributes中键为org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet的值存的也是SpringBoot容器对象。

    SpringBoot容器主要属性:

    • servletContext:servletContext的引用
    • beanFactory:DefaultListableBeanFactory类型,管理SpringBoot容器中的所有bean
    • parent:null

    ④ 容器创建过程

    容器的详细创建过程可参考文章:SpringBoot项目中的容器初始化过程

    ⑤ 容器关系图

    在这里插入图片描述

    展开全文
  • 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍容器间内部相互访问和外部访问容器的一些方法,它和前面两篇:容器五种(3+2)网络模式、容器之间单/双向通信 |--link /自定义网络知识点互补。...

    前言 

    本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍容器间内部相互访问和外部访问容器的一些方法,它和前面两篇:容器五种(3+2)网络模式容器之间单/双向通信 |--link /自定义网络知识点互补。

    概述

    通过对本文的学习,可以对docker run-p -P两个参数,有个深入的了解,同时对容器间的访问也会有个深入的认识。这些基本功也会后期学好K8s做一些铺垫,从而打下一个坚实的基础。 

    一、-p -P常见的五种使用方式

    -p(小写)常用方式,多用于生产环境,格式:主机端口:容器端口

    -P(大写) 随机分配端口映射,多用于测试,宿主机会随机映射一个 49000~49900 的端口到映射容器内部的端口。

    1.宿主机随机端口映射容器所有端口

    此处的所有端口,指的是自动匹配容器的内部端口。比如启动的是nginx自动匹配80,映射到80端口;容器是Tomcat,自动匹配8080端口,映射8080端口。

    docker run -d --rm -P nginx:alpine  sleep 30  #注意:这里是大写的P (30s后,容器通过--rm自行销毁)
    docker ps -a  #查看端口自动分配情况

    2.宿主机随机端口映射容器的指定端口

    docker run -d --rm -p 80 nginx:alpine  sleep 30  #注意:这里是小写的p, 这个80是容器内的80端口docker ps -a  #查看端口自动分配情况

    3.宿主机指定端口映射容器指定端口(常用)

    docker run -it -p 80:80 nginx /bin/bash
    docker run -it -p 8080:80 nginx /bin/bash
    docker run -it -p 443:443 nginx /bin/bash
    docker run -it -p 80:80 -p 443:443 nginx /bin/bash   #给一个容器指定多个端口映射
    docker run -it -p 80:80 -p 443:443 --restart=always   nginx    #容器出现异常,自尝试重新启动

    4.宿主机指定IP+端口映射容器指定端口

    docker run -it -p 192.168.31.100:8080:80 nginx /bin/bash

    5.宿主机指定IP+随机端口映射容器指定端口

    docker run -it -p 192.168.31.100::80 nginx /bin/bash

    二、在容器外部访问容器 

    访问原理:

    需要把容器的内部端口,通过-p或-P做映射,从而把宿主机的端口暴露给外界,供外界访问,从而间接的访问到容器内部。

    比如:docker run -p 8000:8080,后面的8080就是容器内部的端口,8000就是宿主机的端口,也是8080的映射端口,外界通过宿主机的8000端口来间接访问容器内部的8080端口。

    理论总是有些绕口,看实战吧! 

    1.示例1,通过-P做映射,外部浏览器访问容器

    docker run -d -P --name mytomcat tomcat:8.5.46-jdk8-openjdk  #通过-P,主机随机端口映射容器端口
    docker ps  #查看容器对外暴露端口和宿主机映射端口
    

    在第一章节,已经提及,-P,宿主机会自动随机指定49000~49900内的一个端口,指向容器的内部端口,如下图所示:主机随机端口为49153,Tomcat容器内部的端口是8080。其中49153就是本实验要访问的宿主机端口。

    宿主机IP是192.168.31.130,所以访问的地址应该是:192.168.31.130:49153

    发现,在物理机直接访问 192.168.31.130:49153是可以访问容器内部的Tomcat的。

    解析:表面访问的是 192.168.31.130:49153,实际访问的又是什么呢?实际访问的是虚拟机内部的tomcat容器内部的IP+容器内部的8080端口。

    怎么查看容器的虚拟IP地址呢?通过docker inspect mytomcat就可以查看了。

    docker inspect mytomcat #根据容器的别名,查看容器的详细信息,主要查看IP、端口

     

    由此,可以获悉容器的虚拟IP地址是172.17.0.2,内部访问端口是8080。

    也就是说我们访问的: 192.168.31.130:49153,实际上访问的是172.17.0.2:8080 

    2.示例2,通过-p指定端口做映射,外部浏览器访问容器

    docker run -d -p 5000:8080 --name cat  tomcat:8.5.46-jdk8-openjdk  #通过-p 指定主机端口映射容器指定端口
    docker ps  #查看容器对外暴露端口和宿主机映射端口
    

    因为指定的宿主机端口是5000,所以下面用访问宿主机的IP+5000端口,访问容器内部的tomcat。

     192.168.31.130:5000

      

    3.小节

    上面介绍了-p和-P的常用的5种端口映射方式和外部浏览器访问容器的方法和步骤。下面一起来看一下,容器之间的相互访问吧!

    三、容器访问容器 

    访问原理:

    同一宿主机的容器与容器之间除网络资源外(仅桥接模式和部分自定义网络模式下,网络互通),其他资源都是相互隔离。docker run 启动容器时,默认是使用的是桥接网络模式,在此模式下,在同一宿主机下的各容器可以通过对方容器的IP来进行访问。

    如果使用自定义网络模式-d bridge,容器之间可以通过别名相互访问。

    1.使用模式桥接模式,容器间相互通过彼此IP访问

    docker rm -f $(docker ps -qa)  #实验前,清空不相关容器

    1)docker run 分别启动nginx、tomcat两个容器

    docker images  #查看镜像列表
    docker run -d nginx:alpine   #使用默认网络模式(bridge)启动nginx
    docker run -d -p 8080:8080 tomcat:8.5.46-jdk8-openjdk  #使用默认网络模式(bridge)启动tomcat

    2)docker inspect分别查看两个容器的IP

    docker ps #查看已启动容器列表
    docker inspect 26d018333e00  #根据容器id查看nginx的网络信息(主要查看IP)
    docker inspect f0f47e02ea8f  #根据容器id查看tomcat的网络信息(主要查看IP)

    获悉nginx和tomcat的虚拟IP分别为172.17.0.2、172.17.0.3 

    3)docker exec 分别进入容器内部nginx、tomcat两个容器相互通过IP访问对方

    进入nginx容器内部,访问tomcat虚拟IP,发现可以访问通

    docker exec -it 26d018333e00 /bin/sh  #进入nginx容器内部
    ping -w 3 172.17.0.3  #尝试ping通tomcat服务器IP

     

    进入tomcat容器内部,访问nginx虚拟IP,发现可以访问通

    2.容器彼此之间除IP可以相互访问外,也可以通过容器别名相互访问

    该章节的内容,在“容器之间单/双向通信”,一文中有详细介绍,可以点击进入了解一下。可以使用--link方式也可以使用自定义网络模式,从而实现容器间通过别名相互访问,本文就再简单再第二种方式。

    docker rm -f $(docker ps -qa)  #清空无关容器

    1)自定义网络模式,命名为mynet

    docker network ls  #先查看已有的网络模式
    docker network create -d bridge mynet  #创建自定义网络,并指定为bridge桥接网络模式
    docker network ls   #查看创建成功没有
    

    注:如果你想了解更多的docker network命令的使用,点击进入点击进入,查看最后的第五章节。 

    2)nginx和tomcat两个容器,在docker run 运行时,指定同一个自定义网络mynet

    docker images  #查看已有镜像
    docker run -d --name nginx  --net=mynet nginx:alpine   #指定网络为自定义网络mynet启动nginx
    docker run -d --name tomcat --net=mynet -p 8080:8080 tomcat:8.5.46-jdk8-openjdk  #指定网络为自定义网络mynet启动tomcat
    

    3)分别查看nginx和tomcat容器的虚拟IP

    docker inspect nginx 
    docker inspect tomcat

    最终得知nginx和tomcat的虚拟ip分别是172.18.0.2 和 172.18.0.3

    注:docker0虚拟网卡的默认网段是172.17自定义网络mynet的网段和docker0的网段不能有重叠,默认是172.18

    docker network create 时,可以通过--subnet指定网段(不使用默认的网段),感兴趣的话,点击进入,查看第三章节,当然,--subnet在docker run时也可以额外指定。

    4) 分别进入nginx和tomcat容器内部,通过彼此的IP、别名相互访问

    docker exec -it nginx sh  #进入nginx容器内部
    ping -w 3 172.18.0.3  #ping tomcat的虚拟IP
    ping -w 3 tomcat #ping tomcat的别名
    exit
    
    docker exec -it tomcat bash  #进入tomcat容器内部
    ping -w 3 172.18.0.2  #ping nginx的虚拟IP
    ping -w 3 nginx #ping nginx 的别名
    exit

    发现,通过自定义的网络模式(-d 指定为桥接)后,连接同一自定义网络的容器默认是可以通过别名相互访问的。

    5)小节

    在容器内部访问同一宿主机的其他容器,默认只能通过其虚拟IP访问,是不识别对方容器的别名的。要想识别对方的别名,使用自定义网络模式,是不错的选择。

    四、总结

    无论是外部浏览器访问容器,还是容器间相互访问,容器都需要有各自的独立/共享(虚拟)ip,才可以(桥接网络模式默认会为每一个容器单独分配虚拟的ip,Host网络模式的容器默认会共享宿主机的网络资源,host模式下的容器没有自己独立的ip,想了解更多,点击进入)。

    同一宿主机下的容器,在桥接模式下模式是可以通过各自的虚拟ip相互在容器内部访问。要想通过容器的别名相互访问,各容器,需要连接同一指定的自定义网络,来实现容器间通过别名单/双向通信

    尾言

    本讲是从 Docker入门到进阶系列里面抽离出来的内容,因为它是一个庞大的知识体系,一篇文章难以讲述清楚,也为了让原文根据层次分明,同时也可以加深自己对该知识点的理解,在此汇总分享给大家,希望对大家有所帮助。

    附注

    最后,附注上你可能感兴趣的内容,送给爱学习的你,为你鼓掌、加油

    1、Docker容器 | Dockerfile优化

    2、Docker容器的生命周期 | kill和stop | pause 和 unpause

    3、 Docker容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    4、容器之间单/双向通信 |--link /自定义网络实现互认容器别名

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

    千次阅读 多人点赞 2022-06-12 10:32:12
    镜像是构建容器的蓝图,Docker以镜像为模板,构建出容器。本文将对 容器的运行 及相关内容进行详细讲解。

    在这里插入图片描述


    在这里插入图片描述

    🌟 前言

    镜像是构建容器的蓝图,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 命令进入容器,这样不容易出现操作失误。

    展开全文
  • C++ vector容器详解

    千次阅读 多人点赞 2021-10-27 19:31:11
    C++ vector容器详解目录vector容器的基本概念1.vector的构造函数2.vector的赋值操作3.vector的容量与大小4.vector的插入和删除5.vector数据存取6.vector互换容器7.vector预留空间写在最后 目录 vector容器的基本概念...
  • 基于最新Spring 5.x,详细介绍了Spring MVC中容器的层次结构以及父子容器的概念。
  • 容器一直是应用程序开发行业的显着趋势之一,因为越来越多的组织选择它们来更快地构建、测试和部署他们的应用程序而没有摩擦。 容器本质上不是安全的。尽管容器具有内置的安全功能,但它们仍然需要第三方工具来保护...
  • 探索云原生技术之基石-Docker容器入门篇(1)

    千次阅读 多人点赞 2022-04-01 16:27:42
    探索云原生技术之基石-Docker容器入门(1),带大家探索新技术-云原生
  • STL:MAP容器

    千次阅读 2021-11-30 19:49:58
    头文件及其容器构造容器创建2. 容量计算函数3.插入函数4.查找函数5.删除与清空函数6.总结4. 1.map简介 作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对...
  • 容器技术之发展简史

    千次阅读 2020-10-16 13:36:20
    简介:容器技术催生了云原生思潮,云原生生态推动了容器技术发展。整理容器技术近 20 年的发展历史,大致可以将其分为四个历史阶段。作者 | 刘奖背景“云原生技术有利于各组织在公有云、私有云和混合云等新型动态...
  • 玩转容器安全二 - 容器安全概述

    千次阅读 2020-11-29 16:43:10
    容器安全概述 根据我自己的理解,将容器安全划分成了6个方向,各个方面还存在二级分支方向,本文就这6个方向及其二级分支展开我对容器安全的理解。话不多说,开篇一幅图,后面全靠编。 承载容器容器集群的宿主机...
  • 浅析容器运行时奥秘——OCI标准

    千次阅读 2022-03-09 14:40:45
    容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准。此后,为了推进容器生态的健康发展。在Linux基金会的主导下,Docker和各大云厂商Google, Amazon, CloudFoundary, Microsoft积极响应于2016...
  • 同步类容器和并发类容器

    万次阅读 多人点赞 2019-07-31 19:22:20
    为什么会出现同步容器? 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大...
  • 容器基本概念

    千次阅读 多人点赞 2020-10-28 16:07:53
    什么是容器与镜像?如何构建容器与镜像 容器的生命周期 容器项目的架构 容器 VS.VM 容器与镜像 什么是容器? 在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的。 首先,当我们登录到操作系统之后...
  • Docker——容器数据卷

    千次阅读 2021-08-20 10:35:18
    1.容器数据卷是什么? 2.容器数据卷能干嘛? 3.容器内添加数据卷 3.1 直接使用命令添加 3.2 使用DockerFile添加 4.数据卷容器 1.容器数据卷是什么? 先来看看Docker的理念: * 将运用与运行的环境打包形成...
  • Docker技术( 容器虚拟化技术 )

    万次阅读 多人点赞 2019-10-18 19:59:21
    Docker虚拟化容器技术 第一章 Docker简介诞生背景Docker 介绍虚拟机技术容器虚拟化技术官方网址第二章 Docker安装前提条件安装DockerDocker底层原理Docker结构图工作原理Docker为什么比VM快第三章 Docker常用命令...
  • Docker 基本操作 容器操作 -- docker 容器基本操作
  • 容器和云原生(一):初识容器化和云原生

    万次阅读 多人点赞 2021-01-29 15:49:45
    目前亟待增加裸金属服务器配置相关知识和云原生相关内容,那就从容器化和云原生下手,本节把基于k8s的容器化知识挂载到自己的知识树上,然后在测试环境进行开发测试; 一、理解容器化 什么是容器 容器是云原生...
  • 作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址: 目录 前言: 第1章 Docker概述 1.1 Docker的详解教程 ...1.2 Docker容器概述 ...1.3 哪些人适合了解...3.2 容器...
  • 【docker】Docker容器的重启策略

    千次阅读 2021-07-25 16:22:58
    Docker容器的重启策略2. Docker容器的退出状态码不同操作,对应容器的状态 1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Docker容器的重启都是由...
  • 1. 顺序容器2. 容器适配器3. 关联容器 1. 顺序容器   一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素...
  • Windows平台的容器

    千次阅读 2020-05-02 19:41:01
    容器技术架构 Docker容器 vs 虚拟机 容器技术的特点 传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换...
  • 一般在使用docker-compose启动服务时,被同一个docker-compose.yml定于的服务(容器)会运行在一个隔离环境中,也就是说在这个环境中的容器是不能直接访问(如果没有设置的话)当前docker-compose外部的其它容器的,...
  • Pod和容器基本概念

    千次阅读 2022-03-28 16:10:58
    容器的基本概念 容器的本质上其实就是一个视图被隔离(namespace机制,chroot机制),资源访问受限的进程(cgroups机制)。容器中PID=1的进程就是应用本身,那么就意味着在管理容器的时候,我们其实就是在管理容器...
  • 青龙面板多容器教程、一键多容器

    千次阅读 2021-12-07 22:31:13
    青龙面板多容器教程,一键多容器
  • docker修改容器的端口、容器名、映射地址......

    千次阅读 多人点赞 2022-04-30 13:28:21
    文章目录1、docker修改容器名2、docker修改修改端口、映射地址......2.1、先找容器的ID2.2、停止docker容器2.3、停止docker2.4、查找配置文件2.5、备份原有文件,如果出现问题后可以还原回去2.6、修改配置文件...
  • 3.docker创建容器 (docker容器命令)

    千次阅读 2021-12-17 11:15:48
    1.nginx 容器拉取 2.运行创建一个nginx容器 # 查看镜像 docker images docker run --name myNginx-p 80:80 -d nginx 2.1. 命令解读 docker run : 创建并运行一个容器 –name : 给容器起一个名字, 比如叫做 ...
  • 一篇文章搞懂最流行的容器化技术Docker!
  • 【docker系列】详解docker容器状态转换管理命令

    千次阅读 多人点赞 2022-04-06 06:23:46
    docker容器有三种状态运行、停止、暂停,镜像可以创建、运行容器,镜像和容器也可以转换成tar压缩包进行存储。本文为大家介绍容器的状态转换命令及镜像创建运行容器、tar包导入导出相关的命令及使用场景。
  • K8S查看容器日志、进入容器内部

    千次阅读 2021-11-01 10:22:27
    K8S查看容器日志、进入容器内部前言常用命令查看所有正在运行的pod查看容器日志查看pod的详细信息,以yaml格式或json格式显示查看pod的描述信息查看node或pod的资源使用情况进入容器 前言 公司应用部署在k8s,遇到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,282,494
精华内容 912,997
关键字:

容器