容器 订阅
容器是指用以容纳物料并以壳体为主的基本装置。常用作储存设备或其他化工设备的外壳。主要由壳体、封头、接管、法兰和支座组成。对容器的基本要求是:满足工艺需要;保证操作安全,包括具有足够的强度、刚度以及密封性;耐腐蚀,具有一定的使用寿命;便于制造、安装、维修和使用;成本低,材料节省,尤其要节约不锈钢和有色金属等贵重材料。容器在化工生产中应用广泛,按压力分有真空、常压、外压的压力容器,压力容器又可分低压、中压、高压及超高压容器;按温度分有常温、低温及高温容器;按筒体结构分有单层容器和多层容器;按工艺用途分有储存、分离、反应及换热容器;按厚度分有薄壁和厚壁容器。 [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)允许键对有相等的次序的映射为所有容器定义的操作
收起全文
精华内容
下载资源
问答
  • 同步类容器和并发类容器

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

    一.为什么会出现同步容器?

    在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。

    注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大类容器。

    像ArrayList、LinkedList都是实现了List接口,HashSet实现了Set接口,而Deque(双向队列,允许在队首、队尾进行入队和出队操作)继承了Queue接口,PriorityQueue实现了Queue接口。另外LinkedList(实际上是双向链表)同时也实现了Deque接口。

    但以上容器都是非线程安全的。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,必须要求程序员手动地在访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。所以,Java提供了同步容器供用户使用。

    二.Java中的同步类容器

    在Java中,同步容器主要包括2类:

      1)Vector、Stack、HashTable

      2)Collections类中提供的静态工厂方法创建的类

    Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施;Stack也是一个同步容器,它的方法也用synchronized进行了同步,它实际上是继承于Vector类;HashTable实现了Map接口,它和HashMap很相似,但是HashTable进行了同步处理,而HashMap没有。

    Collections类是一个工具提供类,注意,它和Collection不同,Collection是一个顶层的接口。在Collections类中提供了大量的方法,比如对集合或者容器进行排序、查找等操作。最重要的是,在它里面提供了几个静态工厂方法来创建同步容器类,如下图所示:

    这些同步容器都是通过synchronized进行同步来实现线程安全的,那么很显然,这必然会影响到执行性能。

    而且虽然他们都是线程安全的,但这并不说明在任何情况下都可以线程安全,看你怎么用了,例如下面的这个例子:

    public class Test {
        static Vector<Integer> vector = new Vector<Integer>();
        public static void main(String[] args) throws InterruptedException {
            while(true) {
                for(int i=0;i<10;i++)
                    vector.add(i);
                Thread thread1 = new Thread(){
                    public void run() {
                        for(int i=0;i<vector.size();i++)
                            vector.remove(i);
                    };
                };
                Thread thread2 = new Thread(){
                    public void run() {
                        for(int i=0;i<vector.size();i++)
                            vector.get(i);
                    };
                };
                thread1.start();
                thread2.start();
                while(Thread.activeCount()>10)   {
                     
                }
            }
        }
    }

    运行结果是在执行过程中会出现数组下标越界的运行时异常。也许有朋友会问:Vector是线程安全的,为什么还会报这个错?很简单,对于Vector,虽然能保证每一个时刻只能有一个线程访问它,但是不排除这种可能,当某个线程在某个时刻执行这句时:

    for(int i=0;i<vector.size();i++)

         vector.get(i);

    假若此时vector的size方法返回的是10,i的值为9,在他要获取下标为9的元素时,有另外一个线程先执行了这句:

    for(int i=0;i<vector.size();i++)

         vector.remove(i);

    将下标为9的元素删除了,在删除过程中因为有锁,所以之前的那个线程无法执行vector.get(i);处于阻塞状态,等这个线程把下标为9的元素删除了之后获取到锁再执行。那么通过get方法访问下标为9的元素肯定就会出问题了。说明这是程序逻辑本身存在线程安全问题,因此为了保证线程安全,必须在方法调用端做额外的同步措施,如下面所示:

    public class Test {
        static Vector<Integer> vector = new Vector<Integer>();
        public static void main(String[] args) throws InterruptedException {
            while(true) {
                for(int i=0;i<10;i++)
                    vector.add(i);
                Thread thread1 = new Thread(){
                    public void run() {
                        synchronized (Test.class) {   //进行额外的同步
                            for(int i=0;i<vector.size();i++)
                                vector.remove(i);
                        }
                    };
                };
                Thread thread2 = new Thread(){
                    public void run() {
                        synchronized (Test.class) {
                            for(int i=0;i<vector.size();i++)
                                vector.get(i);
                        }
                    };
                };
                thread1.start();
                thread2.start();
                while(Thread.activeCount()>10)   {
                     
                }
            }
        }
    }

    三.Java中的并发类容器

    为了解决同步类容器的性能问题,在Java 1.5之后提供了并发容器,位于java.util.concurrent目录下,这个目录俗称并发包。

    3.1、ConcurrentMap

    ConcurrentMap接口下有两个重要的实现:ConcurrentHashMap、ConcurrentSkipListMap。ConcurrentHashMap把整个哈希表分成多个segment,每个segment一把锁,主要通过锁分段技术减小了锁的粒度,降低了冲突,从而提高了并发性。在实际的应用中,散列表一般是读多写少。ConcurrentHashMap 就针对读操作做了大量的优化,运用了很多并发技巧,如不可变对象和使用volatile保证内存可见性,这样,在大多数情况下读操作甚至无需加锁也能获得正确的值。ConcurrentHashMap的concurrencyLevel(默认值为16)表示并发级别,这个值用来确定Segment的个数,Segment的个数是大于等于concurrencyLevel的第一个2的n次方的数。比如,如果concurrencyLevel为12,13,14,15,16这些数,则Segment的数目为16(2的4次方)。理想情况下ConcurrentHashMap的真正的并发访问量能够达到concurrencyLevel,因为有concurrencyLevel个Segment,假如有concurrencyLevel个线程需要访问Map,并且需要访问的数据都恰好分别落在不同的Segment中,则这些线程能够无竞争地自由访问(因为他们不需要竞争同一把锁),达到同时访问的效果。这也是为什么这个参数起名为“并发级别”的原因。该值设置过高会照成空间的浪费,设置过低会降低并发性。这种对调优的把握是要通过对底层实现的深刻理解和不断的实践积累才能获取的。

    3.2、CopyOnWirte容器

    Cope-On-Write简称COW,是一种用于程序设计中的优化策略,称为写时复制,理解起来很简单,就是执行修改操作时进行底层数组复制,使得修改操作在新的数组上进行,不妨碍原数组的并发读操作,复制修改完成后把原数组引用指向新数组。这样做的好处是可以并发的读而不需要加锁,因为当前容器不会添加任何元素,所以也是一种读写分离的思想。但正是因为写时复制,所以不能保证数据的实时性,而只能保证最终一致性。

    在concurrent包下实现CopyOnWrite机制的容器有两种,CopyOnWriteArrayList和CopyOnWriteArraySet。

    CopyOnWriteArrayList中有一个Object数组array用来存放数据,对于set()、add()、remove()等修改数据的操作会加上重入锁ReentrantLock,等修改操作完成替换掉array的引用之后才释放锁,从而保证写操作的线程安全,而针对读操作没有任何锁。

    CopyOnWriteArraySet其实就是一个CopyOnWriteArrayList,不过就是在方法中避免重复数据而已,甚至这些避免重复数据的函数也是在CopyOnWriteArrayList中定义的,CopyOnWriteArraySet中只是包含一个CopyOnWriteArrayList的属性,然后在方法上做个包装,除了equals方法外,其他当前类中的所有函数都是调用的CopyOnWriteArrayList的方法,所以严格来讲可以使用一个CopyOnWriteArrayList作为具有Set特性的写时复制数组(不过就是没有继承AbstractSet)。

    根据CopyOnWirte容器的实现原理可知,CopyOnWirte容器保证读写分离,十分适合读多写少的场景,但不适合写多的场景。

    3.3、线程安全队列

    在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现。java.util.concurrent.atomic包相关类就是CAS的实现。

    ConcurrentLinkedQueue是一个适用于高并发场景下的非阻塞的队列,通过无锁的方式(采用CAS操作),实现了高并发状态下的高性能,通常ConcurrentLinkedQueue的性能优于BlockingQueue。ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素,该队列不允许NULL元素。

    阻塞队列当队列是空的时候,再想获取元素就会阻塞进入等待状态,所以非常适合生产者-消费者模式。阻塞队列BlockingQueue接口JDK提供了7种实现:

    • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
    • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
    • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
    • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
    • SynchronousQueue:一个不存储元素的阻塞队列。
    • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
    • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
    展开全文
  • Docker stop停止/remove删除所有容器

    万次阅读 多人点赞 2017-12-01 17:22:57
    $ docker ps // 查看所有正在运行容器 $ docker stop containerId // containerId 是容器的ID$ docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID $ docker rm $(docker ps -a -q) // 删除所有容器
    $ docker ps // 查看所有正在运行容器
    $ docker stop containerId // containerId 是容器的ID
    
    $ docker ps -a // 查看所有容器
    $ docker ps -a -q // 查看所有容器ID
    
    $ docker stop $(docker ps -a -q) //  stop停止所有容器
    $ docker  rm $(docker ps -a -q) //   remove删除所有容器
    

    参照:http://www.simapple.com/340.html

    Docker常用命令:

    [Ctrl + C ] :退出并不结束当前容器进程,

    帮助命令:

    docker --help
    

    查看version

    docker --version
    

    查看所有镜像

    docker images
    

    删除容器

    docker rm [NAME]/[CONTAINER ID]
    

    :不能够删除一个正在运行的容器,会报错。需要先停止容器

    查看所有containers

    docker ps
    
    docker images
    

    :列出本地所有镜像

    docker search <IMAGE_ID/NAME>
    

    :查找image

    docker pull  <IMAGE_ID> 
    

    : 下载image

    docker push <IMAGE_ID>
    

    :上传image

    docker rmi <IMAGE_ID>
    

    :删除image

    容器管理
    docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本
    -d:以守护进程方式运行(后台)
    -P:默认匹配docker容器的5000端口号到宿主机的49153 to 65535端口
    -p <HOT_PORT>:<CONTAINER_PORT>:指定端口号

    • -name: 指定容器的名称
    • -rm:退出时删除容器

    docker stop <CONTAINER_ID>: 停止container
    docker start <CONTAINER_ID> : 重新启动container
    docker ps - Lists containers.
    -l:显示最后启动的容器
    -a:同时显示停止的容器,默认只显示启动状态

    docker attach <CONTAINER_ID> 连接到启动的容器
    docker logs <CONTAINER_ID> : 输出容器日志
    -f:实时输出
    docker cp <CONTAINER_ID>:path hostpath:复制容器内的文件到宿主机目录上
    docker rm <CONTAINER_ID>:删除container
    docker rm docker ps -a -q:删除所有容器
    docker kill docker ps -q
    docker rmi docker images -q -a
    docker wait <CONTAINER_ID>:阻塞对容器的其他调用方法,直到容器停止后退出

    docker top <CONTAINER_ID>:查看容器中运行的进程
    docker diff <CONTAINER_ID>:查看容器中的变化
    docker inspect <CONTAINER_ID>:查看容器详细信息(输出为Json)
    -f:查找特定信息,如 docker inspect - f ‘{{ .NetworkSettings.IPAddress }}’
    docker commit -m “comment” -a “author” <CONTAINER_ID> ouruser/imagename:tag

      docker extc -it <CONTAINER> <COMMAND>:在容器里执行命令,并输出结果
    
    展开全文
  • Docker 容器技术 — 容器网络

    千次阅读 多人点赞 2020-10-02 10:39:47
    文章目录目录容器网络容器网络类型bridge 模式host 模式Container 模式none 模式容器端口映射容器跨主机通信 容器网络 容器网络类型 Docker 提供几种类型的网络,它决定容器之间、容器与外界之前的通信方式。 查看...

    目录

    容器网络的发展趋势

    在这里插入图片描述

    CNI

    CNI(Container Network Interface,容器网络接口)是 Google 和 CoreOS 主导制定的容器网络标准,它是在 RKT 网络提议的基础上发展起来的,综合考虑了灵活性、扩展性、IP 分配、多网卡等因素。

    CNI 旨在为容器平台提供网络的标准化,不同的容器平台(e.g. Kubernetes、Mesos 和 RKT)能够通过相同的接口调用不同的网络组件。这个协议连接了两个组件:

    1. 容器管理系统
    2. 网络插件

    具体的事情都是插件来实现的,包括:创建容器网络空间(network namespace)、把网络接口(interface)放到对应的网络空间、给网络接口分配 IP 等。

    目前采用 CNI 提供的方案一般分为两种

    1. 隧道方案
    2. 路由方案

    具体为:Flannel,Callico,Weave 和 macvlan 网络方案。从难易度上来讲,Callico 最简单,其次 Flannel,Weave 最复杂,从网络技术来看,Weave 和 Flannel 都是网络封装隧道技术,区别在于封装的位置在网络设备上还是主机上。

    在这里插入图片描述

    Flannel

    在这里插入图片描述

    Flannel 是 CoreOS 提出用于解决容器集群跨主机通讯的网络解决方案。Flannel 实质上是一种 Overlay 网络,也就是将 TCP 数据包装在另一种网络包里面进行路由转发和通信,目前已支持 UDP、VXLAN、AWS VPC、GCE 路由等数据转发方式,其中以 VXLAN 技术最为流行,很多数据中心在考虑引入容器时,也考虑将网络切换到 Flannel 的 VXLAN 网络中来。

    Flannel 为每个主机分配一个 Subnet,容器从此 Subnet 中分配 IP,这些 IP 可在主机间路由,容器间无需 NAT 和端口映射就可以跨主机通讯。Flannel 让集群中不同节点主机创建容器时都具有全集群唯一虚拟 IP 地址,并连通主机节点网络。Flannel 可为集群中所有节点重新规划 IP 地址使用规则,从而使得不同节点上的容器能够获得 “同属一个内网” 且 “不重复的” 的 IP 地址,让不同节点上的容器能够直接通过内网 IP 通信,网络封装部分对容器是不可见的。源主机服务将原本数据内容 UDP 封装后根据自己的路由表投递给目的节点,数据到达以后被解包,然后直接进入目的节点虚拟网卡,然后直接达到目的主机容器虚拟网卡,实现网络通信目的。

    Flannel 虽然对网络要求较高,要引入封装技术,转发效率也受到影响,但是却可以平滑过渡到 SDN 网络,VXLAN 技术可以和 SDN 很好地结合起来,值得整个网络实现自动化部署,智能化运维和管理,较适合于新建数据中心网络部署。

    Callico

    在这里插入图片描述

    Callico 容器网络和其他虚拟网络最大的不同是:它没有采用 Overlay 网络做报文转发,提供了纯三层网络模型。三层通信模型表示每个容器都通过 IP 直接通信,要想路由工作能够正常,每个容器所在的主机节点必须有某种方法知道整个集群的路由信息,Callico 采用 BGP 路由协议,使得全网所有的 Node 和网络设备都记录到全网路由。

    然而这种方式会产生很多的无效路由,对网络设备路由规格要求较大,整网不能有路由规格低的设备。另外,Callico 实现了从源容器经过源宿主机,经过数据中心路由,然后到达目的宿主机,最后分配到目的容器,整个过程中始终都是根据 BGP 协议进行路由转发,并没有进行封包,解包过程,这样转发效率就会快得多,这是 Callico 容器网络的技术优势。

    Weave

    在这里插入图片描述

    Weave 实质上也是 Overlay 网络,Weave 可以把不同主机上容器互相连接的网络虚拟成一个类似于本地网络的网络,不同主机之间都使用自己的私有 IP 地址,当容器分布在多个不同的主机上时,通过 Weave 可以简化这些容器之间的通信。

    Weave 网络中的容器使用标准的端口提供服务(e.g. MySQL 默认使用 3306),管理微服务是十分直接简单的。每个容器都可以通过域名来与另外的容器通信,也可以直接通信而无需使用 NAT,也不需要使用端口映射或者复杂的联接。

    部署 Weave 容器网络最大的好处是无需修改你的应用代码。Weave 通过在容器集群的每个主机上启动虚拟路由器,将主机作为路由器,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通信。

    要部署 Weave 需要确保主机 Linux 内核版本在 3.8 以上,Docker1.10 以上,主机间访问如果有防火墙,则防火墙必须彼此放行 TCP 6783 和 UDP 6783/6784 这些端口号,这些是 Weave 控制和数据端口,主机名不能相同,Weave 要通过主机名识别子网。

    Weave 网络类似于主机 Overlay 技术,直接在主机上进行报文流量的封装,从而实现主机到主机的跨 Underlay 三层网络的互访,这是和 Flannel 网络的最大区别,Flannel 是一种网络 Overlay 方案。

    Macvlan

    Macvlan 是 Linux Kernel 比较新的特性,允许在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 MAC 地址,也可以配置上 IP 地址进行通信。macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。macvlan 和 bridge 比较相似,但因为它省去了 bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,macvlan 自身也完美支持 VLAN。

    ServiceMesh + CNI

    在这里插入图片描述

    ServiceMesh 和 CNI 是组合的关系,ServiceMesh 并不会替代 CNI,他们工作在不同的 SDN 层次,CNI 更多工作在 L2-4 层,ServiceMesh 在 L5-7 层 Application SDN。ServiceMesh 不能独立于 CNI 部署,与 CNI 一起提供层次化微服务应用所需要的网络服务。根据 Gartner 报告指出,在 2020 年,几乎 100% 容器云都将内置 ServiceMesh 技术。而目前开源的Istio 仅提供单一 Kubernetes 集群内部微服务治理,缺失异构容器云,跨云能力。

    CNI 需要交付给容器云 L2-4 层细化至微服务内部的每个 POD 容器。应用终端交付所需要的 L2 网络连接,L3 路由,L2-4 层安全隔离,容器云整体安全,负载均衡等。

    ServiceMesh 更多的致力于微服务应用层面的服务治理,致力于 L5-7 层网络服务,服务网格在每一个应用容器前部署一个 Sidecar Envoy 应用代理,提供微服务间的智能路由,分布式负载均衡,流量管理,蓝绿,金丝雀发布,微服务弹性,限流熔断,超时重试,微服务间的可视化,安全等等。
    ·

    Docker 容器网络

    Docker 提供几种类型的网络,它决定容器之间、容器与外界之前的通信方式。

    • 基础网络类型
      在这里插入图片描述

    • 查看所有容器网络类型:

    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    c79756cf9cde        bridge              bridge              local
    204025a5abbc        host                host                local
    9b9024f5ac40        macvlan             macvlan             local
    6478888548d8        none                null                local
    p2e02u1zhn8x        overlay             overlay             swarm
    

    bridge 模式

    bridge 模式的 Docker 网络基于 Linux 的虚拟网络技术来实现。Docker Container 的网络接口默认都是虚拟接口,可以充分发挥数据在不同 Container 之间或跨主机的 Container 之间的转发效率。这是因为 Linux 虚拟网络技术通过在内核中的数据复制来实现虚拟接口之间的数据转发,即:发送接口的发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而无需通过外部物理网络设备进行交换。

    当 Docker Daemon 启动后,会在宿主机上创建一个名为 docker0 的 Linux Bridge,在此宿主机上启动的 Docker Container 都会连接到这个虚拟网桥上。Docker Daemon 会从 docker0(一个虚拟的 L2 网络)子网中分配一个 IP 给 Container 使用,并设置 docker0 的 IP 地址为 Container 的默认网关。同时,在宿主机上创建一对 veth pair 虚拟网线设备,Docker Daemon 将 veth pair 设备的一端插入新建的 Container 中,并命名为eth0(容器的网卡),另一端插入 docker0 Linux Bridge 中,以 vethxxx 格式命名。

    在这个网络的容器之间可以相互通信,外界想要访问到这个网络中的 Containers 也同样需要接入 bridge 网络并通过 iptables 做了 DNAT 规则,实现内外部地址转换。

    在这里插入图片描述

    $ ip a
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:46:c3:00:eb brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:46ff:fec3:eb/64 scope link
           valid_lft forever preferred_lft forever
    
    $ docker run -itd --name box1 busybox
    
    $ docker exec -it box1 sh
    
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.2/16 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:2/64 scope link
           valid_lft forever preferred_lft forever
    
    / # ip r
    default via 172.17.0.1 dev eth0
    172.17.0.0/16 dev eth0 scope link  src 172.17.0.2
    
    $ brctl show
    bridge name	bridge id		STP enabled	interfaces
    docker0		8000.024246c300eb	no		vethd4ae072
    

    host 模式

    如果启动 Container 的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。也就是说 Container 不会虚拟出自己的网卡,配置自己的 IP 等,而是直接使用宿主机的 IP 和端口。

    当然,Container 的其他方面,如:文件系统、进程列表等还是和宿主机隔离的。只用这种网络的容器会使用主机的网络,这种网络对外界是完全开放的,能够访问到主机,就能访问到容器。

    $ docker run -itd --network host --name box2 busybox
    
    $ docker exec -it box2 sh
    
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether fa:16:3e:94:84:10 brd ff:ff:ff:ff:ff:ff
        inet 172.18.22.204/24 brd 172.18.22.255 scope global dynamic eth0
           valid_lft 48054sec preferred_lft 48054sec
        inet6 fe80::f816:3eff:fe94:8410/64 scope link
           valid_lft forever preferred_lft forever
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
        link/ether 02:42:46:c3:00:eb brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:46ff:fec3:eb/64 scope link
           valid_lft forever preferred_lft forever
    7: vethd4ae072@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
        link/ether ce:95:19:64:d0:d4 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::cc95:19ff:fe64:d0d4/64 scope link
           valid_lft forever preferred_lft forever
    

    macvlan 模式

    对于某些应用程序,比如需要监视网络流量,期望直接连接到物理网络,这种情况下,可以使用 macvlan 的网络模式,macvlan 驱动程序不仅将 IP 地址分配给容器,而且还将物理 MAC 地址分配给容器。通过 macvlan 还可以实现跨主机容器之前的通信。

    1. 创建一个 macvlan 网络:
    docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eth0 macvlan1
    
    1. 设置网卡为混杂模式:
    ip link set eth0 promisc on
    
    1. 创建使用 macvlan 网络的容器:
    docker run -it --network macvlan1  --ip=172.16.86.2 busybox /bash
    

    Container 模式

    Container 模式,又称为 Docker links,是一种 Docker Container 之间的通信机制。如果一个新容器链接到一个已有容器,新容器将会通过环境变量获得已有容器的链接信息。通过提供给信任容器有关已有容器的链接信息,实现容器间的通信。

    Container 模式和 host 模式很类似,只是 Container 模式创建容器共享的是其他容器的 IP 和 Port 而不是物理机的,此模式容器自身是不会配置网络和端口,创建此模式的容器进去后会发现里边的 IP 是你所指定的那个容器 IP 并且 Port 也是共享的。当然,其它还是互相隔离的,如进程等。

    docker run -it --network container:<container ID>
    

    在这里插入图片描述

    none 模式

    使用 none 模式 Container 会拥有自己的 Network Namespace,但是,并不为 Container 进行任何网络配置。也就是说,这个 Container 不会具有网卡、IP、路由等信息。需要手动的为 Container 添加网卡、配置 IP 等。使用此种网络的容器会完全隔离。

    使用的 none 模式后,这个容器就是封闭的,不会去参与网络通信,这样就能够保证容器的安全性。

    $ docker run -itd --network none --name box3 busybox
    
    $ docker exec -it box3 sh
    
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    

    Overlay 模式

    Overlay 模式使用在 Swarm 集群中,用于连接跨主机 Docker Container,允许不同宿主机上的容器相互通信。Overlay 模式在 Docker 集群节点间加入了一层虚拟网络,它有独立的虚拟网段,因此 Container 发送的内容,会先发送到虚拟子网,再由虚拟子网包装为宿主机的真实网址进行发送。

    在这里插入图片描述

    # 初始化 manager node。
    $ docker swarm init
    
    # 添加 worker node 到 manager。
    $ docker swarm join --token <token> <manager_host>:2377
    
    # 新建一个 Overlay 网络
    $ docker network create --driver=overlay --attachable overlay
    
    # 分别在不同的 worker node 上启动一个 busybox 容器,并连接到 Overlay 网络
    $ docker run -it --network overlay --name box4 sh
    

    如此的,在同一个 Overlay 网络上的跨主机 Container 就可以互相通信了。

    基于 Swarm 我们还可以管理 Containers 集群服务,例如:创建一个具有五副本的连接到 Overlay 网络的 Nginx Cluster,暴露端口为 80:

    $ docker service create --name my-nginx --publish target=80,published=80 --replicas=5 --network overlay nginx
    

    在这个 Nginx Cluster 中,如果任一节点结束一个副本,那么集群服务就会重启一个新的副本,以此保持所有 Worker Node 中的 Nginx 副本数量为五个。

    容器端口映射

    核心选项:

    • -p 宿主机端口:将容器内应用监听端口映射到物理宿主机的特定端口上。

    示例:

    • 自定义映射:
    docker run -d -p 8888:80  nginx:latest 
    

    在这里插入图片描述

    • 随机映射
    # 需要镜像支持
    docker run -P
    
    展开全文
  • Web容器

    万次阅读 2016-09-25 10:59:22
    1.2容器 2.Web容器的作用 主要参考文章: http://www.cnblogs.com/yezhaohui/archive/2013/05/21/3091931.html http://www.cnphp6.com/archives/51094 好记性不如烂笔头,从网上搜罗了一...

    目录

    1.Java Web相关概念

    1.1中间件

    1.2容器 

    2.Web容器的作用


    主要参考文章:

                http://www.cnblogs.com/yezhaohui/archive/2013/05/21/3091931.html
                http://www.cnphp6.com/archives/51094

    好记性不如烂笔头,从网上搜罗了一些个人觉得写的比较好,而且比较重要的Java Web相关概念,汇总如下。

    1.Java Web相关概念

    1.1中间件

    所谓中间件指的是提供系统软件和应用软件之间连接的软件,中间件处在操作系统、网络、数据库等系统软件层之上,应用软件层之下,其作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。这样设计的好处是:将应用程序运行环境与操作系统分离,从而使应用程序开发者不必再考虑诸多的系统通信问题,而直接关注该应用程序的功能实现。我们常说到的容器的概念其实就是中间件的一种。

    J2EE提出的背景:

    1、企业级应用框架的需求:在许多企业级应用中,例如数据库连接、邮件服务、事务处理等都是一些通用企业需求模块,这些模块如果每次在开发中都由开发人员来完成的话,势必将会造成开发周期长和代码可靠性差等问题。于是许多大公司开发了自己的通用模块服务,这些服务性的软件系列统称为中间件。

    2、 为了通用必须要提出规范,不然无法达到通用,在上面的需求基础之上,许多公司都开发了自己的中间件,但其与用户的沟通都各有不同,从而导致用户无法将各个公司不同的中间件组装在一块为自己服务。从而产生瓶颈。于是提出标准的概念。其实J2EE就是基于JAVA技术的一系列标准。

    目前常见的中间件角色:

    Apache的Tomcat、IBM公司的WebSphere、BEA公司的WebLogic、Kingdee公司的Apusic都属于中间件。并且中间件技术已经不局限于应用服务器、数据库服务器。围绕中间件,在商业中间件及信息化市场主要存在微软阵营、Java阵营、开源阵营。 

    1.2容器 

    容器其实就是一种中间件,常见的有:WEB容器(WEB服务器)、EJB容器、应用服务器。

    WEB容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,JSP容器和SERVLET容器。使JSP,SERVLET直接跟容器中的环境变量接口交互,不必关注其它系统问题。主要由WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

    EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

    WEB容器和EJB容器在原理上是大体相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是实现了与外界环境的交互,从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。

    应用服务器:作为服务器执行共享业务应用程序的底层的系统软件。

    支持J2EE的应用服务器:

    WEBSPHERE、WEBLOGIC、JBOSS、ORACLE APPLICATION SERVER、SUN ONE APPLICATION SERVER 等。 

    2.Web容器的作用

    #1,通信支持

    利用容器提供的方法,你可以轻松的让servlet与web服务器进行通信,而不用创建serverSocket去监听某个端口,创建流等,容器知道和web服务器之间的协议,servlet不用去关心web服务器和web代码之间的API,只需要将重点放在业务逻辑上面。

    #2,生命周期管理

    容器控制着servlet的生与死,容器控制servlet的加载,实例化和初始化以及确保servlet能被正常回收,总之不用太多考虑资源管理。

    #3,多线程管理

    容器自动地为每一个servlet请求创建一个java线程,针对客户的请求,如果servlet已经运行完了Http相应的服务方法后,这个线程就可以被kill掉了,但是这并不意味着我们在写servlet的时候不用考虑同步问题了,只是容器帮我们创建和管理多个线程来处理多个请求而已。

    #4,声明方式实现安全

    利用容器,可以使用web.xml部署描述来配置安全性,而不用硬编码在servlet中。

    #5,jsp支持

    容器将jsp代码翻译成java代码。

    Web容器处理请求工作流程

    展开全文
  • servlet容器,web容器,spring容器,springmvc容器的区别

    千次阅读 多人点赞 2019-05-03 21:42:40
    web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器控制servlet对象。项目启动是,首先 ...
  • --凑字数结束,开始正题:spring-boot项目需要部署在外部容器中的时候,spring-boot导出的war包无法再外部容器(tomcat)中运行或运行报错,本章就是详细讲解如何解决这个问题 1、pom.xml一览 <project xmlns="ht
  • Docker技术( 容器虚拟化技术 )

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

    万次阅读 多人点赞 2019-04-09 16:34:40
    Docker是个很好的工具,刚开始用觉得... Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。 Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个...
  • Docker 容器技术 — 容器存储

    千次阅读 多人点赞 2020-10-02 10:40:46
    文章目录目录容器存储数据卷管理挂载时创建卷创建卷后挂载数据容器管理 容器存储 数据卷管理 核心选项: -v 宿主机目录:指定挂载到容器内的目录。 映射多个宿主机目录,只需要多写几个 -v 即可。 挂载时创建卷 ...
  • Docker删除镜像和容器

    万次阅读 多人点赞 2018-06-23 18:28:58
    删除docker中的容器可以使用如下命令: docker rm 使用如下命令可以查看当前正在运行的容器 docker ps 对于已退出的容器,可以使用如下命令进行查看: docker ps -a 例如: 查看当前正在运行的容器: ...
  • C++STL容器总结

    万次阅读 多人点赞 2019-02-27 16:34:46
    持续更新中!!! 各大容器的特点: ...1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的...
  • Docker 退出容器不停止容器运行

    千次阅读 2019-08-16 17:14:31
    Docker 退出容器不停止容器运行 通常我们使用Ctrl+C退出正在执行的操作 在docker容器中使用Ctrl+D即可退出容器,但是这样会让容器停止运行。 如果想退出容器但又不想让容器停止,使用Ctrl+P+Q即可 ...
  • C++ map容器和multimap容器(STL map容器

    千次阅读 多人点赞 2018-11-08 22:30:05
    1. 关联容器和map容器概述 2. map容器 2.1 map的创建以及初始化列表 2.2 map容器的一般常用属性(方法) 2.3 插入数据 2.4 数据的访问和遍历 2.5 数据的删除 2.6 map中关键词的排序 3. multimap容器 3.1 ...
  • 必备之docker查看容器详情包括IP

    万次阅读 2018-07-19 19:31:21
    docker inspect 容器名称或 id 命令:docker inspect redismaster 结果:
  • 顺序容器和关联容器图示: 1.顺序容器和关联容器的区别: ①顺序容器只有实值val。 ②关联容器的一个元素包含两个部分:键值对(key-value) 即&lt;k值(键值)|实值&gt;。 ③顺序容器不涉及排序,关联容器内部...
  • Docker 镜像、容器 常用命令 与 操作

    万次阅读 多人点赞 2018-08-16 09:11:24
    容器操作 运行容器 查看容器 停止容器 启动容器 删除容器 端口映射 容器日志 本文导读 本文承接《Docker 镜像操作 常用命令》 软件镜像(如 weChat.exe)----> 运行镜像----> 产生一个容器(正在...
  • 1. Docker重启所有容器的linux命令行是: docker restart $(docker ps -q) 2. Docker进入容器内部的命令是: docker exec -ti container_name /bin/bash
  • 容器:管理对象的地方。 spring,springMVC和web容器的区别? Tomcat(web容器)是管理servlet对象的地方,而spring和springMVC是管理...其次,spring容器和springMVC容器是父子容器的关系,spring容器是父容器,...
  • 9.1 Servlet容器&实例

    万次阅读 2020-05-10 00:13:12
    前言 4-8章是JVM和编译器等的内容, 比较深入,凭我目前实际开发经验...Servlet容器是如何工作的(Tomcat) Servlet容器是如何解析web.xml的 请求是如何分配给指定的Servlet Servlet容器如何管理Servlet的生命周期 Se
  • 本文出自【我是干勾鱼的博客】 前面讲解过如何进入、退出docker的container。今天来讲一下在docker中宿主机与容器(container)互相...1 从宿主机拷贝文件到容器拷贝方式为:docker cp 容器名:要拷贝的宿主机的文件名
  • 容器容器编排

    千次阅读 2018-08-12 11:33:36
    Docker平台以及周边生态系统包含很多工具来管理容器的生命周期。例如,Docker Command Line Interface(CLI)支持下面的容器活动: 从注册表中拉取仓库。 运行容器并可选的附加一个终端给它。 将容器提交新镜像。 ...
  • 请问tomcat容器与spring容器是父子关系吗,tomcat容器包含spring容器
  • 方法一:#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,sudo docker ps -a|grep Exited|awk '{print $1}'#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器sudo docker rm `docker...
  • Docker 容器

    千次阅读 2017-07-27 08:22:20
    简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。容器和镜像的关系就如,实例与类的关系....
  • 深入理解Java中的容器

    万次阅读 多人点赞 2016-07-27 17:25:40
    1、容器的概念 在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 2、容器与数组的关系 之所以需要...
  • 使用nsenter进入Docker容器 Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是...
  • docker退出容器的方式(注此时处于运行的容器内部): 启动容器 1.退出容器并结束容器运行 exit 2.退出容器但是容器仍在执行 ctrl + p + q 会回到宿主机桌面 但是容器还在执行 3.如何回到已经退出的...
  • Docker - 主机与容器 容器容器通信

    千次阅读 2018-04-21 15:50:01
    版权声明: ...1.容器放主机/主机访问容器 启动一个已经配置好JDK、tomcat的镜像,命名为tomcat01。 使用route -n查看主机的路由,ifconfig查看主机的ip。 docker0...
  • linux下docker进入容器退出容器

    千次阅读 2019-11-29 10:30:54
    退出容器可以使用exit 直接运行exit就可以了 查看容器 docker ps -a 重启容器 docker restart+容器id 进入容器 docker exec -it 容器id(可以通过查看容器 docker ps -a查看) /bin/bash docker attach 容器id ...
  • Docker 容器技术

    千次阅读 2020-09-20 12:51:28
    Docker容器技术 概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 469,899
精华内容 187,959
关键字:

容器