一、docker底层依赖的核心技术

1、命名空间 (Namespaces)

2、控制组 (Control Groups)

3、联合文件系统 (Union File System)

4、Linux 虚拟网络支持:本地和容器内创建虚拟接口

(1) 命名空间(Namespaces):

实现了容器间资源的隔离,每个容器拥有自己独立的命名空间 , 运行其中的应用就像是运行在独立的操作系统中一样 , 我们都可以看到文件系统,网卡等资源保证了容器之间互不影响,namesaces管理进程号 , 每个进程命名空间有一套自己的进程号管理方法 , 进

程命名空间是一个父子关系的结构 , 子空间中的进程对于父空间是可见的。

(2) 控制组 (Control Groups) :

控制组 (Control groups)--CGroups 是 Linux 内核的一个特性 ,主要用来对共享资源进行隔离、限制、审计等 。cgroups 允许对于进程或进程组公平( 不公平 ) 的分配 CPU 时间、内存分配和 I/O 带宽。

容器通过 cgroups 来得到所能够管理资源的分配和使用。因此容器所获得资源仅为所有系统资源的一个部分

1、资源限制 : 内存子系统为进程组设置内存使用上限,内存达到上限后再申请内存,就会发出 Out of Memory

2、 优先级 : 通过优先级让一些组得到更多 CPU 等资源

3、 资源审计 : 用来统计系统上实际把多少资源用到适合的目的上 , 可以使用 cpuacct 子系统记录某个进程组使用的 CPU 时间

4、 隔离 : 为组隔离名字空间 , 这样一个组不会看到其他组的进程 .网络连接和文件系统

5、 控制 : 挂起 . 恢复和启动等操作

(3)联合文件系统 (Union File System) :

  docker 中使用AUFS(another Union File System 或 v2 版本以后的Advanced multi-layered Unification File System) 控制为每一个成员目录设定只读 / 读写 / 写出权限 , 同时 AUFS 有一个类似分层的概念 , 对只读权限的分支可以逻辑上进行增量的修改.

二、docker的存储

docker两种存储资源类型:

1、Data Volume (数据卷)

2、Data Volume Dontainers --- 数据卷容器

(1) Data Volume (数据卷):

Data Volume 本质上是 Docker Host 文件系统中的目录或文件,使用类似与 Linux 下对目录或者文件进行 mount 操作。数据卷可以在容器之间共享和重用,对数据卷的更改会立马生效,对数据卷的更新不会影响镜像,卷会一直存在,直到没有容器使用。

Data Volume(数据卷)的特点:

1、Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。

2、容器可以读写 volume 中的数据。

3、volume 数据可以被永久的保存,即使使用它的容器已经销毁。

 Data Volume 的使用:

1、在宿主机根目录下创建一个目录(数据卷)

2、启动一个容器并将数据卷挂载到容器的目录下

3、验证  ( 持久化的需要映射目录)

#

(2)Data Volume Dontainers --- 数据卷容器

数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其他容器挂载使用

Data Volume Dontainers使用:

1、创建一个名为 dbdata 的数据卷,并在其中创建一个数据卷挂载到 /dbdata

docker run -dti -v /dbdata --name dbser centos:latest

2、再启动两个容器,并使用数据卷容器

docker run -dti --volumes-from dbser --name db1 centos:latest

#

3、验证

#

容器 db1 和 db2 同时挂载了同一个数据卷到本地相同 /dbdata目录。三个容器任何一个目录下的写入,都可以时时同步到另外两个

三、docker 三种网络

  docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务,在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的

docker 安装时会自动在host上创建三个网络

docker   network  ls   (查看docker  网络)

(1) docker--none网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他 任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络

none网络的应用

封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

(2)docker--host网络

连接到 host 网络的容器,共享 docker host 的网络栈,容器的网络配置与host 完全一样。可以通过 --network=host 指定使用 host 网络

host 网络的应用

  直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,就可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。

Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables

(3) docker--bridge 网络

docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上

#

eth0@if29      与 veth04c5851 是一对 veth pair

#

  veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if29)在容器中,另一头( veth04c5851)挂在网桥 docker0 上,其效果就是将 eth0@if29也挂在了docker0 上。

# 查看网络配置信息 ( 设置容器ip 网段、网关)

docker network inspect bridge

#

注:容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器。

四、创建 user-defined网络 (自定义网络)

通过 bridge 驱动创建类似前面默认的 bridge 网络

1、利用bridge驱动创建名为my-net2网桥(docker会自动分配网段)

docker network create --driver bridge my-net2

# 查看网络配置信息

# 查看网桥

2、利用bridge驱动创建名为my-net3网桥(user-defined (自定义)网段及网关)

docker network create --driver bridge --subnet 172.33.1.0/ --gateway 172.33.1.1 my-net3

# 查看网络配置信息

# 查看网桥

3、启动容器使用新建的my-net3网络

docker run -it  --network=my-net3  busybox:latest

4、启动容器使用my-net3网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)

docker run -it --network=my-net3  --ip 172.33.1.100  busybox:latest

5、让已启动不同vlan的busybox容器,可以连接到my-net2(其实在busybox中新建了my-net2的网卡)(添加网卡。访问不同的网段)

# #docker network connect my-net3  08493ae30117   ( 连接)

6、使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined 网络,默认的 bridge 网络是无法使用 DNS 的。

#docker run -it --network=my-net3 --name=bbox1 busybox:latest

#docker run -it --network=my-net3 --name=bbox2 busybox:latest

