docker容器博文

来源:互联网 发布:淘宝身份证认证照片 编辑:程序博客网 时间:2024/06/05 15:08
--https://cloud.docker.com/ dotCloud是docker公司的前身,专注于Paas的云计算平台
--http://www.ubuntu.org.cn/download/server --ubuntu镜像下载
--https://hub.docker.com --docker官网
--http://www.iplaysoft.com/ubuntu.html --系统镜像下载
--https://www.centos.org/download/ --centos镜像下载
Docker依赖的linux内核特性
1、Namespaces命名空间
--封装,轻量级容器虚拟化,独立隔离的目的
--PID(Process ID)进程隔离
--NET(Network)管理网络接口
--IPC(interprocess Communicaton)管理跨进程通信的访问
--MNT(Mount)管理挂载点
--UTS(Unix Timesharing System)隔离内核和版本标识
2、control groups(cgroups)控制组
--用来分配资源 内存使用上限,内存超过就会溢出
--优先级设定 设定某个线程组使用更大的IO资源
--资源计量 计算线程组使用多少IO资源
--资源控制 资源挂起


docker容器的能力
文件系统隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器件的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个Docker容器


open vswitch
open vswitch是一个高质量的,多层虚拟交换机,使用apache2.0协议,由nicira networks开发,主要实现代码
可一直的C代码,他的目的是让大规模网络自动化可以通过网络扩展,同时仍然支持标准的管理接口和协议


GRE
GRE:通用路由协议封装
隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据
(可以是不同协议的数据帧或包。隧道协议将其他协议的数据帧或包重新封装然后通过隧道发送,新的帧头提供路由信息
以便通过互联网传递封装的负载数据)




Container
传统虚拟化与容器虚拟化的区别
传统虚拟 容器虚拟化


创建速度 很慢 很快

性能影响 通过对硬件层的模拟,共享Kernel,几乎没有性能损耗
增加了系统调用链路的环节
有性能的损耗


资源消耗 很大 很小,一台机器可以轻松创建多个Containner


操作系统覆盖 支持Linux仅仅Kernel所支持的OS
Windows,mac等

Container的核心技术
1、CGroups限制容器的资源使用
--Linux内核提供的限制,记录和隔离进程组所使用的资源由Google工程师提出,后来被整合到kernel
--通过不同的子系统(blkio,cpu,cpuacct等)来实现对不同资源使用的控制和记录


2、Namespace机制,实现容器间的隔离
--封装,轻量级容器虚拟化,独立隔离的目的
--PID(Process ID)进程隔离
--NET(Network)管理网络接口
--IPC(interprocess Communicaton)管理跨进程通信的访问
--MNT(Mount)管理挂载点
--UTC每个容器有独立的hostname和domain
3、chroot,文件系统的隔离




docker实现
--docker也是container技术实现,最早使用LXC作为container的引擎,最新版本的docker使用libcontainer替换了lxc
--采用aufs文件系统来管理image和container
--advanced multi layer unfication filesystem
--可以实现把多个不同目录的内容融合到一起
--准许read-only和read-write目录并存
--docker使用aufs来实现分层的文件系统的管理
--制度部分定义为image,可写部分是container
--image类似一个单链表系统,每个image包含一个指向parent image的指针
--没有parent image 的image是base image
--基于C/S架构的实现,Server端使用UnixSocket,也可以切换到TcpProtocol




docker hub
--类似于GitHub的服务,用来分发image
--大量标准的image,例如Tutum/Ubunt,Tutum/Mysql 
--docker官网提供的用来共享image的平台
--Automated Builds image通过和Github的继承,自动监控github项目中的变化,构建新的image然后自动发布到docker hub中
--https://hub.docker.com


镜像命名和版本管理
--1、base image是docker官网提供的基础镜像
--2、普通镜像的命名规范{namespace}/{repository name}/{tag}
--3、namespace是docker hub的用户名,实际是提到了namespace的作用
--4、repository,类似GitHub项目
--tag,表示版本信息,例如cesc/mysql5.5,tag是可选的,默认值是latest


docker和LXC区别
--docker更专注部署,而LXC专注于进程的隔离
--docker有更好的api方便对于docker容器的管理
--dockerfile让image的创建变得容易
--通过docker hub方便image的分享


编写dockerfile
1、通过使用buid命令,根据Dockerfile的描述来构建镜像
两种方式--通过源代码路径的方式
--1、Dockerfile需要放置在项目的根目录位置
--2、在构建的时候Docker Client会把整个Context打包发送到Docker Server端,然后由Server端负责build镜像在构建成功后,会删除Context目录
--3、docker build -t {镜像名称}{项目的路径,可以是相对路径}
--4、Dockerfile中的每个指令完毕后,都不会提交为一个image,这样保证了指令之间不会影响
--5、Docker会尽可能尝试重用之前已经构建的镜像
--6、可以通过build命令中增加一no-cache的方式是来禁用cache

--通过标准输入流的方式



Linux FS
1、boot file system(bootfs)包含bootloader和kernal在启动完成后,kernel在内存中,bootfs解除挂在
2、root file system(rootfs)包括类似/bin/usr/lib等目录,这些适合kernel无关,和不同的Linux分发版本有关


