文章目录
- 1 Docker介绍
- 1.1 Docker的优势
- 1.1.1 应用部署的环境问题
- 1.1.2 Docker解决依赖兼容问题
- 1.1.3 Docker解决操作系统环境差异
- 1.1.4 小结
- 1.2 Docker和虚拟机的区别
- 1.3 Docker架构
- 1.3.1 镜像和容器
- 1.3.2 DockerHub
- 1.3.3 Docker架构
- 1.4 安装Docker
- 1.4.1 卸载旧版本Docker(可选)
- 1.4.2 安装Docker
- 1.4.3 启动Docker
- 1.4.4 配置镜像加速
- 2 Docker的基本操作
- 2.1 镜像操作
- 2.1.1 镜像名称
- 2.1.2 镜像命令
- 2.1.2.1 拉取、查看镜像
- 2.1.2.2 导出、删除、导入镜像
- 2.2 容器操作
- 2.2.1 创建并运行一个容器
- 2.2.2 进入容器,修改文件
- 2.2.3 其他常用命令
- 2.3 数据卷
- 2.3.1 数据卷介绍
- 2.2.2 数据卷命令
- 2.2.2.1 创建和查看数据卷
- 2.2.2.2 挂载数据卷
1 Docker介绍
1.1 Docker的优势
微服务虽然具备各种各样的优势,但服务的拆分通常会给部署带来了很大的麻烦:
- 分布式系统中,依赖的组件非常多,不同组件之间部署时可能会产生一些冲突;
- 在数百上千台服务器中重复部署,每台服务器的环境不一定一致,可能会遇到各种问题。
1.1.1 应用部署的环境问题
大型项目组件较多,运行环境也较为复杂,部署时可能会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题;
- 开发、测试、生产环境有差异。
例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖库各不相同,甚至会有冲突,这就给部署带来了极大的困难。
1.1.2 Docker解决依赖兼容问题
Docker为了解决依赖的兼容问题的,采用了两个手段:
- 将应用、Libs(函数库)、Deps(依赖)、配置一起打包,形成可移植镜像。
- 将每个应用放到一个隔离容器去运行,避免互相干扰。
这样打好的包,既包含应用本身,也包含应用所需要的Libs、Deps,无需再在操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。
1.1.3 Docker解决操作系统环境差异
解决了不同应用的兼容问题,但是开发、测试等环境仍会存在差异,操作系统版本也会有差异。例如,将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,则会报错。
Docker为了解决不同系统环境差异问题,也采用了两个手段:
- 将应用与所需要调用的系统函数库一起打包。
- 基于打包的系统函数库,借助于操作系统的Linux内核来运行。
这样打好的包,即包含应用本身,也包含应用所需要的系统函数库,直接基于Linux内核运行,因此可以在任意Linux操作系统上运行。
1.1.4 小结
总的来说,Docker是一个快速交付应用、运行应用的技术,具备下列优势:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
- 启动、移除都可以通过一行命令完成,方便快捷。
1.2 Docker和虚拟机的区别
Docker可以让一个应用在任何操作系统中非常方便的运行。而虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。
两者的区别在于:
- 虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的 Ubuntu 应用了。
- Docker仅仅是封装函数库,并没有模拟完整的操作系统。
- 在性能上,Docker接近原生,虚拟机性能较差;
- 在硬盘占用上,Docker一般为MB,虚拟机一般为GB;
- 在启动上,Docker一般为秒级,虚拟机为分钟级。
总的来说,Docker只是一个系统进程,而虚拟机是在操作系统中的操作系统;Docker体积小、启动速度快、性能好,而虚拟机体积大、启动速度慢、性能一般。
1.3 Docker架构
1.3.1 镜像和容器
- 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
- 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。因此一个镜像可以启动多次,形成多个容器进程。
1.3.2 DockerHub
DockerHub是一个官方的Docker镜像的托管平台,称为Docker Registry。国内也有类似于DockerHub的公开服务平台,比如网易云镜像服务、阿里云镜像库等。
我们不仅可以从DockerHub拉取镜像,还可以将自己的镜像共享到DockerHub:
1.3.3 Docker架构
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务端发送指令。
1.4 安装Docker
Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期7个月),EE 即企业版,强调安全,付费使用,支持周期24个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的安装指南,这里主要学习 Docker CE 在 CentOS7 上的安装步骤。
Docker CE 支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7满足最低内核的要求。
1.4.1 卸载旧版本Docker(可选)
如果之前安装过旧版本的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
1.4.2 安装Docker
- 1)安装yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken
- 2)更新本地镜像源
# 设置Docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast
- 3)安装docker-ce
yum install -y docker-ce
1.4.3 启动Docker
Docker应用需要用到各种端口,逐一去修改防火墙设置非常麻烦,因此在使用虚拟机进行学习时可以直接关闭防火墙!但生产环境是绝对不可以的!
- 1)关闭防火墙
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
- 2)启动Docker
# 启动Docker服务
systemctl start docker # 停止Docker服务
systemctl stop docker # 重启Docker服务
systemctl restart docker
- 3)查看Docker版本
docker -v
1.4.4 配置镜像加速
Docker官方镜像仓库网速较差,我们可以设置为国内镜像服务。
参考阿里云镜像加速器文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
按照文档指引执行以下命令,即可完成镜像加速配置:
2 Docker的基本操作
2.1 镜像操作
2.1.1 镜像名称
镜像名称一般由两部分组成:[repository]:[tag]。在没有指定tag时,默认是latest,代表最新版本的镜像。如图:
2.1.2 镜像命令
2.1.2.1 拉取、查看镜像
需求:从DockerHub中拉取一个Nginx镜像并查看。
- 1)去DockerHub镜像仓库搜索Nginx镜像
- 2)根据查看到的镜像名称,拉取自己需要的镜像
docker pull nginx
- 3)查看拉取到的镜像
docker images
2.1.2.2 导出、删除、导入镜像
需求:将Nginx镜像导出磁盘,然后再加载回来。
- 1)导出Nginx镜像到磁盘
格式:docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest
- 2)删除本地的Nginx镜像
docker rmi nginx:latest
- 3)读取nginx.tar文件加载Nginx镜像
docker load -i nginx.tar
2.2 容器操作
Docker容器有三个状态:
- 运行:进程正常运行
- 暂停:进程暂停,CPU不再运行,但并不释放内存
- 停止:进程终止,回收进程占用的内存、CPU等资源
2.2.1 创建并运行一个容器
创建并运行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了。如图:
2.2.2 进入容器,修改文件
需求:进入nginx容器,修改html文件内容,添加“我进来了…”
- 1)进入nginx容器
docker exec -it nginx bash
命令解读:
docker exec
:进入容器内部,执行一个命令-it
: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互nginx
:要进入的容器的名称,执行docker run
时指定bash
:进入容器后执行的命令,bash是一个linux终端交互命令
- 2)进入nginx容器的html所在目录
/usr/share/nginx/html
容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样。Nginx的环境、配置、运行文件全部都在这个文件系统中,包括要修改的html文件。
cd /usr/share/nginx/html
- 3)修改index.html的内容
容器内没有vi
命令,无法直接修改,但可以使用sed
命令来修改:
sed -i -e 's#Welcome to nginx#我进来了...#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
- 4)访问index.html
在浏览器访问:http://192.168.146.129
:
2.2.3 其他常用命令
- 查看nginx容器日志的命令:
docker logs nginx
# 持续查看日志
docker logs nginx -f
- 查看容器状态:
# 查看正在运行的所有容器
docker ps
# 查看所有容器,包括已经停止的
docker ps -a
2.3 数据卷
2.3.1 数据卷介绍
在上面的案例中,修改nginx的html页面时,需要进入nginx内部,并且因为没有编辑器,修改文件内容显示很麻烦。
这是因为容器与数据(容器内文件)耦合带来的后果:
- 不便于修改:要修改容器内的文件,需要进入容器内部;
- 数据不可复用:在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的;
- 升级维护困难:升级时删除旧容器,则会把修改的数据一并删掉。
要解决这个问题,则必须将数据与容器解耦,这就要用到数据卷了。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。例如:
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录上。而操作宿主机的/var/lib/docker/volumes/html
目录,就等于操作容器内的/usr/share/nginx/html
目录。
2.2.2 数据卷命令
2.2.2.1 创建和查看数据卷
创建一个数据卷,其名称为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
2.2.2.2 挂载数据卷
在创建容器时,可以通过-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
:
通过数据卷,将容器与数据分离解耦合,方便操作容器内数据,保证数据安全。
…
本节完,更多内容请查阅分类专栏:微服务学习笔记
感兴趣的读者还可以查阅我的另外几个专栏:
- SpringBoot源码解读与原理分析
- MyBatis3源码深度解析
- Redis从入门到精通
- MyBatisPlus详解
- SpringCloud学习笔记