7、容器之间的网络互联

&1、创建一个 db 容器

docker run -dti --name db centos:latest

&2、创建一个 web 容器,并使其连接到 容器db

docker run -dti --name web --link db:dblink centos:latest /bin/bash

--link db:dblink 实际是连接对端的名字和这个链接的名字,也就是和 db 容器建立一个叫做 dblink 的链接

# 测试

注:此链接通信是单向的

8、容器端口映射

在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的,当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射

(1)   -P : Docker 会随机映射一个 49000 ~ 49900 的端口到容器内部开放的网络端口

(2)   -p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。

支持的格式

IP : HostPort : ContainerPort

IP : : ContainerPort

IP : HostPort :

&1、 查看映射

docker port   CONTAINER ID/NAMES

&2、映射所有接口地址,此时绑定本地所有接口上的 5200 到容器的 5200 接口,访问任何一个本地接口的 5000 ,都会直接访问到容器内部

docker run -dti -p : centos:latest  /bin/bash

&3、多次使用可以实现多个接口的映射

docker run -dti -p :  -p : centos:latest  /bin/bash

&4、映射到指定地址的指定接口

此时会绑定本地 192.168.226.147 接口上的 5100 到容器的 5100 接口

docker run -dti -p 192.168.226.147:: centos:latest /bin/bash

&5、映射到指定地址的任意接口

此时会绑定本地 192.168.226.147 接口上的任意一个接口到容器的 5500 接口

docker run -dti -p 192.168.226.147:: centos:latest /bin/bash

实验、通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web

1、将容器80端口映射到主机8090端口

docker run -itd -p 192.168.226.147:: --name http-test httpd:latest

2、查看刚运行docker容器

docker  ps

3、进入 容器

4、容器内部编辑网页文件 index.html

5、到宿主机上打开浏览器输入 IP:PORT 访问验证

http://192.168.226.147:8090/

6、宿主机上传静态网站测试文件

7、解压

8、把解压的目录上传至容器下的网站根目录

docker cp jd 67b3daf15a40:/usr/local/apache2/htdocs

9、进入容器,删除原来的index.html 文件

10、展开目录

11、web 访问

http://192.168.226.147:8090/

docker (2)---存储、网络(利用docker容器上线静态网站)的更多相关文章

  1. Docker深入浅出系列 | 单节点多容器网络通信

    目录 教程目标 准备工作 带着问题开车 同一主机两个容器如何相互通信? 怎么从服务器外访问容器 Docker的三种网络模式是什么 Docker网络通信原理 计算机网络模型回顾 Linux中的网卡 查看 ...

  2. docker简单介绍---网络端口管理

    一.查看docker支持的网络类型 docker network ls bridge:容器使用虚拟交换机的进行通信 host:使用宿主机的网络 none:只给容器分配一个lo的网卡,无法和外界进行通信 ...

  3. [转帖]Docker四种网络模式

    Docker(十四)-Docker四种网络模式 https://www.cnblogs.com/zhuochong/p/10069293.html 计算机网络相关的知识 非常有用.. Docker 安 ...

  4. centos7下安装docker(12docker网络)

    docker 网络荣覆盖范围可分为:单个host上的容器网络和跨多个host的网络 docker 安装时会自动在host上创建三个网络,我们可以使用docker network ls查看到 1.non ...

  5. Docker(十四)-Docker四种网络模式

    Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看: none模式,使用--net=none指定,该模式关闭了容器的网络功能. host模式 ...

  6. Docker默认存储路径修改

    Docker默认存储路径: # docker info...... Data loop file: /var/lib/docker/devicemapper/devicemapper/data.... ...

  7. k8s集群上线web静态网站

    环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路1: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...

  8. docker容器网络—单主机容器网络

    当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...

  9. 利用 Docker 搭建 IPFS 私有网络

    利用 Docker 搭建 IPFS 私有网络 本文原始地址:https://sitoi.cn/posts/40630.html 下载项目 项目地址:https://github.com/Sitoi/p ...

随机推荐

  1. Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性

    4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...

  2. Mac设置命令别名

    文件中添加 /Users/xxx/.bash_profile 添加别名命令: alias pull='git pull origin' 注意:等号后面不能有空格 从新读取配置文件: source ~/ ...

  3. ImportError: No module named ‘MySQLdb'

    1.APP未注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contentty ...

  4. 九度oj 题目1026:又一版 A+B

    题目描述: 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. 输入: 输入格式:测试输入包含若干测试用例.每个测试用例 ...

  5. 被忽视的控件UIToolbar

    前言 UIToolbar以前也接触过,不过没有怎么用,久而久之就忘了他的存在,今天看别人源码的时候看见了,它怎么很方便,在排列一排视图的时候不需要我们算里面的坐标就可以轻松良好的把布局做出来 代码 U ...

  6. UITableView加载几种不同的cell

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. POJ1635 树的最小表示法(判断同构)

    Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, ther ...

  8. Spoj-VISIBLEBOX Decreasing Number of Visible Box

    Shadowman loves to collect box but his roommates woogieman and itman don't like box and so shadowman ...

  9. LightOJ1125 Divisible Group Sums

    Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...

  10. 填报志愿(codevs 2930)

    题目描述 Description 高考已经结束,而志愿填报正在进行中- 吴校长的学校里有n位同学,每位同学有ki个愿意去的大学.而在吴老师的省份中,有m所大学有招生名额.根据往年的经验,对于每所大学( ...