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

🎉🎉欢迎来到我的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:是两个参数,-i:interactive容器具有交互功能,-t:容器将提供伪终端
--name:指定生成的容器的名字,允许空,如果不指定会自动生成

  • 查看当前的容器
docker ps
docker ps -a

  1. docker ps这个命令用于列出当前正在运行的容器。默认情况下,它只显示正在运行的容器信息,包括容器ID、镜像、创建时间、状态等。使用docker ps命令可以快速查看正在运行的容器的状态。

  2. 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 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

请添加图片描述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341837.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点:如果是全库导出导入的话,目标数据库没有的表空间我们要事先创建&#…

HarmonyOS@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

Observed装饰器和ObjectLink装饰器:嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数…

应用在LCD显示器电源插头里的氮化镓(GaN)MTC-65W1C

LCD(Liquid Crystal Display)显示器是利用液晶显示技术来进行图像表现的显示装置,从液晶显示器的结构来看,无论是笔记本电脑还是桌面系统,采用的LCD显示屏都是由不同部分组成的分层结构。LCD显示器按照控制方式不同可分…

【gpt4 8k 免费使用】Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台

Coze 快速开始 | Coze Welcome to Coze Coze 是什么? Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上。…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念:具有语义的人脸区域,如嘴、鼻子、眼睛。 二、研究目标 1.验证假设,并…

Qt框架学习 --- CTK

系列文章目录 文章目录 系列文章目录前言一、准备阶段二、使用介绍1.核心思想2.源码2.1.框架部分资源目录树2.2.框架部分源码2.3.插件部分资源目录树2.4.插件部分源码 3.文件结构4.运行效果 总结 前言 随着开发的深入,CTK框架还是要关注一下。了解CTK还是有必要的。…

陶瓷碗口缺口检测-图像获取与图像复原

图像获取 在陶瓷产品传送带上安装数据采集设备,如工业摄像头,进行图像数据采集。为提高陶瓷的检测精度,同时考虑到开发成本等问题采用高精度的CMOS工业摄像头进行数据采集。对图像进行灰度化处理, 图a为采集到的原彩色图像&#…

如何使用提示压缩来削减 RAG 80% 成本

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:How to Cut RAG Costs by 80% Using Prompt Compression 原文地址:https://medium.com/towards-data-science/how…

Linux文件系统的层次结构、每个目录的含义、文件属性以及文件中第一列的第一个字符的含义

1.Linux文件系统的层次结构 在Linux操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的导致的树状结构: 5.Linux系统的目录解析 (1)/bin bin是Binary的缩写,这个目录存放着最经常使用的命令。 &#x…

UIUC CS241 讲义:众包系统编程书

原文:angrave/SystemProgramming 译者:飞龙 协议:CC BY-NC-SA 4.0 欢迎来到 Angrave 的众包系统编程维基书!这个维基是由伊利诺伊大学的学生和教师共同建立的,是伊利诺伊大学 CS 的 Lawrence Angrave 的众包创作实验。…

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试

文章目录 前言FreeSql 简单连接数据库服务不存在没装FreeSql.All装了FreeSql.All安装包选择 DBFirst安装命令行生成器生成Bat创建脚本 基于Sqlite的Code Frist文件夹自动导出到Debug目录Sqlite 数据库安装和创建Sqlite连接数据库自动增列增表测试增列删列改列名同名列改属性 Co…