Docker 这九个不同的应用场景,你都用到了吗?
Docker 是构建一个开源的容器引擎,能够为任何应用创建轻量级、源码可移植、构建android 签到 源码自给自足的源码容器。开发者与系统管理员可以在笔记本上编译测试通过的构建容器,批量部署于生产环境,源码包括虚拟机、构建裸机、源码OpenStack 集群、构建云端、源码数据中心等基础应用平台。构建容器完全使用沙箱机制,源码相互之间无任何接口。本文将介绍 Docker 的九种用法,以提升生产力。
1. 本地依赖(Local Dependency)
在本地系统快速尝试 Magento 或使用 MySQL?或是尝试大部分开源项目?使用 Docker 可以节省大量时间。它能提升开发效率,快速搭建开发环境。
2. 搭建环境(Build Environment)
如果希望构建源码,但发现没有合适的环境,使用 Docker 是个不错的选择。它能将运行环境和配置放入代码中,部署时可在不同环境中使用,邀请推广网站源码降低硬件要求与应用环境之间的耦合度。
3. 微服务(Microservices)
微服务架构将一个整体式应用拆分为松耦合的单个服务。使用 Docker 将每个服务打包为镜像,并用 docker-compose 模拟生产环境。虽然实践初期可能费时费力,但长远来看,将产生巨大的生产力。
4. 自动测试(Automated testing)
如何编写自动化的集成测试用例?在 Docker 中运行测试用例,将测试用例与镜像紧密运行,编写测试用例时将具有优势。
5. 部署过程(Deployment process)
使用 Docker 镜像进行自我部署。许多主流的主机提供商支持托管 Docker,只需设置 Docker,并在指定端口运行镜像。
6. 持续部署(Continuous Deployment)
Docker 适合持续集成/持续部署,使用 Docker,持续部署变得简单,新镜像将重新开始。
7. 多租户环境(Multi-tenancy)
Docker 在多租户应用中,可以避免关键应用的重写。使用 Docker 为每个租户的应用层多个实例创建隔离环境,简单且成本低廉。
8. 来自一台机器的多个 APP(Multiple apps from one machine)
Docker 可管理单台机器上的所有服务。使用文件夹挂载为每个基于数据的 Docker 镜像保留数据。
9. 扩容 QPS(Scaling QPS)Docker 通过创建另一个容器轻松进行水平扩展。cp盲盒源码在遇到高峰流量时,Docker 可帮助解决问题,只需添加更多机器并增加负载均衡器背后的容器数量。
使用docker安装qemu-user-static(附制作镜像源码)
使用 Docker 安装 QEMU-USER-STATIC 解决跨架构模拟问题
背景:在一些发行版上可能缺乏或提供过时的 QEMU-USER-STATIC 版本,导致在特定架构下的使用不便。利用内核的 binfmt_misc 功能,通过 Docker 容器实现 QEMU-USER-STATIC 的安装,解决发行版支持不足的问题。
传统方案仅支持 x 架构下的模拟,对于其他架构如 ARM 或 RISC-V 的模拟支持有限。为此,作者设计了 xfan/qemu-user-static 项目,旨在提供更广泛的架构支持。
项目优势:基于 Ubuntu 的广泛架构支持,构建容器镜像,无需特定系统即可在容器中全局启用 QEMU-USER-STATIC 功能。目前支持多种主机架构,依赖于 Ubuntu 软件包的架构支持。
使用方法:通过 Docker 镜像安装 QEMU-USER-STATIC,实现跨架构的程序模拟,如在 x_ 下模拟 ARM 或 MIPS 架构的 busybox,或在 ARM 上执行 RISC-V 容器。
构建脚本获取:访问相应页面获取构建脚本,实现自定义和扩展容器镜像功能。
Docker源码安装附内网镜像安装演示
系统版本要求源码包下载
官网下载地址(download.docker.com/lin...)
我这里已docker-...tgz该版本做演示
1.下载源码包文件到本地
2.通过远程连接工具(xShell、长线macd公式源码SecureCRT等将源码包文件上载到服务器自定义目录)
3.解压文件
4.配置docker为service服务
5.添加可执行权限
注:如遇到启动不成功可通过状态查询、/var/log/messages/运行日志或直接使用dockerd命令查看错误信息,如还解决不了建议服务器重启一下在运行docker启动命令
6.配置镜像加速
7.检查安装版本内网下载镜像
注:使用docker pull拉取镜像的时候需要网络,但是项目部署一般都是在内网。内网访问不了外网,所以需要在外网环境下把需要的镜像拉取下来打包,然后拷贝到内网,载入到内网的docker
1.在外网机器上拉取mysql镜像,可以看到外网的docker已经拉取了镜像。
2.将镜像打包成tar压缩包
3.将打包好的mysql镜像包通过远程工具下载到本地
4.拷贝到内网linux服务器并载入docker
docker基础命令使用(扩展)下载镜像:(hub.docker.com/search/官网镜像地址)
docker pull [IMAGE_NAME]:[TAG] #命令格式
docker pull mysql:8.0 #下载mysql8.0镜像(不指定默认下载最新版本)
查看当前镜像版本
docker -v #查看当前安装版本
docker version #查看版本信息
docker info #查看系统信息
docker images #查看当前镜像
docker search 镜像名 #搜索镜像
镜像、容器删除
docker rm 容器ID
docker rm 容器名字
docker rmi 镜像ID
docker rmi 镜像名
docker rmi -f 镜像ID #强制删除
创建网络及数据卷
docker volume create +数据卷名称
docker volume list #查看当前数据卷信息
docker network create -d bridge +网络名称
docker network ls #查看当前网络
docker inspect containername +id #查看容器的hash值
启动、关闭容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) #关闭所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) #开启所有容器
杂
docker inspect 容器ID (使用该命令重点关注容器ip) #查看容器/镜像元数据
docker exec #在运行的容器中执行命令
docker exec -it 容器ID /bin/bash #以交互模式开启伪终端
Docker 源码分析
本文旨在解析Docker的核心架构设计思路,内容基于阅读《Docker源码分析》系文章后,整理的核心架构设计与关键部分摘抄。Docker是Docker公司开源的基于轻量级虚拟化技术的容器引擎项目,使用Go语言开发,遵循Apache 2.0协议。Docker提供快速自动化部署应用的能力,利用内核虚拟化技术(namespaces及cgroups)实现资源隔离与安全保障。相比虚拟机,Docker容器运行时无需额外的系统开销,提升资源利用率与性能。Docker迅速获得业界认可,包括Google、Microsoft、名片侠公司源码VMware在内的领导者支持。Google推出Kubernetes提供Docker容器调度服务,Microsoft宣布Azure支持Kubernetes,VMware与Docker合作。Docker在分布式应用领域获得万美元的C轮融资。
Docker的架构主要由Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container组成。
Docker Client:用户通过命令行工具与Docker Daemon建立通信,发起容器管理请求。
Docker Daemon:后台运行的系统进程,接收并处理Docker Client请求,通过路由与分发调度执行相应任务。
Docker Registry:存储容器镜像的仓库,支持公有与私有注册。
Graph:存储已下载镜像,并记录镜像间关系的数据库。
Driver:驱动模块,实现定制容器执行环境,包括graphdriver、networkdriver和execdriver。
libcontainer:库,使用Go语言设计,直接访问内核API,提供容器管理功能。
Docker container:Docker架构的最终服务交付形式。
架构内各模块功能如下:
Docker Client:用户与Docker Daemon通信的客户端。
Docker Daemon:后台服务,接收并处理请求,执行job。
Graph:存储容器镜像,记录镜像间关系。
Driver:实现定制容器环境,包括管理、网络与执行驱动。
libcontainer:库,提供内核访问,实现容器管理。
Docker container:执行容器,提供隔离环境。
核心功能包括从Docker Registry下载镜像、创建容器、运行命令与网络配置。
总结,通过Docker源码学习,深入了解其设计、功能与价值,有助于在分布式系统实现中找到与已有平台的契合点。同时,熟悉Docker架构与设计思想,为云计算PaaS领域带来实践与创新启发。
纯干货!构建Dockfile镜像的十三个最佳实践点
编写.dockerignore文件
在构建镜像时,Docker需要准备上下文,将所有需要的文件收集到进程中。默认上下文包含Dockerfile目录中的所有文件,但实际上并不需要.git目录、.vscode目录、.idea目录等内容。.dockerignore文件的用法与.gitignore类似,可以忽略一些不需要的文件,有效加快构建时间并减少Docker镜像大小。
样例:
一个容器只运行单个应用
从技术角度讲,可以在Docker容器中运行多个进程,但这样做会让你非常痛苦。因此,建议为每个应用构建单独的Docker镜像。
选择合适的基础镜像
合适的基础镜像如scratch、busybox、alpine、distroless等,有助于减少镜像大小。较小的镜像表示无用程序更少,提高了安全性。
将多个RUN指令合并为一个
Docker镜像是分层的,重要知识点包括:现在,将所有RUN指令合并为一个。同时删除apt-get upgrade,因为它会使镜像构建非常不确定。记住,只能将变化频率相同的指令合并在一起,如将node.js安装与npm模块安装放在一起。
基础镜像和生产镜像的标签不要使用latest
当镜像没有指定标签时,默认使用latest。这可能导致镜像更新时构建失败。若确实需要最新版基础镜像,使用latest标签;否则,最好指定明确的镜像标签。
样例:
每个RUN指令后删除多余文件
更新apt-get源后,下载、解压并安装软件包,这些文件在运行应用时不需要保存在Docker镜像中。删除它们可以减少镜像大小。
样例:
在Dockerfile中删除/var/lib/apt/lists/目录中的文件(由apt-get update生成)。
设置WORKDIR和CMD
WORKDIR指令可以设置默认目录,即运行RUN、CMD、ENTRYPOINT指令的地方。CMD指令设置容器创建时执行的默认命令,应将命令写入数组中。
样例:
使用ENTRYPOINT时,用exec启动命令(可选)
在使用entrypoint的脚本中,要使用exec命令运行应用。不使用exec,容器关闭时SIGTERM信号会被bash脚本进程吞没。exec命令启动的进程可以取代脚本进程,确保所有信号正常工作。
相比ADD,优先使用COPY
COPY指令用于简单文件拷贝,ADD指令则可以下载远程文件和解压压缩包,相对复杂。
样例:
设置默认的环境变量,映射端口和数据卷
运行Docker容器时可能需要环境变量。在Dockerfile中设置默认环境变量。同时,应在Dockerfile中设置映射端口和数据卷。
样例:
ENV指令指定的环境变量在容器中可用。构建镜像时需要指定的变量,使用ARG指令。
使用LABEL设置镜像元数据
使用LABEL指令为镜像设置元数据,例如创建者或描述。弃用了MAINTAINER指令,外部程序如nvidia-docker可能需要com.nvidia.volumes.needed等元数据。
样例:
一个镜像可以有多个label。尽可能将多个label合并到一个LABEL指令中,避免构建出低效镜像。
添加HEALTHCHECK
运行容器时,使用--restart always选项,当容器崩溃时Docker守护进程会重启容器。HEALTHCHECK指令可以周期性检查容器健康状况,指定命令返回0表示正常,返回1表示异常。
样例:
当请求失败时,curl --fail命令返回非0状态。
合理调整COPY和RUN的顺序
应将变化最少的部分放在Dockerfile的前面,充分利用镜像缓存。
样例:
源代码经常变化,每次构建镜像时都需要重新安装NPM模块。因此,先拷贝package.json,然后安装NPM模块,最后拷贝其余源代码。这样即使源代码变化,也不需要重新安装NPM模块。
参考文档
2024-11-30 20:27
2024-11-30 20:15
2024-11-30 19:29
2024-11-30 19:12
2024-11-30 18:14