FS in Docker
1、传统linux启动时,将rootfs设置为readonly并检查完整性,然后设置reasd-write
2、Docker启动container的时候,也是吧rootfs设置为readonlu,然后通过aufs把一个readwrite的文件系统挂在到rootfs智商,并且把下层文件系统设置成readonly,这样构成一个完整的操作系统


image
1、除了base image之外,每一层image都有一个parent image
2、没有parent image的镜像叫base image
3、基于COW的技术,image部分是不会被修改的,因此container可以共享image层的FS,提高了存储的效率


Storage driver
1、除了默认的aufs之外,docker通过对于storage的轴像,可以支持一些其他的storage driver
2、修改docker启动时候的参数,增加一storage-driver={storage plugin}在配置文件中


search image 
1、docker search {repository name}
2、默认实在docker hub上进行搜索


pull image
1、docker pull {image name}
2、如果不指定tag的话,会把该image的所有tags都download下来


上传镜像
1、docker login,登陆到docker hub中
2、把container通过docker commit 的命令转换成一个image
3、通过docker tag 来命名新生成的image
4、docker push 到 docker hub中


运行Container
1、运行一个container的本身就是开启一个具有独立namespace的进程
2、docker通过run命令来启动一个container
3、运行一个container必须制定一个image作为初始化文件系统


Command
1、Command标志的是在cpmtaomer中实际运行的首进程
2、如果image里面包含了CMD的指令,那么在启动container的时候,不需要指定Command,否则会使用制定的Command来覆盖image中的CMD


前台运行 vs 后台运行
1、默认的container是在前台运行的,会绑定command进程stdin,stdout,stderr到console上
2、可以通过-d的选项让container运行在后台
3、如果是在前台运行,也可以通过指定-a{stdout,stdin,stderr}选择需要绑定的io
4、通过attach命令可以重新attach一个后台运行的container


Container identification
1、在后台运行情况下,run命令会返回一个UUID唯一标示Container
2、可以通过docker ps来查看container的UIID和运行信息
3、可以通过制定 name 的方式来制定container的名字,name不是必须唯一


inspect 
1、通过docker inspect{Container ID}来获取container的更多信息,包括网络,volume,实际在host上的进程ID等信息


log
1、通过logs命令可以看到container中command所指向进程的stdout,stderr数据


环境变量
1、通过-e参数,可以在运行container的时候添加系统环境变量


网络设置
1、docker使用bridge的方式实现Container之间以及和外部的通信
2、通过 net参数来修改container的网络设置,默认是bridge的方式
3、none表示关闭container的网络连接
4、host表示使用主机的网络栈,这个时候host主机不会创建veth虚拟网卡映射
4、container:{name:id},使用另外一个container的网络栈


NetWork架构
1、在host主机上的一个veth{id}的虚拟网卡和一个container里面的eth0网卡一一映射
2、host上的bridge负责把数据流在不同的veth间转发实现网络IO
3、bridge(docker0)使用RFC1918私有网络,每一个container分配IP


DNS
1、默认使用hsot的DNS配置
2、可以通过dns的参数来制定container自己的dns配置


端口映射
1、Dokcer通过采用端口映射的方式,准许把内部container的服务端口暴露到外部
2、使用-p参数可以制定需要暴露的container的内部端口,在不指定特定host的对应端口的情况下,docker会自动分配(49000-49900)在上面host上的端口与其映射
3、使用-p参数,表示暴露所有在image中通过EXPOSE制定的端口


Volume绑定
1、通过-v参数,可以把host上的以及目录绑定到container中,准许container对其进行读写


容器间的通信
1、通过Link参数,把container的端口信息暴露到另一个container中,实现container之间的通信 


Dockerfile
build cache
1、Dockerfile中的每一个指令执行完毕后,都会提交一个image,这样保证了指令不会有影响
2、Docker会尽可能尝试重用之前已经构建的镜像
3、通过在build命令中增加 no-cachede的凡是来禁用cache 


.dockerignore
1、当原则用源代码路径的方式构建image的时候,通过在根目录下放置.dockerignore文件,来过滤不需要发送到server端的文件
2、类似.gitignore的概念


Dockerfiel指令
1、只支持docker自己定义的一套指令,不支持自定义
2、大小写不明感,建议全部使用大写
3、根据Dockerfile内容顺序执行


--docker指令:FROM
1、FROM{base镜像}
2、必须放在Dockerfile的第一行,表示从哪个BaseImage开始构建 


--docker指令:MAINTAINER
1、可选的,用来表示image作者的地方


--docker指令:RUN
1、每一个run指令都会有一个新的Container里面运行,并提交一个image作为下一个run的Base
2、一个Dockerfile中可以包含多个run,按定义顺序执行
3、run支出两种运行方式
--run <cmd> 这个会当做/bin/sh -c "cmd"运行
--run["executable","age1",...]Docker把它当做json的序列来解析,因此必须用双引号,而且executable需要时完整路径

--Docker指令:CMD
1、CMD的作用是作为执行Container时候的默认行为
2、当运行Container的时候声明了Command,则不再使用Image中的CMD所定义的命令
3、一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候在,只有最后一个才会起动作


--CMD定义三种方式
1、CMD<cmd>这个会当做/bin/sh -c "cmd"来执行
2、CMD["executable","arg1","arg2"]
3、CMD["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数 


--Docker 的C/S模式 --连接方式
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
0 0
原创粉丝点击