Docker入门教程超级详细,从入门到实践,适合新手

大家有什么问题与建议直接在评论区说,或者可以直接私聊作者,只要能帮大家解决问题就行,作者都能够虚心接受!!!大家该提意见就提,不必拘束!!!作者看到的第一时间就给大家回复!!!

docker安装介绍

"纸上得来终觉浅,绝知此事要躬行"

"天下没有难学的技术"

docker简单介绍:

Docker是什么?

Docker 其中包括,镜像、容器、仓库,很简单,目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到“一次封装,到处运行”。

“一次封装,到处运行”。是不是有一股java的感觉,java的特点,一次编译,到处运行

肯定有人要问,为什么要给我们的虚拟机安装docker?

我们开发过程中,项目一般都是部署云服务器上面,我们在这里通过在 虚拟机上面安装,就是模拟在服务器上面部署我们的项目。

举个栗子:

一款产品从开发设计到上线运行,其中需要开发人员和运维工程师,开发人员负责代码编写,开发产品,运维工程师需要测试环境,产品部署。这之间就会有分歧。对于各个模块之间的协调问题。

比如我们开发一个电商项目,其中包括 Java 环境/Tomcat/ MySQL / JDBC 驱动包/相应 jar 包,还有SSM框架及搜索引擎Solr等技术,仅仅是在windows系统上协调这些项目的版本,保证环境不冲突及项目正常运行,就需要大量时间来调试,而我们技术人员往往在windows系统上开发及调试,那么上线的时候需要部署到linux系统中,这就会导致由于环境不同的产品部署问题。换一台同样操作系统的服务器,要移植部署依然很麻烦,那么为了解决这个问题,Docker就体现出了它的用处!

docker优点很多, 容器化环境一致性易于部署资源利用率微服务架构

这个理解需要对我们之前的学习要有的深刻的理解,才容易去理解这些专业名词。

因为我的可能理解会有出入,为了更好的给大家展示与理解,借鉴一部分其他博主写的。

借鉴很正常,不丢人,主要能把这个东西让学生掌握理解更重要!

以下是借鉴的:

1. 容器化

  • 轻量级: Docker 容器比传统虚拟机轻量,启动速度快,占用资源少。

  • 隔离性: 每个容器彼此隔离,避免了应用间的干扰。

2. 环境一致性

  • 开发与生产一致性: 开发人员可以在本地创建的 Docker 镜像中进行开发,确保在生产环境中运行的应用与开发环境一致。

  • 避免“在我机器上能跑”问题: 通过容器化,消除了环境配置差异带来的问题。

3. 易于部署

  • 快速部署: 使用 Docker,可以通过简单的命令快速部署和更新应用。

  • 版本控制: 可以轻松管理应用的不同版本,通过标签管理镜像。

4. 资源利用率

  • 高效利用资源: 多个容器可以在同一服务器上共享操作系统内核,减少资源浪费。

  • 灵活扩展: 可以根据需求快速扩展或缩减容器数量。

5. 微服务架构

  • 支持微服务: Docker 非常适合微服务架构,能够将各个微服务部署在独立的容器中,便于管理和扩展。

  • 服务发现与负载均衡: 配合工具(如 Kubernetes)使用时,能够实现自动化的服务发现和负载均衡。

6. 简化 CI/CD 流程

  • 持续集成与部署: Docker 可以与 CI/CD 工具(如 Jenkins、GitLab CI)集成,自动化构建、测试和部署流程。

7. 社区支持与生态系统

  • 丰富的生态: Docker 具有强大的社区支持和丰富的工具生态(如 Docker Compose、Docker Swarm、Kubernetes),可以帮助管理和编排容器。

8. 跨平台兼容性

  • 跨平台运行: Docker 可以在不同的环境中运行,包括本地开发环境、云平台和物理服务器,提供灵活性。

此内容需要建立在已经安装好centos7基础之上,如果各位看官需要centos7教学习安装,下期再出。

Docker -> 虚拟化容器技术。 Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间互相隔离。

不至于因为一个程序问题导致整个虚拟机崩掉。

用一幅图来说明一下吧,如下图所示:(这幅图是我网上找的,比较符合我们的教学)

大概介绍一下CentOS系统上安装和启动Docker,首先,确认系统内核版本大于3.10,然后通过YUM更新包并安装必要的工具。接着,设置Docker的仓库并安装Docker引擎。最后,启动Docker并验证其安装。

1.Docker要求CentOS系统的内核版本高于3.10

通过查询命令: 先进入哥们儿的虚拟机,在里面进行查看我们的内核版本,这个是小魏同学自己虚拟机上面安装的的版本号,如下图所示:

需要我们自己配置新的虚拟机,但是新安装的虚拟机我们要记住,首先要做的就是给新创建的虚拟机配置:

这个是我的电脑网络配置,每个人的都不一样,(192.168.xxx.xxx) 选择手动自行配置,以及通过自己电脑的安全设置关闭windows防火墙,以及虚拟机的防火墙进行关闭

当然了,我想肯定有同学要问,小魏同学,你为什么要关闭防火墙,目的是什么?

首先我们需要检查我们虚拟机的防火墙,通过查看防火墙的状态,当然啦,不要忘记,我们自己电脑的防火墙也需要在自己的windows中进行关闭。目的:防火墙可能会阻止某些服务或应用程序的正常运行,关闭它可以避免这种干扰。在网络调试过程中,关闭防火墙可以帮助快速定位网络问题,确保网络流量不被误拦截。

