docker 总结和面试题整理
使用 Docker 容器化封装应用程序的好处:
- Docker 环境
Docker 引擎统一了基础设施环境,包括硬件配置,操作系统的版本,运行时环境的异构
- Docker 镜像
Docker 引擎统一了程序打包(装箱)的方式,例如 java 程序,go 程序,python 程序等等
- Docker 容器
Docker 引擎统一了程序部署(运行)方式,例如 java 的部署运行方式为 java -jar...
,或者 python 的部署运行 python manage.py runserver
,go 的部署运行 go run ...
现在使用 Docker 容器,统一使用 docker run …
使用 Docker 容器化封装应用程序的坏处:
- Docker 是单机使用的,无法有效集群
- 随着容器数量的上升,管理的成本也越来越高
- 没有有效的容灾或者自愈机制
- 没有预设编排模板,无法实现快速,大规模容器调度
- 没有同意的配置管理中心
- 没有容器生命周期的管理工具
- 没有图形化运维工具 等等
Docker 如何集群部署,不使用 k8s 的话:
docker compose 是单机部署的,使用集群部署我们可以使用 docker stack
例如 docker compose 部署单机是这个样子的:
docker-compose up -d xxx.yml
使用 docker stack 的时候,我们可以这样:
docker stack depoly xxx.yml
咱们来看看 docker stack
是什么?
★Docker 在进行多服务部署和管理时通常会使用Docker Stack来解决大规模部署管理问题 Docker引擎在1.12 版本集成了Docker Swarm, 内置新的容器编排工具docker stack,通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理 ”
说白了,docker stack
可以完成docker
本身做不到的事情,就是他可以完成容器编排,但是这里我们就会有这么一个疑问?有了 docker compose
为什么还要有docker stack
?
什么是docker swarm?
Docker swarm 是 Docker 的本机群集
它将 Docker主机池转变为单个虚拟Docker主机
Docker swarm 提供标准的 Docker API,任何已经与 Docker 守护进程通信的工具都可以使用Swarm透明地扩展到多个主机
Docker Stack 与 Docker Compose的区别
- docker stack 是swarm mode的一部分, 即使是单机使用, 也需要一个 swarm 节点
- docker stack 强化了service的概念
服务可理解为发布到生产环境时某组容器的预期状态 ,以及强化了( 复制集、 容器重启策略、回滚策略、服务更新策略 )等生产特性
- docker stack 不支持 build 指令 ,而 docker compose 不支持 deploy 指令
- docker stack几乎能做 docker-compose 所有的事情,后续统一还是使用 kubernetes 更香
总得来说,docker stack 适用于生产环境的编排工具,而 docker-compose 更适合被定义为单机容器编排的工具
如何使用 docker stack?
代码语言:javascript复制# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
命令 | 描述 |
---|---|
docker stack deploy | 部署新 stack 或更新现有 stack |
docker stack ls | 显示 stack 列表 |
docker stack ps | 列出 stack 中的任务 |
docker stack rm | 移除一个或多个 stack |
docker stack services | 列出 stack 中的服务 |
例如咱们在随便在网上就可以找一个例子,
DockerFile 里面写使用 docker stack
时,就可以写成 deploy:
来进行指定
什么是 Docker ?
是一个容器化平台以容器的形式将应用程序及其所有依赖项打包,确保应用程序在任何环境中无缝运行
Docker 里面有 docker 镜像,docker 容器 和 docker 仓库
- docker 镜像
是docker容器的源代码,Docker镜像用于创建容器
- docker 容器
它不依赖于任何特定的基础架构,它们可以在任何计算机,任何基础架构和任何云中运行
- docker 仓库
用来保存镜像的,可以看做是一个代码控制中心
Docker容器常见的几种状态
- 运行中
- 暂停
- 重新启动中
- 已退出
Docker与虚拟机有何不同?
docker 不是虚拟化方法,他是一个工具,用于容器化系统上的容器管理或应用程序部署
它依赖于实际实现基于容器的虚拟化或操作系统及虚拟化的其他工具,Docker主要专注于在应用程序容器内自动部署应用程序
Docker 的网络类型有哪些模式?
- bridge 模式
docker默认的网络配置,可以设置IP,但是要与docker host主机的虚拟网络在同一网段
- none 模式
不会给容器进行任何网络配置
- host 模式
直接使用 docker 宿主机的网络
- container 模式
与已经存在的容器共有同一个IP地址
- network 模式
自定义网络,咱们可以使用 docker network create
来新建一个网络
Docker 数据如何持久化?
咱们可以使用 挂载卷,就是在创建容器的时候使用 -v
参数,进行绑定挂载,匿名挂载,或者具名挂载 ,咱们就可以将宿主机的目录或者文件挂载到容器中
绑定挂载
就是明确将自己宿主机的目录或者文件,对应到容器中指定的目录或文件,会有这样的特点:
- 数据卷是目录或文件,不能是没有格式化的磁盘(块设备)
- 挂载的文件和目录会随源文件和目录变化而变化
- 容器可以读写挂载卷中的数据
- 卷中的数据可以永久保存,即使使用它的容器已经被销毁
匿名 / 具名挂载
就是 -v
后面带的参数若只写容器中的路径(匿名挂载)或者写了一个代号,指定容器中的路径(具名路径)
默认为挂载到容器的工作目录,/var/lib/docker/volumes
下面
Docker 容器内部的机制是什么样的?
每个容器都是在自己的命名空间中运行,但使用与所有其他容器完全相同的内核
发生隔离是因为内核知道分配给进程的命名空间,并且在API调用期间确保进程只能访问其自己的命名空间中的资源
如何临时退出一个正在交互的容器的终端,而不终止它?
使用ctrl q p
即可
如何停止 / 删除所有正在运行的容器?
docker kill $(docker ps -aq)
docker rm $(docker ps -aq)
如何删除所有本机所有的镜像?
docker rmi $(docker images -aq)
Dockerfile 中常见的指令有哪些?
- FROM
构建镜像基于哪个镜像
- MAINTAINER
镜像维护者姓名或邮箱地址
- RUN
构建镜像时运行的指令
- CMD
运行容器时执行的shell环境
- VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器
- USER
为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
- WORKDIR
为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
- HEALTHCHECH
健康检查
- ARG
构建时指定的一些参数
- EXPOSE
声明容器的服务端口(仅仅是声明)
- ENV
设置容器环境变量
- ADD
拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
- COPY
拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
- ENTRYPOINT
运行容器时执行的shell命令
关于 Docker 的学习资料其实都在 docker hub上面,我们可以不断的学习,实战,总结,优化思维,逐步进阶
参考资料:
docker docs
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~