【Docker】Docker安装入门教程及基本使用

Java方文山 2024-06-13 12:07:04 阅读 64

🎉🎉欢迎来到我的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 dockersystemctl stop dockersystemctl restart docker 开机自启

systemctl enable dockersystemctl 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 centosdocker rmi -f centos:latest如果提示镜像被使用,需要先停止某个ID的容器,那么要先删除容器再删除镜像。或者强制删除镜像。正确做法:先删除依赖该镜像的所有容器, 再来删除镜像 重新加载daemon

systemctl daemon-reload 重启docker

systemctl restart docker 搜索镜像

docker search 镜像名称

2.操作容器

容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。 镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态
创建容器

docker create -it centos:latestdocker create -it --name centos01 centos:latestcentos:latest 即镜像名字:版本(或镜像ID),将使用指定镜像创建容器。另外,Docker会检查本地是否存在指定的镜像,不存在就从公有仓库下载-it:是两个参数,-i:interactive容器具有交互功能,-t:容器将提供伪终端--name:指定生成的容器的名字,允许空,如果不指定会自动生成

查看当前的容器

docker psdocker 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:tagdocker stop 容器ID|name|name:tagdocker restart 容器ID|name|name:tag

但是这样的方式也是十分的繁琐,我们可以在创建的时候就为容器起个别名

然后我们就可以使用别名启动

删除容器

docker rm 容器IDdocker rm -f 容器IDdocker rm -f $(docker ps -aq) 进入容器

docker exec -it 容器ID/容器NAME /bin/bashdocker exec -it 容器ID/容器NAME bash (简写)docker exec -it 容器ID/容器NAME sh (简写)

docker exec -it 容器ID/容器NAME bashdocker 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即可。

退出容器  

退出时如果想继续运行容器:按顺序按【ctrl+p】,【ctrl+q】如果不想继续运行:按【ctrl+d】或输入exit

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。