Docker 实践指南
2024-05-20 15:52:49 5 举报
AI智能生成
Docker 实践指南
作者其他创作
大纲/内容
Docker 简历
开源项目改名为Moby
商业目的,docker流量全导向商业产品 Docker EE和Docker CE
将商品产品和开源项目区分开
为何就运而生
1. 全栈应用,体系臃肿
2. 迭代速度要求高,微服务化趋势,环境依赖问题棘手
3. 资源消耗大,环境管理复杂度高
核心技术
Linux namespace
PID
隔离:进程pid
目的:不同空间拥有相同pid;
无法kill父节点或者兄弟节点的进程
无法kill父节点或者兄弟节点的进程
Network
独立的网络空间,独立网卡状态
通过全局routing process控制容器的网络转发
Mount
挂载配置隔离,相同挂载点不同进程拥有不同的
挂载配置,不同的读写文件
挂载配置,不同的读写文件
User
隔离 用户和用户组
IPC
信号量、消息队列和共享内存
UTS
隔离:主机名与域名
目的:在网络上可以被视作一个独立的节点而非宿主机上的一个进程
Linux CGroups
UnionFS
堆栈式的文件系统,如何花卷
多个文件系统可以挂在同一个目录(联合目录)使用
读:联合目录下有各分支的数据,如果多个分支有相同文件名存在优先级
写:拷贝要修改的文件到rw分支后进行修改保存(copy on write),原始文件不变
删:在rw层通过whiteout属性标识ro层文件隐藏不可见
Docker分层设计
可读可写层
存放修改rootfs后产生的增量
不同的容器基于相同的只读层维
护自己的应用层和可写层
护自己的应用层和可写层
Init层
Docker项目单独生成的一个内部层,专门用
来存放/etc/hosts、/etc/resolv.conf等信息
来存放/etc/hosts、/etc/resolv.conf等信息
意义:启动时需要修改的配置,只对单容器有效,
commit不会保存该层数据
commit不会保存该层数据
只读层
1. 根文件系统rootfs,将操作系统和lib依赖打包后的镜像
2. rootfs只是一个操作系统所包含的文件、配置和目录,
并不包括操作系统内核
并不包括操作系统内核
3. 可共用,不同的容器相同的操作系统层和环境层
Docker理念:一个应用一个容器
低性能消耗:剔除了Hypervisor和虚拟机操作系统层,如开启应用一样轻量
低存储消耗:基于UnionFS,共享真实操作系统存储资源
能做什么
更快、更一致的交付你的应用程序
跨平台部署和动态伸缩
让同样的硬件提供更多的产出能力
核心组成
镜像
只读启动
分层
每层有唯一id,不同镜像共享相同id镜像层,实现1+1 <2
写时复制
启动时剔除拷贝文件系统过程,实现秒级启动
命名方式
username/repository:tag
容器
网络
核心模型
沙盒 ( Sandbox )
网络 ( Network )
端点 ( Endpoint )
数据卷
运行时设计
docker daemon
运行docker服务,并提供RestFul API接口
运行docker服务,并提供RestFul API接口
docker-cli
通过api接口配置管理docker
通过api接口配置管理docker
使用容器
Docker 安装
Linux
原生支持运行docker daemon服务
Windows,Mac
通过Hypervisor虚拟linux环境,
在其运行docker daemon服务
在其运行docker daemon服务
Windows虚拟化技术:Hyper-V
Mac虚拟化技术:HyperKit
Docker镜像操作
获取
docker pull
docker search
管理
docker images 查看本地所有镜像
docker inspect 查看镜像详细
docker rmi 删除镜像
运行管理
创建 & 启动
docker run
进入窗口
docker exec
docker attach
管理
docker ps
dokcer start
docker stop
docker rm
操作
docker exec
运行给出的命令
docker attach
网络配置
网络驱动类型
Bridge
Overlay
Host
MacLan
None
管理网络
docker network create
docker network ls
docker run --network 创建容器时指定子网
网络交互
容器互联(容器在同一子网内)
--link 指定要连接通讯的容器
--expose 被连接容器对外暴露端口
端口映射
-p <ip>:<host-port>:<container-port>
数据存储管理
挂载方式
Bind Mount
将宿主操作系统中的目录和文件挂载到容器内的文件系统中
使用:-v <absolute_host-path>:<absolute_container-path><:ro/rw>
使用场景
从宿主机共享配置给容器
直接从宿主机推送数据给容器
Volume
宿主操作系统中挂载目录到容器内,只不过挂载的目录由 Docker 进行管理;
本质上仍然是宿主机上一个目录,不过这个目录存放在Docker内部,接受Docker的管理
本质上仍然是宿主机上一个目录,不过这个目录存放在Docker内部,接受Docker的管理
使用
-v <name>:<container-path>
docker volume rm 删除卷
docker volume prune 删除没有被引用的卷
使用场景
多个容器间目录共享
数据卷容器,定义一个或多个数据卷挂载,
以--volumes-from引用数据卷容器,完成挂载,屏蔽细节
以--volumes-from引用数据卷容器,完成挂载,屏蔽细节
Tmpfs Mount
挂载系统内存中的一部分到容器的文件系统里,非持久存储,超高IO
使用:--tmpfs <absolute_container-path>
使用场景
不需要进行持久化保持的敏感数据(非持久,程序隔离)
读写速度要求高且不需要持久化保存(内存的高速读写)
Jianbo Sun – 浙江大学SEL实验室:
http://www.sel.zju.edu.cn/?author=4
http://www.sel.zju.edu.cn/?author=4
操作镜像
镜像本质
Docker 镜像的本质是多个基于 UnionFS 的镜像层依次挂载的结果,
而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。
而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。
容器中的这个可读可写的沙盒环境持久化为一个镜像层的方法
保存与共享
提交容器更改
docker commit
镜像命名
docker tag 对已有镜像命名
docker commit 提交时命名
镜像迁移
docker save 保存(一个或多个)镜像输出到文件
docker load 从文件中导入镜像
容器导出导入
docker export
docker import
Dockerfile创建镜像
收藏
收藏
0 条评论
下一页