微服务架构的兴起伴随着各种各样相比于单体架构的优势,但是微服务的拆分和集群却大大增加了部署的难度。
比如:
分布式系统中,依赖关系复杂,容易出现兼容性问题。
开发、测试、生产环境各有有差异,有的差异还比较大。
在Docker
没有出现之前,通常使用虚拟机的方式来部署微服务。
但是使用虚拟机来部署为服务,依旧有很多困扰。
除了对服务器性能有所要求,操作起来也是非常的繁琐。
光是使用vmware
创建不同微服务的虚拟机,再配置不同微服务的运行环境就让人望而却步。
Docker
的出现就是为了解决分布式部署的难题,并且以更低的成本去创建微服务的部署环境。
将应用的Libs
(函数库)、Deps
(依赖)、配置与应用本身一起打包
将每个打包好的应用放到一个隔离容器去运行,避免互相干扰
这样打包好的应用包中,既包含应用本身,也包含应用所需要的Libs
、Deps
,无需再操作系统上安装这些。
因此就不存在不同应用之间的兼容问题了。
Docker
将用户程序与所需要调用的系统(比如CenterOS
)的函数库一起打包。Docker
运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行。关于函数库的解释:
各种不同的Linux
系统,其Linux
内核都是相同的。只是系统应用不相同。
并且对于操作Linux
内核的指令集的封装有所不同。
而不同系统对于自己Linux
指令集的封装可能会不一样,就会形成不同的函数库。
Docker
直接借助不同操作系统的Linux
内核去运行,二部是直接使用当前系统的函数库。
自然就解决了跨系统运行的问题。
因此Docker打包好的应用可以部署在任何基于Linux内核的系统上运行!
注意:
Docker
本质上只能够在Linux
系统上运行。
即使现在有了可以在Windows
上运行的Docker
,也只不过是虚拟了一个隔离的Linux环境去运行Docker
。
只不过这个过程用户看不到。
1) 系统方面
Docker
是一个系统进程;2)运行和占用资源方面
Docker
体积小,硬盘占用以MB
为单位,启动速度快,性能好;GB
为单位,启动速度慢,性能一般。Docker容器 | 虚拟机 | |
---|---|---|
操作系统 | 与宿主机共享操作系统 | 宿主机操作系统上运行虚拟机操作系统 |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk、vdi等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU、内存消耗 |
移植性 | 轻便、灵活,适应于Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,10s以上 |
名称 | 说明 |
---|---|
镜像(Image) | Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像 |
容器(Container) | 镜像中的应用运行后形成的进程就是容器,Docker会给容器进程做隔离,对外不可见 |
仓库(Repository) | Docker 仓库和Git的仓库相似,在本地构建完镜像之后,即可通过仓库进行镜像的分发 |
应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
镜像,就是把一个应用在硬盘上的文件、运行环境、部分系统函数库打包形成的文件包。文件包是只读的。
image
文件可以看作是容器的模板。Docker
根据 image
文件生成容器的实例。
容器,就是将这些文件中编写的程序、函数加载到 内存中,形成进程,只不过要隔离起来。
因此一个镜像可以启动多次,形成多个容器进程。
仓库,就是放一堆镜像的地方,可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
意思就是Docker
可以从镜像托管仓库中拉取镜像到本地仓库,也可以把本地仓库中的镜像上传到镜像托管仓库。
开源应用程序非常多,打包这些应用往往是重复的劳动。
为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis
、MySQL
镜像放到网络上,共享使用。
就像Git
和GitHub
的代码共享一样。
DockerHub
是一个官方的Docker
镜像的托管平台。这样的平台称为Docker Registry
(Docker
注册中心)。
https://hub.docker.com/
国内也有类似于DockerHub
的公开服务,比如 :
网易云镜像服务
https://c.163yun.com/hub
阿里云镜像库
https://cr.console.aliyun.com/
自己也可以构建Docker
仓库,构建一个属于自己的私有云仓库。
使用国内镜像仓库可以提升拉取镜像的速度。
Docke
r是一个CS
架构的程序,由两部分组成:
server
):Docker
守护进程,负责处理Docker
指令,管理镜像、容器等client
):通过命令或RestAPI
向Docker
服务端发送指令。可以在本地或远程向服务端发送指令。释义:
假设客户端使用docker pull
系列命令拉取一个Nginx
镜像,
客户端再用docker run
系列命令,让Docker
服务端执行对应的镜像,生成一个不被其它容器影响的独立容器。
用户使用Docker Client
与Docker Daemon
建立通信,并表送请求给后者。
Docker Daemon
作为Docker
陈构中的主体部分。
首先提供DockerServer
的功能使其可以按受Docker Client
的请求。
Docker Engine
执行Docker
内部的一系列工作,每一项工作都是以一个Job的形式的存在。
job
的运行过程中,当需要容器镜像时,则从Docker Registry
中下载镜像,并通过镜像管理驱动Graph driver
形式存储
当需要为Docket
创建网络环境时。通过网络管理驱动Network diver
创建并配置Docker
容器网络环境。
当需要限制Docker
容器运行资源或执行用户指令等操作时,则通过Exec driver
来完成。
Libcontainer
是一项独立的容器管理包。Network driver
以及Exec driver
都是通过Libcontainer
来实现具体对容器进行的操作
Docker
分为 CE
和 EE
两大版本:
CE
即社区版(免费)。
EE
即企业版,强调安全,付费使用。
官方安装文档:
https://docs.docker.com/install/
Docker CE
支持 64 位版本 CentOS 7
,并且要求内核版本不低于 3.10, CentOS 7
满足最低内核的要求。
这里就以Docker CE
在 CentOS 7
上的安装为例。
如果之前安装过旧版本的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
注:
\
是命令分隔符,当一行命令太长的时候,可以使用它来进行换行。
# 安装它是因为系统默认没有命令yum-config-manager
# yum-config-manager命令在yum-utils中
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
#命令1 添加 Docker 稳定版本的 yum 软件源,即配置docker仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 命令2 sed -i 直接修改读取的文件内容,而不是输出到终端
# sed -i 's/原字符串/新字符串/g' /etc/yum.repos.d/docker-ce.repo
# 这里就是把文件/etc/yum.repos.d/docker-ce.repo中的
# download.docker.com/mirrors.aliyun.com\ 替换为 docker-ce
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
#命令3 将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,执行这个命令可以提升yum安装的速度
yum makecache fast
yum install -y docker-ce
看到完毕字样即安装成功!
# ubuntu下docker官方安装教程
https://docs.docker.com/engine/install/ubuntu/
ubuntu
下docker
的安装和CentOS
是不一样的,官网步骤写的很清楚。
如果想要今后版本更新了,安装方式有变化时,按官网上的教程来肯定是不会错的。
Docker
应用需要用到各种端口
# 开放某个端口 这里以8080为例
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重启防火墙,让刚开开放的端口生效
firewall-cmd --reload
# 查看已经开放的端口列表
firewall-cmd --zone=public --list-ports
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 如果以后又想开启防火墙了可以使用如下命令让防火墙开机自启,运行完后重启生效
systemctl enable firewalld
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
systemctl status docker # 查看docker状态
systemctl enable docker # 开机自启docker
docker info # 查看docker概要信息
docker -v
只要能正确显示当前的Docker
版本就说明Docker
安装成功!
# 查看docker总体帮助文档:
docker --help
# 查看docker命令帮助文档:
docker 具体命令 --help
阿里云镜像加速官方文档:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在CentOS
栏目下得知配置镜像加速器。
针对Docker
客户端版本大于 1.10.0 的用户。
可以通过修改daemon
配置文件/etc/docker/daemon.json
来使用加速器。
# 在etc目录下创建一个docker目录
sudo mkdir -p /etc/docker
# 在/etc/docke文件新建/daemon.json,并把 EOF之间的内容写到daemon.json中去
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pi7aby9g.mirror.aliyuncs.com"]
}
EOF
# 重新加载daemon.json文件
sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker