🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
容器化是一种虚拟化技术,可以将应用程序和它们的依赖项打包成一个可移植的容器中,以便在各种环境中进行部署和运行。容器化技术将应用程序和依赖项打包在一个独立的单元中,与底层操作系统和硬件解耦,从而使应用程序能够在任何地方运行,并且具有高度可移植性和兼容性。容器化技术主要由Docker提供支持,它已成为现代软件开发和部署的主流技术之一。
🚀一、初识Docker
🔎1.什么是Docker
微服务架构中的服务拆分和部署是一个复杂而且需要高度协调的过程。随着服务数量的增加,需要管理的服务也会变得更加复杂。为了解决这个问题,需要使用各种自动化工具和平台,以便更容易地管理微服务架构。
一些流行的工具和平台,如Kubernetes、Docker和Service Mesh,可以帮助简化微服务的部署和管理。Kubernetes为微服务提供了容器编排功能,使得服务的部署变得自动化、可伸缩和高可用。Docker则提供了标准化的容器,允许微服务可以在各个环境中部署和运行。Service Mesh则提供了更高级别的网络控制和管理,使得微服务之间的通信和数据传输更加安全和可靠。
虽然微服务的拆分和部署带来了一定的挑战,但是通过使用适当的工具和平台,可以使得微服务架构变得更加灵活、高效和可管理。
🦋1.1 应用部署的环境问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异
例如:一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
🦋1.2 Docker解决依赖兼容问题
在传统开发中,应用程序的依赖关系是通过在本地或云服务器上手动安装软件包和库来解决的。但是,这种方法很容易出现不兼容性以及版本冲突的问题。
使用Docker可以解决这些依赖兼容性问题。Docker将应用程序的依赖关系和配置打包到一个容器中。容器包含应用程序所需的所有软件包和库,以及运行应用程序所需的环境。这确保了应用程序在任何主机上都能正常运行,并且不会受到主机上已安装软件包和库的影响。
Docker还可以使用Docker Compose来管理多个容器之间的依赖关系。Docker Compose可以定义多个容器之间的依赖关系,并自动启动和停止这些容器,以确保它们在正确的顺序和环境下运行。
🦋1.3 Docker解决操作系统环境差异
Docker 是一种应用容器化技术,可以帮助解决操作系统环境差异的问题。Docker 在容器中运行应用程序,可以在不同的操作系统环境中保持一致的运行效果,从而减少了因为操作系统环境不同带来的问题。
具体来说,Docker 通过将应用程序和其依赖项打包到容器中,从而将其与底层操作系统隔离开来。容器中的应用程序可以运行在不同的操作系统环境中,而不需要重新编写或调整代码。因此,开发人员可以开发出能够在任何操作系统上运行的应用程序,从而提高了应用程序的可移植性和兼容性。
Docker 还提供了一套完整的工具链,可以帮助开发人员更方便地构建、打包、部署和管理容器。这些工具包括 Docker Engine、Docker Compose、Docker Swarm 等,可以让开发人员在不同的操作系统环境中高效地进行应用程序的开发和部署。
🦋1.4 小结
Docker是一个强大的工具,可以解决大型项目依赖关系复杂、不同组件依赖的兼容性问题。下面是对你提到的问题的优化和扩展建议:
-
使用Docker容器化应用:将不同组件和其依赖打包成独立的Docker镜像,每个镜像包含了所需的运行环境和依赖。这样可以确保每个组件都在独立的环境中运行,避免了不同组件之间的依赖冲突。
-
使用Docker Compose进行多容器管理:对于大型项目,可能涉及多个容器之间的协作。Docker Compose是一个工具,可以通过一个配置文件定义和管理多个容器的关系和依赖。通过定义容器之间的网络连接和共享卷,可以轻松地管理多个容器之间的通信和数据共享。
-
使用Docker Swarm或Kubernetes进行容器编排:对于更复杂的项目,可以使用Docker Swarm或Kubernetes等容器编排工具来管理和调度多个Docker容器。这些工具可以自动处理容器的部署、伸缩、负载均衡等任务,确保应用在不同环境中的一致性和可靠性。
-
使用Docker镜像仓库管理镜像版本:为了解决开发、测试、生产环境差异的问题,可以使用Docker镜像仓库来管理不同版本的镜像。开发人员可以将自己的代码和依赖打包成镜像,并上传到镜像仓库。测试和生产环境可以从镜像仓库中拉取相应的镜像版本,确保环境的一致性。
-
使用Docker的可移植性:Docker镜像可以在任意支持Docker的Linux操作系统上运行,这意味着可以在开发、测试和生产环境之间轻松迁移应用。开发人员可以在本地开发环境中构建和测试镜像,然后将其部署到测试和生产环境中,而无需担心环境差异导致的问题。
通过使用Docker,可以有效地解决大型项目依赖关系复杂、不同组件依赖的兼容性问题,并提供了快速交付应用、运行应用的优势。
🔎2.Docker和虚拟机的区别
虚拟机 | Docker | |
---|---|---|
运行方式 | 模拟硬件设备运行完整的操作系统 | 封装函数库运行应用 |
镜像大小 | 较大,包含完整的操作系统和应用所需的依赖 | 较小,只包含应用所需的依赖 |
启动时间 | 较慢,需要启动完整的操作系统 | 较快,只需启动应用所需的依赖 |
资源消耗 | 资源消耗较大,需要分配足够的CPU、内存等 | 资源消耗较小,可以更高效地利用计算资源 |
移植性 | 可以在任何操作系统中运行其他操作系统 | 可以在任何操作系统中运行应用 |
操作系统限制 | 不同操作系统之间无法共享资源 | 可以共享操作系统内核,更高效地利用计算资源 |
对比来看:
Docker和虚拟机的差异:
-
docker是一个系统进程;虚拟机是在操作系统中的操作系统
-
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
🔎3.Docker架构
🦋3.1 镜像和容器
在Docker架构中,镜像和容器是两个重要概念。
镜像(Image)
Docker中的镜像就相当于是一个只读的模板,镜像可以用来创建Docker容器。镜像可以包含一个完整的操作系统环境、应用程序以及所有的依赖库和文件。镜像是静态的,一旦创建好就不能更改。如果需要对容器进行修改,需要重新创建一个新的镜像。
容器(Container)
Docker容器是从镜像创建的运行实例。一个镜像可以创建多个容器,每个容器都是相互独立的,有自己的文件系统和网络接口,并相互隔离。容器可以看做是在镜像上添加一层可写层,容器内部的所有操作都在这个可写层上进行,并不影响镜像本身。容器可以随时启动、停止、删除,且容器删除后,容器内的数据也会同时删除。
在Docker中,通过镜像创建容器并运行应用程序,当容器不再需要时,可以停止并删除容器。如果需要重新启动该应用程序,可以再次创建一个容器。通过使用镜像和容器,可以更好地隔离应用程序和环境,提供更加灵活和高效的部署方式。
例如:你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ。
🦋3.2 DockerHub
DockerHub是一个Docker镜像仓库,类似于软件代码的代码托管平台,用户可以在DockerHub上分享、存储和下载Docker镜像。DockerHub上的镜像可以由任何人创建并上传,也可以被其他用户下载并使用。Docker官方提供了一个公共的DockerHub供用户使用。
在DockerHub上,用户可以浏览、搜索和下载其他用户上传的Docker镜像,也可以上传自己的镜像供其他用户使用。DockerHub提供了一些基础镜像,包括CentOS、Ubuntu、MongoDB、MySQL等,用户可以直接从DockerHub下载这些基础镜像并在其基础上构建自己的应用程序镜像。
除了公共的DockerHub,Docker也支持用户自行搭建私有的镜像仓库,用户可以创建自己的DockerHub来存储和分享私有的Docker镜像。在企业中,私有的DockerHub可以方便地管理和部署应用程序镜像,提高了应用程序的可移植性和可伸缩性。
国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
🦋3.3 Docker架构
Docker采用客户端-服务端架构,客户端通过命令行或API与服务端进行通信,从而对Docker进行操作。
服务端是Docker守护进程的组成部分,负责处理客户端发来的指令,管理Docker的各项功能,如镜像、容器、网络等等。而客户端则是与服务端进行交互的方式,可以在本地或远程向服务端发送指令。
除了服务端和客户端,Docker还有其他组成部分,如镜像、容器、仓库等。镜像是一个轻量级的独立软件包,包含了运行应用程序所需要的所有文件、资源和配置信息。容器则是镜像的实例化运行,是一个独立的文件系统环境,可以在其中运行应用程序。而仓库则是用于存储和共享镜像的地方,类似于代码仓库。DockerHub是最流行的公共镜像仓库,它提供了大量常用的镜像供用户使用。
🦋3.4 小结
使用Docker,可以将应用程序及其依赖、环境和配置等打包成一个镜像。镜像是一个轻量级的独立软件包,可以方便地传输、保存和共享。当镜像运行起来,就成为了容器。一个镜像可以运行多个容器,从而实现了代码的隔离和资源的共享。
Docker是一个CS架构的程序,由服务端和客户端两部分组成。服务端是Docker守护进程,接收来自客户端的命令或远程请求,用于操作镜像或控制容器。客户端通过命令行或API向服务端发送命令或请求,并获取相应的结果。这种架构使得Docker具有了强大的灵活性和可扩展性。
DockerHub是一个镜像托管的服务器,类似的还有阿里云镜像服务等。用户可以在DockerHub上搜索、上传、下载和分享镜像,方便地管理和维护应用程序。镜像可以通过DockerHub方便地共享给其他人,使得应用程序开发和部署变得更加便捷和高效。
🚀二、安装Docker
🔎1.安装Docker
虚拟机安装参照:http://www.hostbuf.com/
软件下载:http://www.hostbuf.com/t/988.html
软件安装:http://www.hostbuf.com/t/1059.html
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。
🔎2.CentOS安装Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
🦋2.1 卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
🦋2.2 安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
🦋2.3 启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
输入命令查看启动状态
systemctl status docker
然后输入命令,可以查看docker版本:
docker -v
如图:
🦋2.4 配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
也可直接依次参照执行:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://au39ixuh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
🔎3.CentOS7安装DockerCompose
🦋3.1 下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
本地下载完上传到/usr/local/bin/
目录也可以。
🦋3.2 修改文件权限
修改文件权限:
# 修改权限
chmod +x /usr/local/bin/docker-compose
🦋3.3 Base自动补全命令
最后,我们需要设置Base自动补全命令,以提高命令行的使用效率。按照以下步骤进行操作:
下载Base的自动补全脚本:
sudo curl -L 地址 -o /etc/bash_completion.d/docker-compose
使自动补全脚本生效:
source /etc/bash_completion.d/docker-compose
至此,CentOS7安装DockerCompose并设置Base自动补全命令的操作已完成。
如果这里出现错误,需要修改自己的hosts文件 + 停止Docker服务:
echo "地址对应的IP 域名" >> /etc/hosts
🔎4.Docker镜像仓库
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
🦋4.1 简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
🦋4.2 配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
- 注意需要改成自己本地对应IP
- 注意原有的后面追加逗号
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.206.128:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
- 重启完原来所有的服务进程都被杀死(类似于电脑重启),如需访问需要再次启动
🦋4.3 带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
- tmp文件夹下新建文件夹:registry-ui
- 文件夹中新建文件:touch docker-compose.yml
- 粘贴下述配置到文件中
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
-
docker-compose up -d 启动
-
访问:http://IP:8080/
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”