微服务虽然具备各种各样的优势,但服务的拆分通常会给部署带来了很大的麻烦:
大型项目组件较多,运行环境也较为复杂,部署时可能会碰到一些问题:
例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖库各不相同,甚至会有冲突,这就给部署带来了极大的困难。
Docker为了解决依赖的兼容问题的,采用了两个手段:
这样打好的包,既包含应用本身,也包含应用所需要的Libs、Deps,无需再在操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。
解决了不同应用的兼容问题,但是开发、测试等环境仍会存在差异,操作系统版本也会有差异。例如,将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,则会报错。
Docker为了解决不同系统环境差异问题,也采用了两个手段:
这样打好的包,即包含应用本身,也包含应用所需要的系统函数库,直接基于Linux内核运行,因此可以在任意Linux操作系统上运行。
总的来说,Docker是一个快速交付应用、运行应用的技术,具备下列优势:
Docker可以让一个应用在任何操作系统中非常方便的运行。而虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。
两者的区别在于:
总的来说,Docker只是一个系统进程,而虚拟机是在操作系统中的操作系统;Docker体积小、启动速度快、性能好,而虚拟机体积大、启动速度慢、性能一般。
DockerHub是一个官方的Docker镜像的托管平台,称为Docker Registry。国内也有类似于DockerHub的公开服务平台,比如网易云镜像服务、阿里云镜像库等。
我们不仅可以从DockerHub拉取镜像,还可以将自己的镜像共享到DockerHub:
Docker是一个CS架构的程序,由两部分组成:
Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期7个月),EE 即企业版,强调安全,付费使用,支持周期24个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的安装指南,这里主要学习 Docker CE 在 CentOS7 上的安装步骤。
Docker CE 支持64位版本CentOS 7,并且要求内核版本不低于3.10,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 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应用需要用到各种端口,逐一去修改防火墙设置非常麻烦,因此在使用虚拟机进行学习时可以直接关闭防火墙!但生产环境是绝对不可以的!
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 启动Docker服务
systemctl start docker
# 停止Docker服务
systemctl stop docker
# 重启Docker服务
systemctl restart docker
docker -v
Docker官方镜像仓库网速较差,我们可以设置为国内镜像服务。
参考阿里云镜像加速器文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
按照文档指引执行以下命令,即可完成镜像加速配置:
镜像名称一般由两部分组成:[repository]:[tag]。在没有指定tag时,默认是latest,代表最新版本的镜像。如图:
需求:从DockerHub中拉取一个Nginx镜像并查看。
docker pull nginx
docker images
需求:将Nginx镜像导出磁盘,然后再加载回来。
格式:docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest
docker rmi nginx:latest
docker load -i nginx.tar
Docker容器有三个状态:
创建并运行nginx容器的命令:
docker run --name nginx -p 80:80 -d nginx
命令解读:
docker run
:创建并运行一个容器--name nginx
: 给容器起一个名字,这里叫做nginx-p 80:80
:将容器端口映射到宿主机端口,冒号左侧是宿主机端口,右侧是容器端口-d
:后台运行容器nginx
:镜像名称,这里是nginx特别需要注意-p
参数,是将容器端口映射到宿主机端口。默认情况下,容器是隔离环境,直接访问宿主机的80端口,肯定是访问不到容器中的Nginx服务的。
而通过该映射,将容器的80端口与宿主机的80端口关联起来,当访问宿主机的80端口时,就会被映射到容器的80端口,这样就能访问到容器中的Nginx了。如图:
需求:进入nginx容器,修改html文件内容,添加“我进来了…”
docker exec -it nginx bash
命令解读:
docker exec
:进入容器内部,执行一个命令-it
: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互nginx
:要进入的容器的名称,执行docker run
时指定bash
:进入容器后执行的命令,bash是一个linux终端交互命令/usr/share/nginx/html
容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样。Nginx的环境、配置、运行文件全部都在这个文件系统中,包括要修改的html文件。
cd /usr/share/nginx/html
容器内没有vi
命令,无法直接修改,但可以使用sed
命令来修改:
sed -i -e 's#Welcome to nginx#我进来了...#g' -e 's###g' index.html
在浏览器访问:http://192.168.146.129
:
docker logs nginx
# 持续查看日志
docker logs nginx -f
# 查看正在运行的所有容器
docker ps
# 查看所有容器,包括已经停止的
docker ps -a
在上面的案例中,修改nginx的html页面时,需要进入nginx内部,并且因为没有编辑器,修改文件内容显示很麻烦。
这是因为容器与数据(容器内文件)耦合带来的后果:
要解决这个问题,则必须将数据与容器解耦,这就要用到数据卷了。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。例如:
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录上。而操作宿主机的/var/lib/docker/volumes/html
目录,就等于操作容器内的/usr/share/nginx/html
目录。
创建一个数据卷,其名称为html:
docker volume create html
查看所有数据卷:
docker volume ls
查看数据卷详细信息:
docker volume inspect html
可以看到,上面创建的html数据卷关联的宿主机目录是/var/lib/docker/volumes/html/_data
。
另外,还有两个常用的命令:
# 删除指定数据卷
docker volume rm [name]
# 删除所有未使用的数据卷
docker volume prune
在创建容器时,可以通过-v
参数来挂载一个数据卷到某个容器内的目录,例如:
docker run --name nginx4 -v html:/usr/share/nginx/html -p 80:80 -d nginx
在上面的命令中,创建了一个容器nginx4,其中-v html:/usr/share/nginx/html
就是把容器中的/usr/share/nginx/html
这个目录挂载到html数据卷。
此时,如果要修改nginx4容器内/usr/share/nginx/html
目录内的index.html的内容,只需要进入html数据卷所在位置/var/lib/docker/volumes/html/_data
,修改其中的index.html即可:
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
修改完成后,在浏览器访问:http://192.168.146.129
:
通过数据卷,将容器与数据分离解耦合,方便操作容器内数据,保证数据安全。
…
本节完,更多内容请查阅分类专栏:微服务学习笔记
感兴趣的读者还可以查阅我的另外几个专栏: