网站文件怎么做/网站seo关键词排名推广
《深入浅出docker》
- 容器的发展之路
应用的部署从单一服务器,到虚拟机,再到容器,都是为了解决资源合理分配的问题。
虚拟机的不足:
虚拟机缺点是:
- 最大的缺点是依赖其专用的操作系统。OS会占用额外的CPU、RAM、和存储,而这些资源本可以用于运行更多的应用
- OS还需要补丁和监控;
- 某些情况下,OS还需要许可证
这写都对运营成本和资金性支出都是一种浪费
容器的优点:
- 容器的运行不会独占操作系统,实际上运行在同一个宿主机上的容器是共享一个操作系统的
- 容器还具有启动快和便迁移等特点
第二章 走进Docker
Docker公司的一个核心哲学:含电池,但可拆卸(Batteries included but removable)
开放容器计划(The Open Container Initiative)OCI:一个旨在对容器基础架构中的基础组件进行标准化的管理委员会
OCI发布的两份标准:镜像标准和运行时标准
第三章 Docker安装
安装使用阿里云的云服务器ECS(按量计费,2核4g)
准备内容:
创建一个用户wen(useradd wen)添加到本地Docker Unix组
root@iZwz95pm4ylhqjz6z31qpuZ:~# usermod -aG docker wen root@iZwz95pm4ylhqjz6z31qpuZ:~# cat /etc/group |grep docker docker:x:999:wen |
- 使用wget命令获取并运行Docker安装脚本
root@iZwz95pm4ylhqjz6z31qpuZ:~# wget -qO- https://get.docker.com/ |sh |
root@iZwz95pm4ylhqjz6z31qpuZ:~# docker --version Docker version 20.10.1, build 831ebea |
Docker存储驱动的选择
每个Docker容器都有一个本地存储空间,用于保存层叠的镜像(Image Layer)以及挂载的容器文件系统,默认情况下,容器的所有读写操作都发生在镜像层上或挂载的文件系统中
本地存储是通过存储驱动(Storage Driver)进行管理,也被称为Graph Driver
Linux上Docker可选择的存储驱动:
AUFS:最原始而古老
Overlay2:未来发展趋势
Device Mapper
Btrfs
ZFS
Windows上的存储驱动
Windows Filter
存储驱动的选择是节点级别的,即每个Docker主机只能选择一种存储驱动,而不能为每个容器配置一种存储驱动。
Linux上存储驱动的设置路径为:/etc/docker/daemon.json
root@iZwz95pm4ylhqjz6z31qpuZ:/etc/docker# cat daemon.json { "storage-driver":"overlay2" } |
主机会根据使用的存储驱动在/var/lib/docker/下用存储驱动做标识,将镜像层存储
第四章 纵观Docker
镜像
容器
docker run --name name image:tag
镜像容器化:
安装git后,从github上下载案例(跟书中的不一定要一样,也可以只使用一个Dockerfile构建)
案例github地址:https://github.com/nigelpoulton/pluralsight-docker-CI.git
构建
构建成功
运行
通过端口访问成功
第五章 Docker引擎
Docker首次发布的时候,Docker引擎由两个核心组件构成LXC和Docker daemon。其中Docker daemon是一个二进制文件,包含诸如Docker客户端、Docker API、容器运行时、镜像构建等;
LXC提供对命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力
后续发展:LibContianer替换了LXC;Docker daemon逐步拆分,runc(OCI容器运行时规范的参考实现)、containerd(容器生命周期管理)
Docker daemon的架构
容器的启动过程:
- 在docker命令行工具上执行命令
- docker客户端将命令转化为合适的API格式,发送到正确的API端点;API是在daemon中实现
- daemon通过grpc协议与containerd进行通信
- containerd将docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器
- runc与操作系统内核接口进行通信,基于必要的工具(Namespace、CGroup等)创建容器;容器进程作为runc的子进程启动,启动完毕后,runc将会退出
该模型也被称为无守护进程的容器
shim的作用:当containerd指挥runc创建新容器过程中,每次创建容器都会fork一个新的runc实例。容器启动完成,随即runc退出,相关联的containerd-shim进程就成为容器的父进程。
shim的职责:保持所有的STDIN和STDOUT流时开启状态,从而当前的daemon重启时,容器不会因为管道(pipe)的关闭而终止;将容器的退出状态反馈给daemon。
第六章 Docker镜像
docker中的镜像相当于模具,容器就是那些从模具中生产出来的产品
docker镜像的拉取遵循格式:
docker image pull 账户/仓库:标签
docker中的镜像是由多个文件层构成的,每个文件层都有对应的唯一标识,这些组合起来就是docker 的镜像标识,所以对一个镜像打标签的时候,可能会存在多个标签对应同一镜像,因为文件层没有变更。
过滤docker image ls的输出内容
返回悬虚镜像(没有标签的镜像为悬虚镜像)
使用reference完成过滤并且仅显式标签为latest的示例
使用—format参数通过GO模板对输出内容格式化
搜索镜像
搜索官方镜像
搜索自动创建的镜像
dockers镜像由一些松散耦合的只读镜像层组成
查看镜像的分层方式
镜像的构建历史
镜像构建的过程:
- 所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
- 当上层的文件是下层文件的变更的时候,会默认覆盖
共享镜像层:
多个镜像之间可以并且确实会共享镜像层
删除镜像:
删除所有的镜像
docker image rm $(docker image ls -q) -f
第七章 Docker容器
创建并启动容器
-it参数可以将当前终端连接到容器的Shell终端之上
容器启动的时候会默认启动一个与容器生命后期一致的bash(pid为1的进程),当此bash结束的时候,容器也就跟随结束
检查Docker daemon是否正常运行
容器启动的过程:docker container run <options> <image>:<tag> <app>
- 客户端执行命令转换工作,将命令使用合适的API调用docker daemon
- docker daemon接收到命令并搜索Docker本地缓存,观察是否有命令请求的镜像,如果没有则查询Docker Hub并拉取
- docker创建容器并在其中运行指定的应用
容器停止(stop)与容器销毁(rm)
容器的停止本质是向容器内容pid为1 的进程发送SIGTERM信号,让进程预留一个清理并优雅停止的机会
容器的销毁则是直接发送SIGKILL信号,直接杀死进程
容器的重启策略
always:除非容器被明确停止(stop),否则策略会尝试一直重启停止的容器;daemon重启的时候,停止的容器也会重启
unless-stop:daemon重启的时候,容器不会重启
on-failure:策略会在退出容器并且返回值不是0的时候重启容器
查看容器详情
快速清理容器
命令总结:
- docker container run 是启动新容器的命令。-it会连接入容器中启动的程序
- Ctrl+PQ会端口Shell和容器终端之间的连接,并在退出后保持容器在后台处于运行状态
- docker container ls列出处于运行状态的容器,-a 列出所有的容器
- docker container exec 允许用户在运行状态的容器中,启动一个新的进程
- docker container stop 停止运行中的容器,并将状态置为Exited(0)。
- docker container inspect 显示容器的配置细节和运行信息
第八章 应用的容器化
应用容器化的过程:
- 编写应用代码
- 创建一个Dockerfile,其中包括当前应用的描述,依赖以及该如何运行这个应用
- 对该Dockerfile执行docker image build命令
- 等待docker将应用程序构建到Docker镜像中
分析Dockerfile
- 以centos:centos8为基础镜像(FROM)
- 指定维护者(LABEL)
- 容器中执行命令yum -y(RUN)
- 复制当前资源到容器中(COPY)
- 容器中执行命令(RUN)
- 记录应用网络端口(EXPOSE)
- 指定容器启动命令(CMD)
构建
Dockerfile的用途
- 对当前应用的描述
- 指导Docker完成应用的容器化(创建一个包含当前应用的镜像)
镜像推送到仓库
- 登录docker账户
- 镜像打标签
- 推送
多阶段构建
镜像构建过程中,docker会根据指令产生新的镜像层,这样会导致镜像的大小比较大,采用多阶段构建可以有效控制镜像的大小。
构建前端内容
- 构建后端内容
- 从签名构建的镜像中将结果内容取出,再构建新的镜像
COPY --from指令从之前构建的镜像中仅复制生产环境相关的应用代码,而不复制生产环境不需要的构件
总结:
- docker image build 命令会读取Dockerfile并将应用程序容器化。使用-t参数为镜像打标签,使用-f指定Dockerfile的路径和名称
- Dockerfile中FROM指令用于指定构建的镜像的基础镜像,常位于第一条指令
- RUN指令用于在镜像中执行命令,会创建新的镜像层
- COPY指令用于将文件作为一个新的层添加到镜像中,会创建新的层
- EXPOSE指令用于记录应用所使用的网络端口
- ENTRYPOINT指令用于指定镜像以容器方式启动后默认运行的程序
第九章 使用Docker Compose部署应用
安装Docker Compose
root@iZwz95pm4ylhqjz6z31qpuZ:~# curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose |
下载案例
version必须指定,且位于文件的第一行,定义Compose文件格式
- Services用于定义不同的应用服务
- network用于指引Docker创建新的网络;默认情况下,Docker Compose会创建bridge网络(一种单主机网络,只能实现同一主机上容器的互连)
- volumes用于指引Docker创建新的卷
- build . 指定Docker基于当前目录(.)下的Dockerfile中定义的指令来构建一个新镜像。该镜像会被用于启动该服务的容器
- command:python app.py指定Docker在容器中执行名为app.py的Python脚本作为主程序
- port:指定容器的端口映射,将容器内的(-target)5000端口映射到主机的(published)的5000端口
- network:使得Docker可以将服务连接到指定的网络上
- volumes指定Docker将卷挂在到容器的指定目录
指定docker compose启动文件位置
docker-compose -f prod-equus-bass.yml up
通常情况下,启动一个Compose应用,系统会默认寻找docker-compose.yml或docker-compose.yaml的文件;使用-d参数可以后台启动;使用&可以将终端窗口返回,让日志显示在终端窗口上
正常启动
列出各个服务(容器)内运行的进程
停止应用删除资源(网络等),不删除卷
停止应用不删除资源
总结:
- docker-compose up命令用于部署一个Compose应用。默认情况下会去读取docker-compose.yml或docker-compose.yaml的文件,可以使用-f指定其他文件名。通常情况下,使用-d参数令应用后台启动
- docker-compose stop会停止应用相关的容器,但不删除资源
- docker-compose rm 用于删除已停止的应用,删除容器和网络,但不删除卷和镜像
- docker-compose ps 列出Compose应用中的各个容器。输出内容包括当前状态、容器运行的命令以及网络端口
- docker-compose down 停止并删除运行中的compose应用。删除容器和网络,但不删除镜像和卷