回归原题,我们继续进行虚拟机中防火墙的关闭,

1.查看我们的防火墙状态

指令: systemctl status firewalld

详细的讲解一下吧:提高小白的可阅读性

systemctl : systemctl    系统服务管理与控制

systemctl  :完整的书写  system control 系统控制管理

status:当前的状态,包括其运行状态、加载状态和相关信息。

firewalld: 字面意思 firewall daemon 动态管理防火墙的守护进程

这个可能新手不太明白,防火墙就防火墙吧,还再整一个守护进程,是嘛玩意儿?,因为我们的防火墙不可能让我们直接管理,而需要间接通过守护进程进行管理, 就像我们使用的windows系统进行操作我们的底层一样,底层的东西一般是不会让我们直接操作的,小魏同学再举个简单通俗易懂的例子就是:我们大家家里都有洗衣机吧,那么我们家洗衣机里面有很多控制器与导线,那么这些导线呢,我们每次洗衣服的时候,徒手操作这些导线与控制器,如果徒手操作这些导线是很危险的事情,保不准就漏电,轻者击伤,重者要命。其次如果我们直接操作洗衣机的底层,学习如何使用也比较麻烦,那么多的线头和控制器,谁看着不头大呢?连过来,连过去的说不定哪一下连的不对,就会烧坏元器件。所以工程师们开发的时候考虑到这一点,我们往往就是使用了封装的思想,暴露出接口,也就是洗衣机上面的供我们直接使用的按钮或者旋钮。

就像我们如果直接操作底层一样,可能我们一个不经意的操作对于系统可能造成瘫痪,电脑死机。

使用户失去耐心,这样对于厂家也是致命的打击。

好啦,我们回归正题:

通过上面的指令,我可以查看到,显示running 就需要我们自己关闭防火墙,因为新创建好的虚拟机就是需要我们手动关闭防火墙的

通过指令关闭防火墙

指令: systemctl stop firewalld

这个指令我们就不详细的讲解啦,上面已经把细节介绍到了

为了我们再次开发的方便,我建议直接一次给它设置开机不能自启

指令: systemctl disable firewalld

既然我们提到了关闭防火墙和不自启 那么,我想也得把重启以及自启的命令说一下:

开启防火墙:

指令: systemctl start firewalld

重启防火墙:

指令: systemctl restart firewalld

设置开机自启

指令: systemstl enable firewalld

最后一点也是最重要的一点,那就是一定要把电脑调成可联网状态下,如下图所示:

详细的讲解一下: cat /etc/sysconfig/network-scripts/ifcfg-ens33

cat :查看文件内容 。 说实话我不是特别理解,当时写这个命令的工程师是怎么考虑的:cat就是concatenate的缩写形式,正如我们所学的一样见名知意,我也查询了有道词典,如下图:

但是好像都与这个命令的英语意思不搭边,这个就是查看文件内容的命令。我怎么想也是和它的英文释义不搭边。也可能与我们的生活语言环境不同造成的吧!

接下来我们修改这个虚拟机的网络状态:

修改我们的网络配置:按一下i键,进入编辑模式,如下图所示

上图的最下面的那一行--insert--,就是提示我们已经进入到了编辑模式,小魏同学我已经修改配置a好啦。

为了方便大家操作文件内容附上图,如下图所示:

接下来就要配置我们的yum源,为什么要配置我们的yum源呢,通俗易懂一些:我的理解就是

1.下载速度:直接从官方源如 CentOS、Docker 的官方网站)下载时,可能会因为网络限制导致速度非常慢。

