1、命名空间 (Namespaces) html
2、控制组 (Control Groups) linux
3、联合文件系统 (Union File System) web
4、Linux 虚拟网络支持:本地和容器内建立虚拟接口docker
实现了容器间资源的隔离,每一个容器拥有本身独立的命名空间 , 运行其中的应用就像是运行在独立的操做系统中同样 , 咱们均可以看到文件系统,网卡等资源保证了容器之间互不影响,namesaces管理进程号 , 每一个进程命名空间有一套本身的进程号管理方法 , 进apache
程命名空间是一个父子关系的结构 , 子空间中的进程对于父空间是可见的。centos
控制组 (Control groups)--CGroups 是 Linux 内核的一个特性 ,主要用来对共享资源进行隔离、限制、审计等 。cgroups 容许对于进程或进程组公平( 不公平 ) 的分配 CPU 时间、内存分配和 I/O 带宽。浏览器
容器经过 cgroups 来获得所可以管理资源的分配和使用。所以容器所得到资源仅为全部系统资源的一个部分安全
1、资源限制 : 内存子系统为进程组设置内存使用上限,内存达到上限后再申请内存,就会发出 Out of Memorybash
2、 优先级 : 经过优先级让一些组获得更多 CPU 等资源网络
3、 资源审计 : 用来统计系统上实际把多少资源用到适合的目的上 , 可使用 cpuacct 子系统记录某个进程组使用的 CPU 时间
4、 隔离 : 为组隔离名字空间 , 这样一个组不会看到其余组的进程 .网络链接和文件系统
5、 控制 : 挂起 . 恢复和启动等操做
docker 中使用AUFS(another Union File System 或 v2 版本之后的Advanced multi-layered Unification File System) 控制为每个成员目录设定只读 / 读写 / 写出权限 , 同时 AUFS 有一个相似分层的概念 , 对只读权限的分支能够逻辑上进行增量的修改.
1、Data Volume (数据卷)
2、Data Volume Dontainers --- 数据卷容器
Data Volume 本质上是 Docker Host 文件系统中的目录或文件,使用相似与 Linux 下对目录或者文件进行 mount 操做。数据卷能够在容器之间共享和重用,对数据卷的更改会立马生效,对数据卷的更新不会影响镜像,卷会一直存在,直到没有容器使用。
1、Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
2、容器能够读写 volume 中的数据。
3、volume 数据能够被永久的保存,即便使用它的容器已经销毁。
1、在宿主机根目录下建立一个目录(数据卷)
2、启动一个容器并将数据卷挂载到容器的目录下
3、验证 ( 持久化的须要映射目录)
#
数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其余容器挂载使用
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 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务,在启动容器的时候,若是不指定参数,在容器外部是没有办法经过网络来访问容器内部的网络应用和服务的
docker network ls (查看docker 网络)
none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其余 任何网卡。容器建立时,能够经过 --network=none 指定使用 none 网络
封闭的网络意味着隔离,一些对安全性要求高而且不须要联网的应用可使用 none 网络。
链接到 host 网络的容器,共享 docker host 的网络栈,容器的网络配置与host 彻底同样。能够经过 --network=host 指定使用 host 网络
直接使用 Docker host 的网络最大的好处就是性能,若是容器对网络传输效率有较高要求,就能够选择 host 网络。固然不便之处就是牺牲一些灵活性,好比要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。
Docker host 的另外一个用途是让容器能够直接配置 host 网路。好比某些跨host 的网络解决方案,其自己也是以容器方式运行的,这些方案须要对网络进行配置,好比管理 iptables
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 能够供容器。
经过 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/24 --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 :
docker port CONTAINER ID/NAMES
&2、映射全部接口地址,此时绑定本地全部接口上的 5200 到容器的 5200 接口,访问任何一个本地接口的 5000 ,都会直接访问到容器内部
docker run -dti -p 5200:5200 centos:latest /bin/bash
&3、屡次使用能够实现多个接口的映射
docker run -dti -p 5400:5400 -p 5300:5300 centos:latest /bin/bash
&4、映射到指定地址的指定接口
此时会绑定本地 192.168.226.147 接口上的 5100 到容器的 5100 接口
docker run -dti -p 192.168.226.147:5100:5100 centos:latest /bin/bash
&5、映射到指定地址的任意接口
此时会绑定本地 192.168.226.147 接口上的任意一个接口到容器的 5500 接口
docker run -dti -p 192.168.226.147::5500 centos:latest /bin/bash
1、将容器80端口映射到主机8090端口
docker run -itd -p 192.168.226.147:8090:80 --name http-test httpd:latest
2、查看刚运行docker容器
docker ps
3、进入 容器
4、容器内部编辑网页文件 index.html
5、到宿主机上打开浏览器输入 IP:PORT 访问验证
6、宿主机上传静态网站测试文件
7、解压
8、把解压的目录上传至容器下的网站根目录
docker cp jd 67b3daf15a40:/usr/local/apache2/htdocs
9、进入容器,删除原来的index.html 文件
10、展开目录
11、web 访问