网站的域名和密码,读书分享会ppt模板免费下载,服务器安全狗,德州建网站#x1f389;#x1f389;欢迎来到我的CSDN主页#xff01;#x1f389;#x1f389; #x1f3c5;我是Java方文山#xff0c;一个在CSDN分享笔记的博主。#x1f4da;#x1f4da; #x1f31f;推荐给大家我的专栏《Docker实战》。#x1f3af;#x1f3af; … 欢迎来到我的CSDN主页 我是Java方文山一个在CSDN分享笔记的博主。 推荐给大家我的专栏《Docker实战》。 点击这里就可以查看我的主页啦 Java方文山的个人主页 如果感觉还不错的话请给我点赞吧 期待你的加入一起学习一起进步 前言
1.docker
1.1 docker的发展史
2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombinator的支持,后来微软谷歌亚马逊这样的大厂商也纷纷加入PAAS平台,竞争十分激烈,dotCloud举步维艰.
2013年可能是公司发展的不是很好,工程师又不想自己的努力付之东流,于是他们决定将他们的核心技术开源.这项技术就是docker.当时docker的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移.
无心插柳柳成荫,docker技术风靡全球,于是dotCloud公司改名为docker Inc,并全面投入到docker的开发之中.
2014.6 Docker发布了第一个版本 Docker1.0
1.2.什么是docker
docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中. Docker翻译过来就是码头工人
Docker是一个开源的应用容器引擎让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中然后发布到任何流行的Linux机器上也可以实现虚拟化。容器完全使用沙盒机制相互之间不会存在任何接口。几乎没有性能开销可以很容易的在机器和数据中心运行。最重要的是他们不依赖于任何语言、框架或者包装系统。 沙盒也叫沙箱sandbox。在计算机领域指一种虚拟技术而且多用于计算机安全技术。安全软件可以让它在沙盒中运行如果含有恶意行为则禁止程序的进一步运行而这不会对系统造成任何危害。 Docker是dotCloud公司开源的一个基于LXC的高级容器引擎源码托管在Github上基于go语言并且遵从Apache2.0协议开源。GitHub地址https://github.com/moby/moby LXC为Linux Container的简写。Linux Container 容器是一种内核虚拟化技术可以提供轻量级的虚拟化以便隔离进程和资源而且不需要提供指令解释机制以及全虚拟化的其他复杂性。 LXC主要通过Kernel的namespace实现每个用户实例之间的项目隔离通过cgroup实现对资源的配额和调度。 docker官网https://www.docker.com docker中文库:https://www.docker.org.cn/ 1.3.docker相较于VM的优点
VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓 库然后再安装应用 Container(Docker容器)在宿主机器、宿主机器操作系统上创建Docker引擎在引擎的基础上再安装应用。 1、比VM小、快Docker容器的尺寸减小相比于整个虚拟机大大简化了分布 到云和分发时间的开销。Docker启动一个容器实例时间仅仅需要几秒钟。 2、Docker是一个开放的平台构建、发布和运行分布式应用程序。 3、开发人员不需要关系具体是哪个Linux操作系统 4、Google、微软azure、亚马逊、IBM等都支持docker。 5、Docker支持Unix/Linux操作系统也支持Windows和Mac。 Docker局限性 Docker用于应用程序时是最有用的但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小不用和存储大量数据存储可以通过外部挂载等方式使用比如NFS、ipsan、MFS等 或者docker命令 -v映射磁盘分区。 总之docker只用于计算存储交给别人。 2.了解docker
2.1 docker思想
2.1.1 集装箱
没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西.
2.1.2 标准化
1. 运输方式
docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去.
2. 存储方式
当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了.
3. API接口
docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令.有了docker我们记docker的命令就可以对其进行操作.
2.1.3 隔离
我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒.最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术.最大效率的隔离了进程和资源.通过cgroup,namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等,这个机制在7,8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?英雄造时势,时势造英雄,如果没有云计算,敏捷开发,高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker.
2.2 docker解决的问题
2.2.1 系统环境不一致
开发:我本地没问题.运维:服务器没问题. 这个问题就变成了皮球.
如果一个应用要正常的启动起来需要什么?比如java web应用.
需要一个操作系统,操作系统之上要jdk,tomcat,我们的代码,配置文件.
操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令.
jdk版本也可能导致程序的运行失败.比如class文件需要1.7编译,我们装了个1.6的jdk.
tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持.
代码的话就比如应用了C盘,D盘的一个文件,或者是用了系统的一些环境编码.
配置的话我们可能少了某个配置文件等等.
下面docker来了,它把操作系统,jdk,tomcat,代码,配置全部放到集装箱里.再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行.不会有任何的问题.一句话就是docker解决了运行环境不一致所带来的问题.
2.2.2 系统好卡,哪个哥们又写死循环了
如果有根别人共用服务器的同学可能有这样的体会,莫名其妙发现自己的程序挂了,一查原因要不是内存不够了,要不是硬盘满了,还有就是发现某个服务变慢了,甚至敲终端都比较卡,但是linux本身就是一个多用户的操作系统本身就可以供多个用户使用,docker的隔离性可以解决这个问题,就算别人的程序还是死循环疯狂吃CPU,还是封装疯狂打日志把硬盘占满,还是内存泄漏,把内存占满,都不会导致我们的程序运行错误.因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程.
2.2.3 双11来了,服务器撑不住了
大部分系统业务量并不是每天都比较平均的,特别是一些电商系统,每天总有那么几天业务量是平时的几倍甚至几十倍,如果按双11的规模去准备服务器那么对于平时的规模来说又是极大的浪费,所以就在节日前临时扩展机器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java,tocmat等等,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下服务器就可以从10台变成100台甚至1000,1W台.都是分分钟的事情.
为什么会这么快呢?都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题.
3.走进docker
镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方.docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器.
build:构建,就是构建镜像.
ship:运输,运输镜像,从仓库和主机运输.
run:运行的镜像就是一个容器.
build,ship,run和镜像,仓库,容器是一一对应的.
3.1 镜像 Docker 镜像就是一个只读的模板。 镜像的英文名交image.前面我们讲到了集装箱,鲸鱼拖着的所有集装箱就是一个镜像.
从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?
说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下.
比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件.联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1,test2)中的内容. 通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层,每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储.
下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的.注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像. 3.2 容器 Docker 利用容器来运行应用。 为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,可以把上面的图整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的.为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统.
在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层.
由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.
3.3 仓库 仓库是集中存放镜像文件的场所。 我们的镜像是要在其它机器上运行,如何进行传输呢?
这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.
谁提供了这样的仓库呢?docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库.比较知名的是由网易蜂巢提供的 登录
二、Docker的安装
操作系统要求
若要安装 Docker 引擎需要以下版本之一的维护版本 CentOS 版本
CentOS 7操作系统CentOS 8流CentOS 9流
必须启用存储库。此存储库由 违约。如果您已禁用它则需要重新启用它。centos-extras
卸载旧版本
旧版本的 Docker 是 或 。 在尝试安装新版本之前卸载任何此类旧版本 以及相关的依赖项。dockerdocker-engine
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine 旧版本的docker叫做docker或者docker-engine如果有安装先卸载其以及其依赖新版本的 docker叫做docker-ce docker-ce社区版免费 docker-ee专业版收费 安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加 docker-ce安装源第一个是国外的安装源第二个是置阿里云 Docker Yum 源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新 yum 缓存 yum makecache fast yml.pid占用如果出现这个问题就执行该代码 rm -f /var/run/yum.pid 安装 docker-CE yum -y install docker-ce 1 默认安装的是最新版本的稳定版 2 查看版本列表请使用如下命令 yum list docker-ce --showduplicates | sort -r 3如果要安装特定版本的 docker-CE 请使用如下命令格式 yum install docker-ce- 出现下图就表示安装完成 三、Docker基本使用
1.基本操作
查看服务状态
systemctl status docker 启停服务
systemctl start docker
systemctl stop docker
systemctl restart docker
开机自启 systemctl enable docker
systemctl disable docker 查看宿主机上的镜像 docker images 下载镜像 但是我们下载镜像是非常慢的所以要配置一个加速器https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 全部执行完后我们可以查看一下 docker pull 镜像名
获取一个 centos 系统的基础镜像可以使用如下的命令:
docker pull centos 未指定版本一般会使用latest(最新的)版本
docker pull centos:版本号 或者直接指定版本 现在我们查看一下镜像就会有东西了 docker rmi 镜像ID/标签 docker rmi centos
docker rmi -f centos:latest
如果提示镜像被使用需要先停止某个ID的容器那么要先删除容器再删除镜像。或者强制删除镜像。
正确做法先删除依赖该镜像的所有容器 再来删除镜像 重新加载daemon systemctl daemon-reload 重启docker systemctl restart docker 搜索镜像 docker search 镜像名称 2.操作容器 容器是Docker的另一个核心概念。简单来说容器是镜像的一个运行实例。 镜像是静态的只读文件而容器带有运行时需要的可写文件层同时容器中的应用进程处于运行状态 创建容器 docker create -it centos:latest
docker create -it --name centos01 centos:latest
centos:latest 即镜像名字:版本(或镜像ID)将使用指定镜像创建容器。另外Docker会检查本地是否
存在指定的镜像不存在就从公有仓库下载-it是两个参数-iinteractive容器具有交互功能-t容器将提供伪终端
--name指定生成的容器的名字允许空如果不指定会自动生成 查看当前的容器 docker ps
docker ps -a docker ps这个命令用于列出当前正在运行的容器。默认情况下它只显示正在运行的容器信息包括容器ID、镜像、创建时间、状态等。使用docker ps命令可以快速查看正在运行的容器的状态。 docker ps -a这个命令用于列出所有的容器无论其状态是正在运行还是已停止。它会显示所有容器的信息包括容器ID、镜像、创建时间、状态等。使用docker ps -a命令可以查看所有容器的完整列表包括已停止的容器。 列表字段名称 CONTAINER ID容器的唯一标识符。IMAGE创建容器时使用的镜像名称。COMMAND在容器中运行的命令。CREATED容器的创建时间。STATUS容器的状态例如运行中、已停止等。PORTS容器的端口映射信息。NAMES容器的名称。 启动、停止、重启容器 docker start 容器ID|name|name:tag
docker stop 容器ID|name|name:tag
docker restart 容器ID|name|name:tag 但是这样的方式也是十分的繁琐我们可以在创建的时候就为容器起个别名 然后我们就可以使用别名启动 删除容器 docker rm 容器ID
docker rm -f 容器ID
docker rm -f $(docker ps -aq) 进入容器 docker exec -it 容器ID/容器NAME /bin/bash
docker exec -it 容器ID/容器NAME bash (简写)
docker exec -it 容器ID/容器NAME sh (简写) docker exec -it 容器ID/容器NAME bash和docker exec -it 容器ID/容器NAME sh是两个Docker命令用于在正在运行的容器中执行交互式的Bash或Shell命令。它们之间的区别在于使用的默认shell不同。 docker exec -it 容器ID/容器NAME bash这个命令将在容器中执行交互式的Bash命令。Bash是一个功能强大的shell它提供了丰富的命令和功能适用于更复杂的脚本和操作。 docker exec -it 容器ID/容器NAME sh这个命令将在容器中执行交互式的Shell命令。Shell是一个更基本的命令行界面它的功能相对较少但足够处理常见的命令和操作。 一般来说如果你需要执行比较复杂的命令或操作或者需要访问更高级的功能和工具建议使用bash作为默认shell。如果你只需要执行一些简单的命令或操作并且不需要额外的功能和工具那么使用sh作为默认shell即可。 退出容器
退出时如果想继续运行容器按顺序按【ctrlp】【ctrlq】
如果不想继续运行按【ctrld】或输入exit
到这里我的分享就结束了欢迎到评论区探讨交流
如果觉得有用的话还请点个赞吧