2.避免被墙:访问限制: 某些国外网站和资源在中国可能会受到限制,通过使用国内源可以避免这些问题。(中国翻墙违法

因为我们要给我们的虚拟机里面的安装下载,网络yum源通常在能连接互联网的服务器上进行配置,配置简单,可选择性强,能获取的包也更多。

vi /etc/docker/daemon.json

通过插入方式进行,添加这些yum源。

{ "registry-mirrors": [

"https://dockerproxy.com",

"DockerPull 镜像加速",

"https://docker.1panel.live",

"hpcloud.cloud",

"https://registry.docker-cn.com",

"http://hub-mirror.c.163.com",

"https://docker.mirrors.ustc.edu.cn",

"https://dockerhub.azk8s.cn",

"https://mirror.ccs.tencentyun.com",

"https://registry.cn-hangzhou.aliyuncs.com",

"https://docker.mirrors.ustc.edu.cn",

"https://registry.docker-cn.com",

"http://hub-mirror.c.163.com",

"http://f1361db2.m.daocloud.io",

"https://mirror.ccs.tencentyun.com",

"https://phtv51hj.mirror.aliyuncs.com",

"https://registry.docker-cn.com",

"http://hub-mirror.c.163.com",

"http://f1361db2.m.daocloud.io",

"https://mirror.ccs.tencentyun.com",

"https://phtv51hj.mirror.aliyuncs.com" ] }

强烈建议一定要配置国内的镜像:使用国内的镜像源(如阿里云、华为云、清华大学、中科大等)可以显著提高下载速度,减少安装和更新的时间。

这些镜像源建议:自己网上找,网上博主配置方法有很多,自己动手丰衣足食

还是提供一下吧:

就拿清华大学的镜像进行展示:

下图就是清华大学的镜像网站自己选择适合自己安装对应的虚拟机版本。

国内可用镜像

DaoCloud 镜像站

加速地址:https://docker.m.daocloud.io

支持:Docker Hub、GCR、K8S、GHCR、Quay、NVCR 等

对外免费:是

网易云

加速地址:https://hub-mirror.c.163.com

支持:Docker Hub

对外免费:是

Docker 镜像代理

加速地址:https://dockerproxy.com

支持:Docker Hub、GCR、K8S、GHCR

对外免费:是

百度云

加速地址:https://mirror.baidubce.com

支持:Docker Hub

对外免费:是

南京大学镜像站

加速地址:https://docker.nju.edu.cn

支持:Docker Hub、GCR、GHCR、Quay、NVCR 等

对外免费:是

上海交大镜像站

加速地址:https://docker.mirrors.sjtug.sjtu.edu.cn/

支持:Docker Hub、GCR 等

限制:无

阿里云

加速地址:https://<your_code>.mirror.aliyuncs.com

支持:Docker Hub

限制:需要登录账号获取CODE

中国科大镜像站

加速地址:https://docker.mirrors.ustc.edu.cn

支持:Docker Hub、GCR、Quay

限制:仅供内部访问

Azure中国镜像

加速地址:https://dockerhub.azk8s.cn

支持:Docker Hub、GCR、Quay

限制:仅供内部访问

七牛云

加速地址:https://reg-mirror.qiniu.com

支持:Docker Hub、GCR、Quay

限制:已关闭

Docker 中国官方镜像

加速地址:https://registry.docker-cn.com

支持:Docker Hub

限制:已关闭

步骤讲解

解决完下载上的问题,那么我们就要给我们的linux上进行安装docker容器,在docker中进行安装我们的一些开发常用的软件,就那我们常用的Mysql举例子吧

1、需要建立仓库 (准备工作)

安装Docker所需的一些工具包

指令: sudo yum install -y yum-utils

为了防止一些小白不懂,所以详细的讲解一下这个命令,总的来说就是,执行 sudo yum install -y yum-utils 命令可以安装一组增强 yum 功能的实用工具。

我们增强读者的可阅读性,详细的讲解一下,具体内容,

sudo :以超用户(root)权限执行后面的命令,允许用户进行系统级别的操作。

yum: 包管理工具,用于安装、更新和管理软件包。

install :这个我就不用说了吧,见明知意,安装的意思

-y : 在你安装过程中,自动回答“是”,安装过程无交互,说人话就是,在linux系统中,我们不用自己,回答yes,系统会帮我们自动回答y , 怎么让新人去理解这件事,对于我们windows的图形交互界面就是我们在安装软件过程中,是不是安装的时候提示安装到哪个盘,哪个位置,下一步,等,就像这样的点击过程,不需要我们自己亲自动手去操作的过程。安装过程无交互

yum-utils :一组实用工具,如 yum-config-manager、package-cleanup 等,帮助用户更好地管理软件源和包。

说实话,写起来真的好累啊!

2.安装添加软件源

将阿里云的 Docker 官方软件源添加到 CentOS 系统中,从而加快 Docker 的安装和管理过程。

命令:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

详细的讲解一下命令吧:

yum-config-manager :是一个用于管理 yum 包管理器配置的命令行工具,主要用于 CentOS

专门用于管理软件源的配置。它允许用户添加、删除或修改软件仓库。

--add-repo:添加软件仓库 (向包管理器添加新的软件源。) 见名知意:add添加 repository 软件仓库

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo:(说人话:就是 提供镜像源的网站)阿里云提供的 Docker 社区版(Docker CE)在 CentOS 上的镜像源 URL。它包含 Docker 的安装包及相关元数据。

3.安装docker

直接输入命令,为了安装 Docker 及相关工具:这个命令就是为了

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

下面小魏同学就开始来解释一下,这个命令,新手友好哦

sudo:以超级管理员的身份,(后面就是看你需要进行什么操作,比如说,你要安装某某软件,就是以超级管理员的身份安装某某软件)

yum: 一个包管理工具,用于在 Linux 发行版(如 CentOS)中安装、更新和管理软件包。

install:yum 的一个子命令,用于安装指定的软件包。

我是直接安装好几个组件,以下都是组件:

docker-ce:提供容器基础设施。 这个可能听不懂提供容器基础设施。

Docker Community Edition(Docker CE),Docker 的开源版本,提供容器化应用程序的支持。

docker-ce-cli方便用户通过命令行管理 Docker。

Docker 命令行工具,允许用户通过命令行与 Docker 引擎进行交互,执行各种 Docker 操作。

containerd.io:管理容器的底层组件,提高性能和效率。

Containerd 是一个高效的容器运行时,负责管理容器的生命周期,包括容器的创建、调度和运行。

docker-buildx-plugin:支持更复杂的构建需求。

Buildx 插件是 Docker 的扩展,提供多平台构建支持,允许用户构建适用于不同架构的镜像。

docker-compose-plugin:使得多容器应用的管理更加简单和结构化。 ​ Docker Compose 插件,用于定义和运行多容器 Docker 应用,通过 docker-compose.yml 文件配置应用的服务、网络和卷。

4.安装完docker之后,进行验证:


docker服务相关命令

查看docker的服务的运行的状态

# 查看docker服务的运行状态
systemctl status docker
​
# 启动docker服务
systemctl start docker
​
# 关闭docker服务
systemctl stop docker
​
# 重启docker服务
systemctl restart docker

查看docker的版本:

查看我们安装的docker的状态: dead状态 没有启动

启动docker并查看我们的docker状态: 在图片的274行,Active这一项我们可以看到我们docker已经运行。(running)

在操作systemctl status docker

之后我们可以看到这个docker之后我们可以看到,为了新手绝对的友好,

小魏同学讲解一下从272-280具体吧:

272:docker.service 指的就是 Docker 应用程序容器引擎的系统服务。

273-274:主要就是告诉我们 服务状态

273:Loaded: loaded (显示服务的加载状态,loaded代表,说明服务文件已经被识别并加载)

而后面所跟着的括号(/usr/lib/systemd/system/docker.servicedisabledvendor preset: disabled

这些参数被符号 ; 分隔开 我分别讲解一下吧

/usr/lib/systemd/system/docker.service     :

这是 Docker 服务的定义文件所在的位置。这个文件包含了如何启动和管理 Docker 服务的配置信息。

disabled   

这表示该服务未设置为开机自启。即在系统启动时不会自动启动此服务。

vendor preset: disabled   :

这是系统默认的预设状态,表示该服务在出厂时的预设状态也是禁用的。

274: Active: active (running) since 四 2024-09-12 15:35:17 +08; 7s ago

状态: active (running) 表示 Docker 服务当前正在运行。这意味着 Docker 守护进程已成功启动,并且可以处理请求。

时间: since 四 2024-09-12 15:35:17 +08: 四: 表示星期四,显示服务开始运行的具体星期几。 2024-09-12: 服务启动的日期。 15:35:17 +08: 服务启动的具体时间和时区(UTC+8)。

害怕新手不懂:UTC 的全称是 Coordinated Universal Time(协调世界时)。(UTC+8)表示协调世界时(UTC)东八区的时间,它是指比 UTC 时间快 8 小时的时区。

运行时长: 7s ago 表示该服务在 7 秒前刚刚启动。这有助于判断服务的运行时间,确认服务是否在正常运行状态。

275:Docs:文档链接

提供 Docker 官方文档的链接(Docker Docs),用户可以访问以获取更多信息和帮助。

276:Main PID: 10793 (dockerd)

我来解释一下吧:Main 主要的 PID 进程标识符 (process id ),是操作系统分配给每个正在运行的进程的唯一数字

从新手的角度去讲解一下吧,可能有些同学会问,这个操作系统是怎样给进程分配id的。

操作系统通过以下步骤分配唯一的进程标识符(PID)给每个正在运行的进程:

1. 进程创建

  • 当一个新进程被创建时,操作系统会分配一个新的 PID。通常,这个过程发生在调用系统调用(如 fork()exec())时。

2. PID 管理

  • PID 表:操作系统维护一个 PID 表,记录当前所有进程的 PID 及其状态。每个进程都有一个唯一的条目,包含其 PID 和其他相关信息。

3. 分配逻辑

  • 顺序分配:操作系统通常使用顺序分配策略,从一个预定义的起始值(如 1)开始分配 PID。每创建一个新进程,PID 就加一。

  • 循环使用:当 PID 达到最大值(通常是 32768 或 65536,取决于系统的实现),操作系统会返回到小的数字,前提是这些 PID 已经不再被使用。

当操作系统中的进程标识符(PID)数量达到最大值时,会影响新进程的创建。以下是对这一机制的详细解释:

1. PID 的范围

  • PID 的最大值: 不同操作系统对 PID 的最大值有不同的限制。常见的最大值有:

    • 32768: 一些较旧的系统或特定的配置可能使用这个值。

    • 65536: 许多现代 Linux 系统使用这个值,允许更多的并发进程。

2. PID 的分配机制

  • 顺序分配: 操作系统通常从 1 开始顺序分配 PID,每创建一个新进程,PID 就加 1。

  • 循环使用: 当分配到最大 PID 时,系统会回到最小的可用 PID。这种方式确保 PID 的使用效率。

3. 检查可用性

  • 进程结束: 当一个进程结束时,其 PID 被标记为可用。这意味着,如果 PID 达到最大值,系统必须确保有足够的 PID 被释放,以便可以分配给新的进程。

4. 系统配置

  • 可配置的最大值: 操作系统通常允许管理员通过配置文件或命令设置 PID 的最大值。例如,在 Linux 中,可以通过 /proc/sys/kernel/pid_max 来查看和修改最大 PID 值。

5. 影响

  • 资源限制: 限制最大 PID 数量有助于防止系统资源耗尽,但也可能在高负载情况下造成限制,影响新进程的创建。

  • 性能考虑: 过低的最大 PID 值可能导致频繁的 PID 重用,增加管理开销。

总结

PID 的最大值是操作系统设计中的一个重要考虑,目的就是为了有效管理进程和系统资源。通过合理配置和管理 PID,操作系统能够在高并发环境中正常运行。

4. 冲突避免

  • 检查可用性:在分配新的 PID 之前,操作系统会检查该 PID 是否已被分配给其他进程。如果该 PID 已被使用,系统会继续寻找下一个可用的 PID。

5. 释放 PID

  • 当进程结束时,操作系统会释放其 PID,使其可以被后续的新进程重新使用。这通常在进程的退出过程中完成。

277行: Tasks:10 10 表示当前 Docker 服务正在管理的任务数量

278行:Memory :131.2M 131.2M 代表 Docker 服务当前使用的内存量。

279行: CGroup: /system.slice/docker.service (CGroup Control Group 见名知义 控制组,是 Linux 内核的一项功能,用于限制、监控和隔离进程组的资源使用。)

/system.slice/docker.service 是该服务的控制组(CGroup),用于管理和限制资源(如 CPU ,内存,IO)的使用。

说的通俗易懂一些就是说:举个例子吧,就拿封建社会举个例子吧,皇上 ,不对每一个百姓实行直接管理,而是通过手底下的大臣,进行逐级管理,皇上呢,假如说有外敌入侵,皇上需要什么资源呢,不是说直接问老百姓征收,而是通过大臣们进行逐级征收。

这个比喻对应我们开发者:就是说我们系统使用者呢,有什么需求,通过这个CGroup进行管理与控制。

280行:

280行: └─10793 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

小魏同学就按照小白的角度去解析:280行号:10793 就是说我虚拟机的进程的pid标识符 也就刚刚上面小魏同学所提到的,这个是系统给我们提供的,不是我们

/usr/bin/dockerd: Docker 守护进程的可执行文件路径。

-H fd://: 用于指定 Docker 守护进程的监听地址。

--containerd:指定 containerd 的套接字路径。

对于- 以及--详细的介绍,引用其他博主写的:

Linux中命令选项及参数简介 - QiaoZhi - 博客园登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments)。即Linux中命令格式为: command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数,但有的命icon-default.png?t=O83Ahttps://www.cnblogs.com/qlqwjy/p/7787156.html

/run/containerd/containerd.sock: 这是 containerd 的 linux 套接字文件路径。

Docker 守护进程能够与 containerd 进行通信,从而管理容器的创建、运行和停止等操作。

为了方便新手理解:可能有人会问,小魏同学, 你说的containerd 的 linux 套接字文件路径是什么鬼东西?零基础的同学可能认为,小魏同学你这突然扔了颗核弹,哈哈哈,难免的,毕竟咱是零基础的同学。

我们就从套接字开始讲起吧:什么是套接字(Socket)

我们先从英语释义开始了解吧,我感觉这个话题,会越提越多,根本聊不完,比较费时间。一提到套接字,必定与数据通信就离不开啦,对于新手来讲,比较陌生,所以讲起来比较麻烦,我们慢慢的讲,不急

将docker设置为开机自启

搜索远程镜像

重要的事情说三遍,题主小魏同学在搞的时候,也很较真儿,这个是远程,大家就不要search啦

**不要通过远程获取镜像,不要通过远程获取镜像,不要通过远程获取镜像**

白浪费时间,我刚开始以为没有装配好。

docker search 镜像关键字 docker search redis

上面这个就当没有看到过,知道就行啦。我们不采用这种方式来获取镜像。

我们要拉取一个镜像,给各位看官演示一下:

我们拉取nginx的镜像,同时我们也查看了docker images 查看一下我们的镜像,

对啦,我这个拉取的方式是默认的拉取方式,自动拉取最新版本的镜像。

为了在我们实际生产环境中,需要的版本也不同,所以说,根据我们的具体需求,进行下载合适

pull我们所需版本的nginx版本: 格式: docker pull nginx版本号

删除我们的镜像

也有删除不掉的镜像,删除我们正在使用的镜像,通过强制执行删除

我们先做这个前置操作,来验证我们的说法:

对下面这个命令进行讲解:docker run hello-world

这个命令的执行过程,我们讲解一下,知其然,知其所以然。

就拿我们我下图中的作为一个例子,执行过程就如图所示。

行号632号:docker run hello-world

一般来说,我们都是先下载,后运行,当然啦,也可以直接运行(在执行运行命令过程中,我们确实没有下载,这个Docker主机也会帮我们下载,接着帮我们运行)

我们在 docker-client就是我们所写命令的地方, docker-client之后呢,就发送给Docker daemon处理之后,就优先在本地镜像里面找,找不到就去应用市场下载,下载之后,就在本地容器中进行运行这个应用进程。

创建容器:Docker 会基于指定的镜像创建一个新的容器实例。,运行容器:启动创建的容器,并执行镜像内的默认命令。

查看我们本地的镜像:

删除我们刚刚运行在容器中的镜像,

行号695:我们进行删除镜像,但是这个镜像被加载到容器中,所以说没法直接删除这个镜像。

小魏同学为了让各位看懂,并理解:我举个例子吧,,比如说我们在编辑文档过程中,我们没有关闭这个文件,直接去删除这个文档,我们win系统会提示我们,你有一个进程正在被使用。

现在好理解啦吧,嘿嘿

也不是说我们就没有办法处理啦,可以通过强制关闭

小魏同学,先来解释一下命令吧!

这个我们是删除镜像,不是容器哈!别搞错啦,新人容易搞错的地方

docker : Docker 的命令行工具,用于与 Docker 引擎进行交互。

rmi: remove image 去除镜像

-f : force 强制

hello-world :文件名

上面我们就完成了,镜像基本的下载,运行,删除,基本完成

接下来我们要对镜像操作,就不得不提到容器,我们刚开就删除容器是因为我们之前上一步 操作

删除容器

docker rm 容器名称/容器的id # 删除容器

与上面一样,如果想删除正在运行的容器,可以通过添加-f参数进行实现。

删除所有的容器

docker rm $(docker ps -aq)

之后我们进行查看我们的容器以及镜像:

正如我们所预测的一样。

解释一下命令吧:

行号760: 表示 查看正在运行的容器

docker ps

process status(指活跃的容器)

行号762:表示查看所有容器

docker ps -a

process status all(所有容器)

下载完镜像,那么接下来就要进行启动容器啦,这个是我网上找的图

这个里面使用蓝色进行标记的标签,就是我们这几个里面比较复杂的,它不是难学,就是复杂!

小魏同学我只想说: 天下哪有难学的知识,只有垃圾的授课者!!!

就像我刚接触算法的时候,我就跟我的老师王淑礼教授说,我:这个好难啊,孩子学不会啊。

我的老师王淑礼教授:再难的算法,也是人想出来的。(老师说的大概就是这个意思,鼓励我们班同学)

以后哪些老师说你,智商不行,这个样的老师可以直接拉黑,这种人不是蠢就是坏!!!

我认为学习好就是本来就是 : 作息+有效的学习方法+会教学的老师+个人行为习惯+明确目标+时间管理+执行力

我们开始步入正题:

我们如果不知道这些命令是如何使用的呢,也不是什么如果,对于新人来说哪有什么如果,就是不知道!

我们就拿我们现在要学习的第一个进行举例说明:

docker run 指令的使用:

行号791: docker run --help

通过上面这个指令我们就可以查看出,具体都有什么可以直接操作详细规格说明,一些老师会说自己看看指令,就会啦!说的轻巧,但是这个help太重要了,是学生们未来不管是工作还是学习中的词典一样,就像我们小时候不会查字典,我们老师就会教我们如何正确的使用字典一个道理。

突然整个这,你给新学的学生,你让 他/她 如何去看懂?授人以鱼,不如授人以渔

然后再搞个bug ,卡他们好长时间,很有可能会造成,从入门到如土,本身计算机的学习难度就大,孩子们的精气神都被磨光啦!

虽然是小问题,但是有没有一种可能就是,因为这种类似的毫不起眼的“小”问题,就会让我们学生止步不前。

加上课程体量本身就大,课上可能还记得好好的,下课吃完饭,早都抛在脑后啦,相当一大部分学生都忘了,去查怎么使用这件事儿啦。

我们开始进行分析:

行号793:Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

这个就得耐住性子去分析,通过计算机技术想多赚钱,就得耐住性子,没办法!!!

但是限于这个指令确实庞大,小魏同学认为,主要是教会大家如何查字典,掌握一些实际开发中常用的,其他不常用的,以后自己不会可以找百度,基本语法都会啦,用起来也会称心应手啦。基本就能把语法掌握。

Uage:用法

docker run :这两个单词就是镜像运行的基本语法,记住就行

docker: 这是 Docker 的命令行工具,用于与 Docker 引擎进行交互。(参考上面我找的图) run: 这是一个子命令,用于创建并启动一个新的容器。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

这里面 [OPTIONS] [COMMAND] [ARG...] : 这几个中括号,看着吓人其实没啥,这几括号所在位置,可写可不写,根据你的具体需求来写,比如说上面的这个指令,我们改写成 :docker run image的tag/image id

[OPTIONS] [COMMAND] [ARG...] :这些中括号记清语法位置

[COMMAND] [ARG...]:需要什么样的启动命令,以及后面说需要的参数项

我害怕还是没有说明白,[COMMAND]:command 代表命令,指令 以什么样指令方式去启动我们的镜像

[ARG] : arguments 启动参数

说是实话这个我们都用不上。 [COMMAND] [ARG...]这两个是我们下载的镜像都有他自己的启动命令,除非我们要改变它的默认启动行为

我只需要操作这个[options] 即可。

接下来我们启动 docker run nginx:1.26.0

是可以看到已经运行啦,但是这种运行方式并不是我们所喜欢的启动方式,在这个启动方式,影响我们窗口的输入命令,没法儿输入,我们也可以通过辅助窗口的操作,进行规避,但是总不能我运行一个镜像我们就复制一个窗口,这样就不太合适,这时候我们刚刚学习的【options】就派上用场,通过在命令中加入 -d 分离模式,后台运行即可。

接下来我们中断这个操作,停掉这个容器,

我们以-d形式,启动我们的我还顺带给这个容器起了有一个别名叫 mynginx , 为容器指定一个名称 mynginx,方便后续管理。指定要使用的镜像及其标签(版本)

查看一下我们容器的进程

这个列名详细介绍一下

CONTAINER ID :容器的唯一标识符。

IMAGE :容器所基于的镜像名称和标签。

COMMAND :启动容器时执行的命令。

CREATED :容器创建的时间。

STATUS :容器的当前状态,例如是否正在运行。

PORTS : 显示容器内部的端口以及任何映射到主机的端口。

我们这里显示的 80/tcp

端口是用于标识特定进程或服务的数字。HTTP 服务通常使用 80 端口。

tcp连接

NAMES:容器的名称,便于识别和管理。

还有要记住我们容器的名字,我们之前的指令取的,正常情况下,这个名字都是随机取的

当看到 docker ps 的输出为空时,表示当前没有正在运行的容器。

下面我们这个是有容器的:

关闭容器

查看运行的进程

刚刚我们关闭的容器的id开头508a855f1858 ,重启的时候使用508开头,就可以重启服务,如下图,可能有朋友会问,为什么这个容器可以通过这个id号,进行重启,因为每个 Docker 容器都有一个唯一的 ID,这个 ID 是 Docker 记录容器状态和元数据的关键,Docker 容器在运行时会创建一个独立的文件系统和进程环境。当我们关闭(停止)容器时,该容器的文件系统和状态仍然保留在 Docker 的存储中,容器使用了数据卷(volumes),即使容器被停止或删除,数据仍然会保留在宿主机上。这使得在重启容器时,可以访问到之前的持久化数据。

我们再启动之后,可以查看一下进程,我们启动成功,可能有人会问为什么,这个你怎么确认这个是不是以前的,

在下面这个字段,就是created 就已经可以知道,这个进程在46分钟前已经被创建。证毕

我们还可以通过重启,启动进程

我们查看一下这个进程状态,可以看出当前进程的对虚拟机资源的使用状态,它会一直刷新,我们通过ctrl + c

退出。

1030 行 docker logs 508 查看一下日志,日志有点长,我节选了一部分。开头一部分,结尾一部分,

查看一下我们虚拟机的ip地址以及端口号,尝试连接

使用网页访问,我们发现并不能访问。需要我们进行处理,先讲解一下,我们需要先映射一下,需要虚拟机端口号与容器中进程的端口号之间的映射关系。我使用的是80端口号进行映射80端口号,与下面图片不一样。下面的图片就是为了大家能够理解容器内部进程。通过图片,我们可以看出容器里面也是一个轻量化的linux系统,里面安装我们需要运行的软件了。

在没有进行端口映射之前,我们访问虚拟机的ip地址,结果如下:

第1164行 docker rmi -f 508 ,用于强制删除指定的 Docker 镜像。

将之前的镜像进行删除, -f之前也讲解过啦,可以强制删除正在运行的镜像。

我们行号1166这段命令想要执行,那么就需要将之前的运行的进程先关闭,需要这个前置操作。

行号1166:docker run -d --name mynginx -p 80:80 nginx:1.26.0

详细解释: docker镜像的运行,以后台方式进行运行,--name并给容器指定名称 我们还是命名成mynginx

-p端口号之间的映射,80:80之间的 端口进行映射,这样我们可以通过访问宿主机的 80 端口来访问容器内的 Nginx 服务。

nginx:1.26.6 镜像名称及其版本 版本号必须要带上,因为我们使用的不是最新版.

一旦容器成功运行,你可以在浏览器中访问我们进行访问,就可以访问啦:如下图将会看到 Nginx 的欢迎页面。

这个默认界面是可以修改的。我们接下来开始演示一下:

小魏同学详细解释一下命令:把

我们把页面改啦!这个html页面里面的元素也向大家展示一下吧:

就可以查看我们安装的软件默认首页里面的页面元素,真的泰多啦,解不解释一下?

既然讲到了,我们就不辞辛劳的讲一下吧,毕竟我们是全栈工程师。

那就将页面元素的标签开始讲起吧

<!DOCTYPE html>
<   这个是文档类型声明,告诉浏览器该文档是一个 HTML5 文档。它帮助浏览器以正确的方式解析和渲染网页。 >
​
<html>
<   <html>这是 HTML 文档的根元素,所有其他元素都应包含在其中。   >
​
<head>
​
 <文档的头部,包含关于文档的信息,比说,标题,样式和元数据>
    <  可能新人对这个不理解什么标题样式?什么元素据?    标题  见明知意,title不就是我们的标题,就是喽>
<title>Welcome to nginx!</title>
​
        《style  就是样式,它展示的时候还是比较人性化的,通过标签,样式里面可以对网页的外观和布局进行控制 》
        
<style>
<允许浏览器自动为页面选择明亮或黑暗的色调,取决于用户的系统设置。>
html { color-scheme: light dark; }
​
 设置主体的宽度为 35 个字母的宽度(em 是相对单位)。    
 margin: 0 auto;: 使页面水平居中。
body { width: 35em; margin: 0 auto;
 
 
//font-family: Tahoma, Verdana, Arial, sans-serif;    : 指定文本的字体家族,使用 Tahoma、Verdana、Arial,若这些字体不可用,则使用默认的无衬线字体。
 
font-family: Tahoma, Verdana, Arial, sans-serif; }
​
</style>
​
</head>
     
     
//<body>文档的主体,包含实际显示的内容。
 
<body>
​
//   标题标签  :一个一级标题,通常用于显示网页的主标题。这里的内容是 "Welcome to nginx!"
 //刚刚我们修改就是一级标题,并且将其他的都覆盖啦!
<h1>Welcome to nginx!</h1>
​
 //<p>  段落标签:通常成对出现,这一对标签内部的英文句子会被展示到页面。
 //要记住了,页面的
<p>If you see this page, the nginx web server is successfully installed and
​
working. Further configuration is required.</p>
 //和上面一样,都段落标签,只不过在这个段落标签里面,还
<p>For online documentation and support please refer to
​
 //a标签结束标签:<a> 是锚点(anchor)标签,当然了,href 可能没有学过的有点陌生,这个呢,算啦,我们先解释英文释义吧!          超文本引用/超链接(hypertext reference)  
 创建超链接。
 //</a> 是锚点标签的结束标记,表示链接的内容到此结束。
 //    <br/>  换行符号  break的缩写    但是具体的含义是表示换行(break line)
<a href="http://nginx.org/">nginx.org</a>.<br/>
​
Commercial support is available at
​
<a href="http://nginx.com/">nginx.com</a>.</p>
//下面这些上面已经解释过啦,就不继续解释啦!
<p><em>Thank you for using nginx.</em></p>
​
</body>
​
</html>
​

这个是我们修改首页之前里面的页面元素:

这个是我们修改首页之后里面的页面元素:

<h1>Hello,Docker</h1>

下面我们将要将我们发布一下:将我们改写好的页面,进行发布,这个被下载后,访问默认的页面,就会变成我们现在所写的界面。我们这个过程主要教会大家理解这个发布过程,这个是我们要掌握的要点。不能本末倒置!

通过docker commit --help来查看我们的命令

先看一下,下面的图片

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

小魏同学来说一下吧:担心一些读者的水平有限:

docker 就不做解释啦,commit 提交 [OPTIONS] 像“ [OPTIONS]” 这样就是可选可不选 CONTAINER 容器

[REPOSITORY[:TAG]]              注释:       repository 仓库 : tag 标签

Create a new image from a container's changes

我翻译的可能不标准:从一个容器的改变中创建一个新的镜像。

Aliases: docker container commit, docker commit

Aliases: 别名的复数(alias)

docker container commit, docker commit

docker容器的提交,docker的提交

options:选择项

-a/--author

-c/--change Apply Dockerfile instruction to the created image 应用Dockerfile中的指令创建

-m/--message 提交的信息

-p/--pause 暂停

docker commit -m "update index.html" mynginx mynginx:v1.0

第一个mynginx是容器 就是之前我们把容器名改啦,所以就是mynginx,而对于mynginx:v1.0镜像就是镜像名以及版本号 这个都是我们自己命名的

查看一下我们所有的镜像,我们会发现我们的镜像已经保存就是这个v1.0.

对我们修改过的index.html的镜像进行保存。我们是以压缩包的形式保存的,可能有人会问为什么以压缩包的形式保存,因为接下来我们需要模拟在另一个虚拟机安装我们的docker镜像,所以需要在一个什么都没有安装的docker上面进行安装。

接下来我们讲解一下这个命令:docker save -o mynginx.tar mynginx:v1.0

总的来说就是:这条命令的作用是将名为 mynginx、版本为 v1.0 的 Docker 镜像保存为一个名为 mynginx.tar 的 tar 文件。 我们通过这种方式用于将文件备份,传输或者共享。 类似于我们经常操作的 打包(计算机术语) 。不是吃饭的打包。不说还好,一说确实有那个味儿。

docker save :将指定的镜像

-o mynignx.tar : -o 就是指 --output的简写,指定文件的名称 文件名:mynginx.tar 是保存镜像的文件名以及文件格式为 tar mynginx:v1.0 : 镜像的名称,镜像的标签,通常用于标识特定版本

以上我们完成了,docker镜像的保存

接下来,我们就需要进行卸载我们所安装的容器

先查看一下我们的所运行的进程,发现什么也没有,因为小魏同学的电脑中间关过机。

查看所有容器,我们发现这个容器已经停止运行啦

上面的那幅图,我发现有点糊,所以从里面截取了一部分,看下图的STATUS,我们可以发现这个状态是离开的

所以,为了和大家保持一致,会再次运行这个容器。

为了方便大家使用这个卸载,我们先查看一下我们的运行的容器和镜像

我们发现在行号为( 81,82 )有两个状态为Exited: 这个Exited代表: 容器已经完成其任务并正常退出,或者由于某种错误而终止。此时,容器不再运行,但它的文件系统和数据仍然存在。

83行 我们查看了一下我们的镜像docker images

85,86 就是下载的镜像以及我们自己命名的镜像

我们又重启了这两个镜像,,查看了容器的状态。

UP状态,就是容器正在执行其内部的应用程序或命令,处于活动状态,可以接受请求或执行任务。

现在咱们电脑上面的运行的容器,现在我们的容器状态差不多啦!

接下来我们删去docker里面所有的容器。最后查一下 ,啥都没有,确认成功

接下来我们开始删除镜像,还是老套路,先查看一下我们的镜像

110行 将 两个镜像移除 通过镜像id

移除完,我们再次确实是否已经移除,查看一下,进行确认

接着查看一下我们的压缩包:

在行号128我们准备使用docker load指令,在使用之前我们还是采用--help来查看命令如何使用,通过上面几次的分析,我们现在基本上掌握了像"查字典一样去查我们的命令的帮助",如果下面还是陌生,建议再回顾一下。

docker load -i mynginx.tar

这个命令的功能:命令会从指定的 tar 文件中提取 Docker 镜像,并将其导入到 Docker 本地镜像库中。

docker:我们就不做任何的解释啦

load: Docker 命令中的一个子命令,用于加载镜像。

-i: 这一个选项,代表

mynginx.tar:就是我们之前压缩的包的文件名

注意一下:为了教程的严谨,昨天我特意查了一下这个文件名究竟是什么意思

,以后一定要记清楚哦!

下面这行命令已经将image导入到本地库,导入成功

查看一下我们的镜像,存在一个标签为v1.0的mynginx镜像

查看一下容器所有进程(包含休眠的进程),发现什么都没有,这验证了我们这个镜像还没有运行。

下面我们以后台运行,并给容器命名一个新名字app01 -p 80:80 将虚拟机的80端口映射容器的80端口,这样就可以让外部发送的请求通过宿主机的80端口访问容器内的应用啦!

行号158: 创建一个名为 app01 的新容器,并使用 mynginx:v1.0 镜像启动它,容器会在后台运行,命令行会立即返回控制权,容器内的应用(在这里是 Nginx)可以通过主机的 80 端口访问。

因为篇幅过长,害怕大家会忘记,之前在我们压缩之前呢,已经修改过容器里面mynginx,所以我们保存的镜像,与我们修改过的页面保持一致。所以默认页面还是Hello,Docker.

开始登录docker账号,想要将我的镜像发送到docker仓库,但是登录不上,受国内网络影响,被墙

小魏同学,只能在网页内登录我的docker账号。

登录成功,clevergz

点击这个

点击Repositories,就是我们的docker仓库,可以发布我们的镜像。

为了方便教程的使用,和大家保持一致,清空了我的仓库。

本以为可以通过虚拟机里面进行操作,但是登录都是一个事儿。

后续等我解决这个问题,继续续更!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值