Docker入门教程学习笔记
Docker概述
Docker为什么会出现?
一款应用从开发到上线,一般会有开发环境、测试环境和生产环境。
Docker的出现是为了解决不同环境中应用开发、测试和部署时配置重复且繁琐,且环境不同引发应用出现崩溃、不兼容的问题,Docker通过隔离机制,将应用运行的必要环境和应用打包在一起,可以让应用轻松、快速地部署成功。
Docker历史
2010年,dotCloud公司创始人Solomon Hykes发起了Docker项目,2013年,Docker项目开源。Docker使用Go语言进行开发实现,对进程进行封装隔离,是属于操作系统层面的虚拟化技术。
由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器。
Docker为什么会流行?
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack集群和其他的基础应用平台。
Docker可以解决的问题:
- 上线流程繁琐,需要经历开发->测试->申请资源->审批->部署->测试等环节
- 资源利用率低,普通服务器利用率低,造成过多浪费
- 扩容/缩容不及时,业务高峰期扩容流程繁琐,上线不及时
- 服务环境臃肿,对维护、迁移带来困难
- 环境不一致
Docker常用于如下场景:
- Web应用的自动打包和发布;
- 自动化测试的持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS服务。
Docker资料:
- Docker官网:https://www.docker.com/
- Docker文档:https://docs.docker.com/
- Docker仓库:https://hub.docker.com/
虚拟机VS容器
传统虚拟机:虚拟出一套硬件后,在其上运行一个完整的操作系统,然后在这个系统安装和运行软件。
Docker:应用直接运行在宿主机的内核,容器没有自己的内核,也没有虚拟硬件,所以更轻量,每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
所以说,新建一个容器的时候,Docker不需要像虚拟机一样需要重新加载一个操作系统的内核,避免引导。虚拟机是加载了Guest OS,而Docker是利用宿主机的操作系统,省略了这个过程。
Docker容器 | VM传统虚拟机 | |
---|---|---|
虚拟化类型 | 操作系统虚拟化 | 硬件虚拟化 |
性能 | =宿主机性能 | 5%-20%损耗 |
隔离性 | NS隔离 | 强 |
QoS | Cgroup弱 | 强 |
安全性 | 中 | 强 |
Docker基本组成
Docker名词
镜像 image:Docker镜像好比一个模板,可以通过这个模板来创建容器服务,如:tomcat镜像–>docker run–>tomcat01容器,通过这个镜像可以创建多个容器。
容器 container:Docker利用容器技术,以镜像为模板来创建独立运行的一个或一组应用,容器有启动、停止、删除等基本命令。
仓库 repository:Docker仓库是存放镜像的地方,仓库分为公有仓库和私有仓库,公有仓库有:Docker Hub(默认放在国外),阿里云代理(配置镜像加速)。
Docker安装
环境准备
1、需要会Linux基本指令
2、一台服务器(本文使用阿里云服务器,宿主机操作系统是CentOS 7)
3、连接远程服务器进行操作(本文使用的远程连接软件是SecureCRT)
环境查看
系统内核是 3.10 以上的 |
安装Docker
帮助文档 https://docs.docker.com/engine/install/centos/
1.卸载旧的版本 |
卸载Docker
1.卸载依赖 |
配置阿里云镜像加速(前提是购买了阿里云服务器)
登陆阿里云–>阿里云控制台–>搜索容器镜像服务–>点击容器镜像服务–>点击镜像工具的镜像加速器–>按照CentOS页签下的教程在服务器里配置容器镜像加速
sudo mkdir -p /etc/docker |
底层原理
Docker是怎么工作的?
Docker是一个C/S结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,Docker Server接收到Docker Client的指令,就会执行这个指令。
Docker命令
帮助命令
docker version # 显示docker的版本信息 |
命令帮助文档地址:https://docs.docker.com/engine/reference/commandline/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@xizou /]# docker images |
docker search 搜索镜像
[root@xizou /]# docker search mysql |
docker pull 镜像名[:tag] 下载镜像
[root@xizou /]# docker pull mysql |
docker rmi 删除镜像
[root@xizou /]# docker rmi -f 镜像id # 删除指定的镜像 |
容器命令
说明:有了镜像才能够创建容器,linux下载一个centos镜像来学习
docker pull centos |
docker run 新建容器并启动
docker run [可选参数] image |
docker ps 列出所有运行的容器
docker ps命令 |
退出容器
exit # 直接容器停止并退出 |
dockers rm 删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,强制删除为docker rm -f 容器id |
启动和停止容器的操作
docker start 容器id # 启动容器 |
常用其他命令
docker run -d 镜像名 后台启动容器
测试 |
docker logs 查看日志
命令 |
docker top 容器id 查看容器中的进程
测试 |
docker inspect 容器id 查看容器的元数据
测试 |
进入当前正在运行的容器
通常容器都是使用后台方式运行的,需要进入容器,修改一些配置时 |
docker cp 从容器内拷贝文件到主机上
测试 |
小结
[root@xizou /]# docker --help |
作业练习
部署Nginx
扩展:Nginx是一个高性能的Web服务器,整体功能十分强大,不单单可以用来做Web服务器,还可以用来做反向代理、负载均衡、域名重定向、动静分离、缓存、邮件代理、微服务网关等。
1.搜索nginx镜像文件, 建议去docker hub网站搜索,可以看到详细信息 |
思考问题:每次改动nginx配置文件都需要进入容器内部,十分的麻烦,如果在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部就可以自动修改的目的 -v 数据卷技术
部署tomcat
扩展:Tomcat是一款Apache下面的开源的Servlet容器,实现了对Servlet和JSP规范的支持。另外 Tomcat本身内含了一个 HTTP 服务器,所以也可以被当作一个 Web 服务器来使用。但是Tomcat作为一个Web服务器,它对静态资源的处理能力要比Apache或者Nginx这类的Web服务器差很多,所以我们经常将Apache和Tomcat(或者是Nginx和Tomcat)组合使用,Apache来充当Web服务器处理静态资源的请求,Tomcat充当Servlet容器来处理动态请求。
官方的使用 |
思考问题:每次部署项目,都需要进入容器内部,十分的麻烦,如果在容器外部提供一个映射路径,webapps,在容器外部放置项目,就自动同步到内部就好了 -v 数据卷技术
部署ElasticSearch + Kibana
扩展:
- ElasticSearch是一个实时的分布式存储、搜索、分析的引擎,它能很方便的使大量数据具有搜索、分析和探索的能力。
- Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。
Elasticsearch 暴露的端口很多、十分的耗内存、数据一般需要放置到安全目录 |
使用Kibana访问ES
可视化
- portainer
- Rancher (CI/CD)
- Openshift
什么是portainer
portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
下载运行 |
使用教程 https://www.cnblogs.com/JerryMouseLi/p/15571897.html
Docker镜像
镜像是什么
docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包成docker镜像,可以在docker中运行起来。
如何获得镜像:
- 从远程仓库下载
- 别人分享拷贝
- 自己制作一个镜像DockerFile
Docker镜像加载原理
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改,作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特型:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
Docker的镜像实际上是由一层一层的文件组成,这种层级的文件系统就是UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层就是bootfs。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内核中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system)在bootfs之上,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等待。
平时我们按照进虚拟机的CentOS都是好几个G、为什么Docker才200M?
[root@xizou /]# docker images |
对于一个精简的OS,rootfs可以很小,只包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的内核,自己只要提供rootfs即可,因此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
虚拟机是分钟级别的,容器是秒级的。
分层的镜像
可以去下载一个镜像,观察下载的日志输出,可以发现是一层一层在下载。
比如:
下载redis |
可以发现在RootFS的Layers有分层。
分层最大的好处在于资源共享,比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
理解:
所有的Docker的镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,例如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
如下图所示,该镜像当前已经包含3个镜像层。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上面中的镜像层跟之前的图中略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,这样就使得文件的更新版本作为一个新的镜像层添加到镜像中。
Docker通过存储引擎(快照机制)的方式来实现镜像层的堆栈,并保持多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都是基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows仅支持Windowsfilter一种存储引擎,该引擎基于NTFS系统之上分层和CoW。
下图展示了与系统显示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层就是通常所说的容器层,容器之下的都叫镜像层。
Commit镜像
docker commit 提交容器成为一个新的镜像 |
实战测试
1.启动一个默认的tomcat |
当想保持容器的状态,可以通过commit来提交,获得一个镜像,就好比虚拟机的快照。
参考文章
本文是笔者通过下列视频教程进行Docker入门学习的记录,有部分修改和补充,转载请注明出处,并附带下面链接。