LXC  

   Linux Container   

  namespaces         六种名称空间        
   主机名和域名            UTS
   文件系统                   Mount
   进程间通信               IPC
   进程树                      PID
   用户和用户组           User
   网络接口                  NetWork

cgroups

     cpu和内存,块设备分配资源限制

     blkio:块设备IO 

     cpu:CPU 

     devices:设备访问 

     memory:内存用量及报告 

  可以通过在一个主机创建不同的名称空间直接在实现不同的网络模型   在同一个主机上可以创建多个名称空间

docker镜像

     分层构建 联合挂载的机制来实现  镜像包含启动容器所需要的文件系统及其内容   bootfs用来启动并引导用户空间 引导完成后自动被卸载 rootfs提供根文件系统

     最基础的baseimage是由dockerhub的维护人员手动创建的

     传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式, 完整性自检完成后将其重新挂载为读写模式 

     docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载 ”技术额外挂 载一个“可写”层

容器底层基础概念_docker

 

docker Registry

   1.提供镜像的存储
   2.提供用户的认证
   3.提供镜像的索引

   一个 Registry中可以存在多个Repository 

   在Registry中会包含很多个应用程序的repo(仓库)   每一个repo中只会存放一个应用程序的镜像   其中会包含应用程序的不同版本

   仓库名(nginx)就是应用程序的名称 其中包含多个镜像名如 nginx:1.10  nginx:1.11  nginx:1.12  镜像标识是通过tag来唯一标识的  

    dockerhub    仓库
    docker push/pull   仓库:标签

    非dockerhub仓库上传下载镜像
    docker push/pull      服务器地址/名称空间/仓库:标签
    docker pull registry.cn-hb.com/namespace/httpd:v1

 

docker tag(标签)

     1.基于ID打标签

            docker   tag   9133dae37bd8       mageedu/busybox/httpd:latest 

     2.基于名称和标签打标签

           docker   tag    mageedu/busybox/httpd:v0.1    mageedu/busybox/httpd:version0.1 

     3.为私有Registry打标签

           docker   tag   9133dae37bd8     myregistry:5000/busybox/httpd:v0.1

Docker objects

     docker实现restful风格的接口,所以每个组件都可以当成资源和对象来管理每个对象都可以通过rest接口实现增删改查管理操作

      images,containers,networks,volumes,plugins

docker基础网络

      一个设备只能属于一个名称空间   内核支持两种设备的模拟  

           二层(网卡,网桥)设备      模拟网线的两端 veth_pair 

           三层设备(路由器)   内核可以直接当路由器使用  也可以使用一个单独的名称空间来实现

    三种网络模型
          bridge       nat桥
          host
          none

    overlay网络 叠加网络
        两级三层报文封装
       多封装一个物理机器IP头部,通过物理机之间网络发送数据包

    容器可以共享其它容器的网络名称空间     joined   container
    容器也可以共享宿主机的网络名称空间     open    container

[root@docker-node ~]# ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id

创建虚拟网卡对
# ip link add name veth1.1 type veth peer name veth1.2
# ip link show
# ip link set veth1.2 netns r1
# ip netns exec r1 ifconfig -a
# ip netns exec r1 set dev veth1.2 name eth0
# ifconfig veth1.1 10.0.0.1/24 up
# ip netns exec r1 eth0 10.0.0.2/24 up

ip命令创建虚拟网卡

  服务运行在容器和直接运行在宿主机上的区别: 

     把nginx服务安装到宿主机
         1.  安装nginx软件
         2.  修改配置文件
         3.  启动服务

 用容器的方式运行nginx并且共享宿主机的网络名称空间

     直接使用docker run nginx即可把nginx服务运行起来 充分利用了容器的优势 同时也保留了通过宿主机的网络接口直接对外提供服务的特性

容器暴露端口方式
    -p       容器端口
        docker自动添加了宿主机防火墙DNAT规则 映射到宿主机的随机端口
    -p      宿主机ip::容器端口
    -p      80(宿主机端口):80(容器端口)

    -P     暴露容器指定的所有端口 映射到宿主机的随机端口

            默认情况下运行容器的时候是不会自动暴露任何端口的

 

 docker和容器之间的关系

     docker本身不是容器,只是一个容器的前端管理工具,有了docker,用户可以很容易的创建和管理容器,极大的降低了容器技术的使用门槛

     容器资源隔离的优势  隔离的是用户空间  共享同一个内核空间

 

docker和主机虚拟化之间的区别

容器底层基础概念_docker_02

 

 

docker容器

         启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地 

 

docker volume(存储卷)

    由于docker镜像采取的是分层设计 联合挂载的文件系统机制,所以docker容器对于IO操作的效率会特别的低,不适合把对IO要求较高的应用的数据保存到容器本身文件

    系统的目录 volume的本质是把宿主机的某个目录或者网络共享存储系统种的某个目录和容器内的某个目录建立mount bind关系

    使用volume实现了当容器内的进程向容器内指定的目录写如数据的时候是直接写入到宿主机获取远程主机上的,跳过了容器内部文件系统的限制同时防止了容器

    发生异常导致数据丢失的情况

    容器中某个目录     映射到       宿主机某个目录(NFS客户端)       映射到       网络共享存储系统目录(NFS服务端) 

   有状态应用
          当前的连接请求的处理和上一次的连接有关联关系的 大多数的有状态应用都是需要持久存储数据的
   无状态应用
         当前的连接请求的处理和上一次的请求处理没有任何关联关系

容器底层基础概念_名称空间_03

     存储卷的两种类型    

      1.bind 挂载卷
            需要同时指定 容器目录 和 宿主机中的目录

            docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox 
      2.docker managed 卷
           只需要指定容器中挂载目录 宿主机的目录有docker后台进程自动创建

           docker  run  -it  -name bbox1 –v /data  busybox 

      3.共享容器卷

         1.创建一个基础架构容器指定存储卷类型,这个容器只需要创建好就行,甚至不需要处于运行状态

         2.其它应用容器在启动的时候指定复制指定基础架构容器的卷设置即可    

            docker run -it --name bbox2 --volumes-from bbox1 busybox    

            docker run --name nginx  --network container:basecontainer   --volumes-from basecontainer

               nginx 监听外网ip接口 接收用户请求

            docker run --name  tomcat   --network container:basecontainer   --volumes-from basecontainer

              tomcat 监听本地lo接口  只对nginx容器提供服务

            docker run --name   mysql    --network container:basecontainer  --volumes-from basecontainer

              mysql 监听本地lo接口   只对tomcat容器提供服务

     

容器底层基础概念_名称空间_04

       3.由于docker使用Go语言开发,所以查看docker的详细信息时候  可以使用go模板语言来获取  可以实现迭代和if判断

          1.    docker inspect -f {{.Config.Volumes}}{{.Mounts}} bbox1 

          2.    docker inspect -f {{.Mounts}} bbox2

          3. [root@nginx-docker ~]# docker inspect -f {{.NetworkSettings.SandboxID}} aaa

                6e298c2a7d10c337e64f69f54a9e75276865ca5a813c857911fdf0dd1e94c83b

           {{ .}}    .表示根对象 然后以属性的方式一级一级获取容器相关信息