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 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容器
启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地
docker volume(存储卷)
由于docker镜像采取的是分层设计 联合挂载的文件系统机制,所以docker容器对于IO操作的效率会特别的低,不适合把对IO要求较高的应用的数据保存到容器本身文件
系统的目录 volume的本质是把宿主机的某个目录或者网络共享存储系统种的某个目录和容器内的某个目录建立mount bind关系
使用volume实现了当容器内的进程向容器内指定的目录写如数据的时候是直接写入到宿主机获取远程主机上的,跳过了容器内部文件系统的限制同时防止了容器
发生异常导致数据丢失的情况
容器中某个目录 映射到 宿主机某个目录(NFS客户端) 映射到 网络共享存储系统目录(NFS服务端)
有状态应用
当前的连接请求的处理和上一次的连接有关联关系的 大多数的有状态应用都是需要持久存储数据的
无状态应用
当前的连接请求的处理和上一次的请求处理没有任何关联关系
存储卷的两种类型
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容器提供服务
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
{{ .}} .表示根对象 然后以属性的方式一级一级获取容器相关信息