容器,依托Linux内核功能的虚拟化技术
docker 将软件和库部署在主系统上
特点
PaaS platform as service
Saas software as service
docker
- 客户端/守护进程
- 镜像image,启动容器的所有信息,层叠只读文件系统
(1.boot fs (基础镜像)-> 2.root fs (ubuntu) -> 3.add emacs,appache联合加载文件系统) - 容器 container 启动和执行阶段,写时复制copy on write,可写层
创建新容器,创建可写层+镜像层=镜像,有服务可运行 - 仓库 registry ,保存用户构建的镜像
docker 容器基本操作
docker pull IMAGE
启动交互式命令,有终端
docker run -it IMAGE /bin/bash
-i -interactive 交互,false 默认
-t -tty 终端,false默认查看容器
docker ps -la
-l 最新创建的容器
-a allinspect 检查
docker inspect container_name/container_id自定义容器名字
docker run --name=name_self -ti mysql /bin/bash重新启动停止的容器
docker start -i container_name删除已经停止的容器
docker rm container_name删除镜像
docker rmi image
docker 守护容器
docker run -it ubuntu /bin/bash
使用ctrl+p /ctrl +q退出,后台运行docker ps -a
查看容器在后台仍然运行docker attach container_iid
可以进入容器docker run --name container_name -d ubuntu /bin/bash -c "while true,do echo hello word;done"
后台执行守护进行-ddocker logs -f -t --tail container_name
-f --follow 一直跟踪
-t --timestamps 打印时间戳
--tail = “all” 结尾多少数量的日志
ex:docker logs -tf --tail 10 container_name 最新的10条日志docker top container_name
查看运行容器中的进程docker exec -d -i -t container_name
在运行中的容器内启动新进程,开启容器的多进程
docker top 命令查看是否多进程docker stop/kill container_name
stop 发送信号,让容器停止,需要一定时间返回容器名字
kill 直接暴力停止容器运行容器端口映射
-p --publish=[]
1.宿主机端口随机对应 container port
docker run -p 80 -it ubuntu /bin/bash
2.都进行指定端口 host port:container port
docker run -p 8080:80 -it ubuntu /bin/bash
3.对容器端口指定 ip:container port
docker run -p 0.0.0.0:80 -it ubuntu /bin/bash
4.对容器端口指定 ip:host port:container port
docker run -p 0.0.0.0:8080:80 -it ubuntu /bin/bash
容器内部署静态网站
修改nginx/defalut.conf
host port : http://localhost:12345
container port : http://172.17.0.1:80
docker inspect container_name
- stop-> start docker ,ip地址和端口都发生了改变
- ctrl+p 退出后台运行
docker exec -i container_name nginx 运行一次nginx,
docker top 查看是否启动
docker inspect container_name 查看对应IP地址
1.control groups 控制组(分配资源)
- 资源限制-mem达到上限,outofmem
- 优先级设定-更大磁盘io,CPU
- 资源计量
- 资源控制,挂起/恢复
隔离
文件系统(每个系统有自己root文件系统),
NET 网络(虚拟网络接口和IP地址是分开的),
PID,进程(容器运行在自己的进程环境中),
MNT (挂在点)资源隔离和分组(CPU,cgroups,内存独立分配给docker容器)
IPC 跨进程通信访问
docker 网络链接
ifconfig 系统网络设备
- 桥接/虚拟网卡docker0,网桥-osi七层(数据链路层:应用,表示,会话,传输,网络,数据链路,物理)
ex:172.12.42.1,子网掩码:255.255.0.0 -地址:65534个 - install brigde-utils 下载
- brctl show 查看网桥
自定义虚拟网桥
自定义 docker0
- ifconfig docker0 192.168.200.1 netmask 255.255.255.0
- service docker restart 重启docker 服务
- 运行容器,查看容器的ip地址
添加虚拟网桥
- brctl addbr br0
- ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker 守护进程的启动配置
- /etc/default/docker 中添加DOCKER_OPS值="addbr"
-b=br0 - 重启docker service
- ps -ef |grep docker
Dockerfile可以构建镜像
docker 仓库,标签
- 不同标签对应的是相同的仓库
- 删除注意
- 自定义镜像以软件形式打包并分发及其运行环境
- docker commit 通过容器构建
-- docker commit [options] CONTAINER [REPOSITORY:[TAG]]
-- -p 不让容器暂停
-- ex: docker commit -a author -m "container_id/container_name" repo_name:tag - docker build 通过Dockerfile 文件构建
First Dockerfile
FROM ubuntu:14:04
MANITAINER docker_hub_path_name
RUN apt-get update
RUN apt-get install -y nginx
expose 80
CMD /bin/bash
First Dockerfile volume
FROM ubuntu:14:04
VOLUME ["/a1","/a2"]
CMD /bin/bash
docker 构建命令
docker build -t="image_name_tag"
- t --tag="tag name"
每一步返回一个id,这是中间层的镜像
Docker Hub 查找与拉取镜像 - pull,push,search
- 本地与远程镜像互动操作
- docker hub 网站,需要注册 账号
- docker search ubuntu
- docker pull image ubuntu:tag
- docker 使用第三方平台拉取镜像
-- 修改docker的配置文件 /etc/default/docker DOCKER_OPTS = "加速地址"
-- 重启docker 服务并查看docker 的守护进程
-- 例如 :注册daocloud,加速器-> 加速地址 - docker push 传送镜像到docker hub,提交修改的部分
docker 容器的数据卷volume
添加数据卷在启动容器前
docker run -v ~/datavolume:/data -it ubuntu /bin/bash
-v volume 相当于挂载
添加对数据卷的权限访问
- docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash
:ro read only - docker inspect container_name
查看具体数据卷的权限
-- 独立于docker 容器,分离docker容器的生存周期,可以目录,文件进行数据共享(一数据卷对多容器)
-- 容器对数据卷的修改是及时进行的
-- 数据卷变化不会影响镜像的更新
docker 容器的数据卷容器(不用暴露主机的目录)
创建数据卷容器
- docker run --volumes-from container_name
创建容器后常见挂载数据卷
- 在数据卷容器内 touch 文件
查看host 主机的数据卷情况
- docker inspect --format="{{.Volumes}}" container_dv1
- docker inspect --format="{{.Volumes}}" container_dv2
总结:
1.数据卷容器删除,还是在容器查看对应的数据卷信息,证明数据卷容器只是配置作用
2.docker 中如果一个容器的数据卷还是使用,就不会被删除掉
数据卷的备份和还原-数据备份
docker run --volume-from [container_name] -v $(pwd 目录:/backup ubuntu tar cvf /xvf /backup/backup.tar [container data volume ]
- cvf 压缩
- xvf 解压
docker run --volume-from dv1 -v /backup_datavolume:/backup --name dv2 ubuntu tar cvf /xvf /backup/backup.tar /datavolume1
host : /backup_datavolume
re ### 容器互联
docker run -it --name --link:cct1:webtest container_path_name
重启docker,仍然可以实现ip地址(容器)不变,容器之间可以互相链接
容器拒绝互联,通过ping验证
--icc= false
允许特定容器之间的互联
--icc= false --iptables=true
--link
re ### Docker容器跨主机链接
- 网桥实现跨主机容器链接
- 使用Open vSwitch实现跨主机容器链接(虚拟主机)
- 使用weave实现跨主机容器链接(开源)
容器的集群管理Caas
容器的调度:docker swarm,kubernetes(google)
同步集群:etcd,zookeeper
服务发现:etcd,haproxy
日志监控:elk
云集容器管理
-- 除了以上
-- 网络配置
-- 安全配置
-- 负载均衡
-- 数据持久化
-- 容错、高可用Parcelles
Caas 概述
- 提供容器运行平台并管理容器所需资源
- Iaas灵活,Paas搬便利
- 支持多租户
- 伸缩性-弹性的扩大或缩小所需资源
- 可视化(UI)和可控性
Caas机遇和挑战
1.共享容器技术带来的所有优势
2.解决了Iaas和Paas在实践中存在的问题
3.应用开发专注于应用开发,一键配置
4.快速迭代,简化部署
5.微服务的理想平台
挑战:
1.共享容器技术不足
2.技术日新月异
3.容器镜像云平台化
4.国内社区认知度不高