docker入门
前言
最近BOSS让我实现容器化部署方案,特的简单的调研了一下,目前市面上主流的方案就是docker了。所以部署成熟方案就是docker了,毕竟阿里云,AWS等都在用,结合现有业务,实现全部容器化部署还是不太现实,也不需要,保证大部分业务实现即可,减轻运维的压力😓。
docker其实是云化的一种实现,本质上是部署应用于管理应用,与具体业务无关。
1. docker engine
在实际开发中,其实我们安装的docker是docker engine,是CS架构设计。
1.1. docker
直接看docker的架构,官方文档其实很详细了,复制官方架构图:docker架构图
可以看出docker的架构分为client、主机、仓库 3部分。日常我们执行的命令就是client,操作各种命令,而仓库顾名思义就是存放镜像文件的,核心其实是docker引擎,即docker主机:容器是镜像运行后才是容器,对比上图的Containers。一句话概括:
通过client命令从仓库把镜像通过主机的守护进程拉取到本地并执行后的单元就是容器。
1.2. 对比虚拟机
docker之前,云计算大多使用虚拟机,但是虚拟机比较重型化,对比发现
大部分设计都差不多,只是虚拟机是虚拟硬件,而docker只是逻辑虚拟,功能类似沙盒。
1.3. docker 安装
目前最新版的docker有社区版与企业版,安装社区版即可。
windows与macos直接使用安装包就可以了,linux官方也有详细的安装教程:安装教程
这里需要说一点:由于上一章讲了docker需要拉取镜像,这个hub镜像是国外的,网络不容乐观。配置ali,网易等随意,可以加快拉取镜像速度。macos在图形界面可配置
安装好后:执行docker version
可以看见版本号,docker是go语言开发的,其实docker本身是没有管理功能的,需要辅助k8s(舵手)等管理,要对这些定制需要熟悉go语言,而且go语言依赖少天然比较适合docker部署。
docker也可以配置私仓Docker Registry,单独放置自己的镜像,官方建立私仓的方式
2. docker镜像
docker镜像是用来引擎执行的不变单元,docker容器是分层的,在制作docker镜像与删除就可以提现出来,比如Tomcat镜像,运行需要linux系统,JDK,Tomcat等
这只是一个比喻图,实际官方tomcat镜像层数比这个多。
利用 Union FS 的技术,将一个镜像分层,各层是可以重复利用的,比如Tomcat,只需要修改Tomcat与JDK层,其他基本上可以重复利用。
2.1. 本地镜像列表
docker images [OPTIONS] [REPOSITORY[:TAG]]
可以查询官方文档:https://docs.docker.com/engine/reference/
列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间,由于没有镜像,我们拉取hello-world。
2.2. 拉取镜像
docker search [OPTIONS] TERM
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
先查找,在pull到本地
拉取2个版本tomcat,进一步说明了镜像的层是复用的,每层有独立的ID区分
3. docker镜像执行
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run -d -p 8080:8080 tomcat:8.5.56-jdk8-adoptopenjdk-openj9
查看刚刚运行的容器,此时有了容器ID
通过exec命令,可以进某个容器。容器在很多情况下也是虚拟系统+lib+app,本质跟虚拟机没什么两样,只是没有虚拟硬件。
比如我们新建一个index文件
docker exec -it wonderful_jennings bash
容器本身是执行那一层层的镜像,可以看出我在macOS上执行的容器是应用的linux镜像,新建了index文件
访问http://localhost:8080/index.html
其实此时我们可以把这个容器commit成新的镜像,push进私仓重复使用。
实际的生产测试发布是使用做好的dockfile编译定制镜像,然后实现测试生产发布。
可以通过docker ps查看刚刚运行的容器进程
通过docker stop停止容器,通过docker rm删除容器,只需记得命令的含义即可,细节可以直接查看官方文档
总结
docker其实也是用来实现应用部署管理的,更轻量级,docker容器的管理更加复杂,这其实是容器很简单的demo,其实很多东西没处理,比如
- 文件系统,docker容器中的文件随着容器的stop而消失了,对于日志或者其他重要文件显然必须映射在宿主机上。
- 网络通信,容器之间、容器与宿主机等都需要处理,笔者这里是本机,所以仅映射了端口,实际还有组网
- 容器的管理,怎么把环境初始化环境,并管理上这些容器,目前流行的是k8s
- 容器编排,容器动态调度,实现资源的调配来实现业务性能的调配,俗称增减机器增减性能
- 容器之间服务管控,比如负载均衡,熔断,目前流行的是Istio