本文主要内容为笔者经验总结,非操作手册,内容提要:
- 快速理解docker是什么?
- 测试、开发人员能使用docker做什么?
- 怎么使用docker?
- K8S有什么用,什么时候用?
- Docker 使用出现问题怎么办?
帮你理解什么是docker?
不太准确但很好理解的docker介绍
绝大多数的服务端程序都需要运行在linux环境中,我们先来对比下一份JavaWeb编写应用(比如商城系统、博客管理系统、人事管理系统)的两种部署方式
传统方法部署
一份典型的传统JavaWeb应用部署文档:
- 准备linux环境
- 安装java环境
- 更改JAVA环境变量
- 安装启动mysql
- 配置mysql用户
- 执行sql脚本导入应用数据库
- 安装tomcat
- 更改数项tomcat配置(如端口、超时时间...)
- FTP上传应用文件到tomcat指定目录
- 启动tomcat,部署完成
这基本是一个简单JavaWeb应用的基本步骤了,php应用、.net应用也都类似,运维同学应该很眼熟。很麻烦对吗?稍复杂一点应用的可能还需要在同一台机器上安装并配置nginx、redis、mq、...(很多中小型公司的确是全部应用环境在一台机器上😂)。应用需要部署10份?那乖乖重复10次吧!
使用docker部署
还是上面的那个应用,来看看使用docker方式的部署文档:
- 准备docker环境
- 操作docker下载应用包
- 操作docker使用应用包启动应用
简单多了是吗?来我解释下:
第1步的docker环境,其实就是一个应用软件,怎么安装将在下文介绍,上面的部署文档没有列出安装docker应用的步骤,是因为大家基本都是用云服务,云服务商(阿里云、腾讯云、亚马逊AWS、微软Azure等)是直接有docker环境提供的,购买后可以直接使用,不需要自己去安装
第2步的应用包,一般由开发人员来制作,测试和运维人员无需关心,反正java、tomcat、mysql、应用文件、数据、配置都已经弄好了都在应用包里。提供应用包下载的服务叫做仓库(Registry),这个应用包叫做镜像(Image),是不是像手机从的应用商店下载APP安装包(仓库≈应用商店,镜像≈APP安装包)?
第3步启动好的应用叫做容器(Container),镜像与容器的关系,类似于APP安装包和安装后的APP应用的关系,不过使用docker,你可以下载多个不同版本的镜像,还可以用一个镜像启动多容器(有点像应用多开)
官方点的docker介绍
docker是一个开源的应用容器引擎,它使用Go语言开发,基于Linux内核,对其中运行的应用进程之间进行封装隔离,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
想了解更多docker来源或架构信息可参考:什么是docker
docker官方维护了一个公共仓库:Docker Hub,常用的服务端应用如mysql、nginx、java、tomcat等都可以找到相应镜像,用户也可以创建自己的私有仓库(比如自己公司开发的应用不能公开到公共仓库时需要自己创建仓库)
docker与虚拟机对比
文件层面对比
你可能觉得上文中的应用包(镜像)有点类似与连同操作系统和所有应用一起打包的系统快照,但其实镜像可以很轻很小,比如官方的hello-world镜像几KB,显然不可能包含整个一个内核。
实际上,docker提供了一个标准化的Linux环境,这个环境已经包含在docker引擎中,有点像只包含特定linux系统的虚拟机。而镜像包,是基于此标准环境构建的,是这个标准上面的应用打包而成而来,基本只包含应用的文件,不包含底层的系统文件。
运行机制对比
同一个虚拟机上面运行的各个软件,可能共同操作同一份文件,可能抢占同一个端口,相互并非隔离。而同一docker上面运行的多个容器相互隔离,各容器各自管理自己的文件、端口。
开发、测试人员使用docker能做什么
搭建应用环境
在测试或者开发机器上安装docker后,可以通过docker命令快速安装mysql、redis、mq、nginx等环境,省去复杂的依赖配置、安装、启动过程
应用环境崩溃后快速恢复
应用环境被玩坏了?删掉docker容器再启动一个就好了,全新环境又有了
配置集群环境
在一台机器上运行多个mysql好像很难,那我这个应用数据库是Mysql主从该怎么测试?用docker启动多个mysql容器就很简单
测试docker构建的应用
开发制作了docker镜像?那只能用docker来测了!!!
拒绝背锅😜
- 用docker前
- 👩🔬测试:这里好像是个bug?
- 🐒开发:一定是你环境不对,自己检查😎!
- 用docker后
- 👩🔬测试:这里好像是个bug?
- 🐒开发:你环境有问题吧?
- 👩🔬测试:环境在镜像里,而镜像你给我的😱
docker怎么用
安装docker
需要在自己电脑上玩docker的话,就需要先安装了,步骤不细讲,如果需要这里有份详细的安装指南
linux系统上安装docker
推荐使用脚本安装
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
windows系统安装docker-desktop
win7或更早版本
需使用Docker Toolbox安装
win10家庭版
正常同win7一样需使用Docker Toolbox方法安装,因为此方式性能较低建议先伪装成win10专业版,笔者已通过此方法安装成功
win10 专业版
1.开启Hyper-V(控制面板 - 程序与功能 - 启用或关闭windows功能 - 勾选Hyper-V - 保存 - 重启)
2.去官网下载最新安装包安装即可
Mac系统安装docker-desktop
官网下载最新安装包后安装
配置建议
国内镜像加速
国内从 Docker Hub 下载镜像很慢,建议配置,配置方法参考
如非必要国内不建议开启Kubernets
Kubernets是一个管理多个机器上的docker的应用,简称K8s,介绍后面讲。如果打开Kubernets选项,会因为国内网络无法访问k8s站点会导致K8s永远在启动中,重启无法解决。
操作工具
docker安装配置完就可以用你喜欢的终端工具操作docker了,比如windows的CMD或Powersheel、Mac Terminal、Linux terminal
下载镜像
浏览器打开Docker Hub,从顶部搜索框输入名称搜索(试着搜索mysql、nginx、java、tomcat、...),搜索结果列表中镜像一般命名规则为“用户名/镜像名”,其中部分没有用户名的镜像为官方提供的镜像。点开任一条目后会有详细介绍,我们一般复制页面右上的命令下载最新版本就可以了
试试复制命令后打开终端粘贴执行吧👇👇👇
docker pull nginx
注:nginx是一个静态网页服务器程序
下载完成后可以查看镜像列表
docker images
启动容器
试试复制命令后打开终端粘贴执行吧👇👇👇
docker run --name my-nginx -p 8888:80 --restart=always -d nginx
上面的命令只有“docker run nginx”是必须的,解释下中间参数
- --name my-nginx 是给启动的容器命名,其中“my-nginx”你可以随便改
- -p 8888:80 是一个端口映射,nginx默认使用容器的80端口,但是因为docker容器是隔离的,在当前的容器外面你就访问不到这个端口,所以映射到系统的80端口
- --restart=always 这个参数的作用是以后每次启动docker软件的时候让这个容器自动启动运行
- -d 后台运行,没这个参数的话会进入容器的终端,我们这里不需要
容器启动成功后可以浏览器打开http://localhost:8888查看
使用如下命令可以查看运行中的docker容器,点击Docker Desktop任务栏图标打开Dashboard界面也可查看
docker ps
K8S有什么用,怎么用?
不太准确但很好理解的K8S介绍
假如在你的强烈建议下,你们的团队终于使用docker来部署应用了。起初你们的应用只单机部署(简单理解就是服务只运行在一台机器上),你通过Docker Dashboard或者用几个命令就可以查看管理它,测试也基本没什么问题。后来随着访问量持续上升一个docker快要撑不住了,这时候你们就可以多启动几个docker,将用户的访问分散到各个docker服务上,还可以按访问量规律随时调整,比如晚上19点-22点是访问量高峰,就启动10个docker容器,其余时间只保留5个节省资源,这样的多份部署的方式叫做集群。
当你们有大量的docker服务需要管理的时候,一个一个去连接输入命令控制显然地效率低下,这时候就该Kubernetes (简称K8S)上场了,它提供了一个图形化地网页界面Kubernetes Dashboard去管理你地docker集群,界面长这样:
Kubernetes Dashboard
怎么用K8S?
先安装K8s
这一步部署的是K8s核心服务,注意国内访问不到K8S站点不能直接开启K8S,Linux参考:使用 kubeadm 部署 kubernetes,Windows和Mac目前最简便安装K8S的方式是使用阿里提供的脚本。
再安装K8S Dashboard
这一步部署的是K8S的网页界面,部署过程参考教程,部署完成后就可以浏览器打开下面的网页界面了
Docker 使用出现问题怎么办?
先日志看看什么问题:
Mac使用如下命令获得实时日志信息:
pred='process matches ".*(ocker|vpnkit).*"
|| (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
/usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"
在Windows上可以在 C:\ProgramData\DockerDesktop下的service.txt 查看Docker日志
按日志中的问题百度试试能不能解决吧,实在解决不了的话,打开Docker Desktop顶上的TroubleShoot(BUG虫的图标),点那个“Reset to factory defaults”重置,注意会清理掉你所有的镜像和容器。
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
网友评论