当前位置: 首页 > article >正文

Docker入门及基本概念

让我们从最基础的概念开始逐步理解。假设你已经准备好了docker 环境。

第一步,让我们先通过实际操作来看看当前系统中的镜像(images)和容器(containers)状态:

docker images    # 查看所有镜像
docker ps -a     # 查看所有容器(包括未运行的)

输出结果:

REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
linqiu1199/trae2api        v1.0.1    0d72ae59193b   4 days ago    20.4MB
rustdesk/rustdesk-server   latest    9227b43758be   4 weeks ago   12.8MB
mysql                      latest    3e34946bc4c4   4 weeks ago   797MB
hello-world                latest    74cc54e27dc4   4 weeks ago   10.1kB
redis                      latest    fa310398637f   6 weeks ago   117MB
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                             COMMAND                   CREATED        STATUS                    PORTS                                                  NAMES
4fa63eb76d16   linqiu1199/trae2api:v1.0.1        "./main"                  16 hours ago   Up 3 hours                0.0.0.0:17080->17080/tcp, :::17080->17080/tcp          trae2api
25e6b341f3cb   rustdesk/rustdesk-server:latest   "hbbs"                    10 days ago    Exited (0) 18 hours ago                                                          hbbs
239edf233492   rustdesk/rustdesk-server:latest   "hbbr"                    10 days ago    Exited (0) 18 hours ago                                                          hbbr
84fbae57a78c   redis                             "docker-entrypoint.s…"   12 days ago    Up 3 hours                0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
48b0ee678e43   mysql                             "docker-entrypoint.s…"   12 days ago    Up 3 hours                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost ~]# 

镜像(Images)和容器(Containers)的关系:

举一个很好的例子 - redis:

镜像:您系统中有一个 redis (latest) 镜像,大小为 117MB
容器:基于这个镜像运行了一个容器(ID: 84fbae57a78c),正在运行中(Status: Up 3 hours)

让我们通过一个实际操作来理解这个关系。我建议执行以下命令来创建另一个 redis 容器:

docker run --name redis-test -d redis

执行这个命令,然后再次运行:

docker ps -a
  • 同一个镜像可以创建多个容器
  • 每个容器都是镜像的运行实例

有点类似与JavaSE 中的 类和对象,让我用面向对象的概念来进一步解释:

镜像(Image) => 类(Class)

  • 是一个模板
  • 包含了所有必要的代码和依赖
  • 是只读的
  • 可以被多次使用来创建不同的容器
  • 不能直接运行,需要实例化成容器

容器(Container) => 对象(Object)

  • 是镜像的运行实例
  • 有自己的状态和数据
  • 可以启动、停止、删除
  • 多个容器可以基于同一个镜像创建
  • 每个容器都是独立的运行环境

让我们通过实际操作来验证这个概念:

# 基于同一个 redis 镜像再创建一个容器,但使用不同的名字和端口
docker run --name redis-test2 -d -p 6380:6379 redis
  • 执行这个命令的时候,你是否会有这样的疑惑呢?由于之前在Docker装过了redis,在主机端口,设置了6380, 这样避开了6379 端口。是考虑到的,但是 容器端口 还是 6379 这样合理吗?

答: 这里的关键点是:

  1. 容器是完全隔离的环境,每个容器都有自己的网络空间
  2. 不同容器可以使用相同的内部端口(6379)
  3. 宿主机的端口不能重复

然后查看结果:

docker ps -a | grep redis
oot@localhost ~]# docker ps -a | grep redis
a31ec1598cf9   redis                             "docker-entrypoint.s…"   9 seconds ago   Up 8 seconds              0.0.0.0:6380->6379/tcp, :::6380->6379/tcp              redis-test2
84fbae57a78c   redis                             "docker-entrypoint.s…"   12 days ago     Up 4 hours                0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
[root@localhost ~]# 

执行后,应该能看到多个 redis 容器(对象),但它们都是基于同一个 redis 镜像(类)创建的。

docker run & docker start

  1. 先查看当前系统中所有的容器状态,包括已停止的容器。请执行以下命令:
docker ps -a 
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                             COMMAND                   CREATED         STATUS                    PORTS                                                  NAMES
a31ec1598cf9   redis                             "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes              0.0.0.0:6380->6379/tcp, :::6380->6379/tcp              redis-test2
4fa63eb76d16   linqiu1199/trae2api:v1.0.1        "./main"                  16 hours ago    Up 4 hours                0.0.0.0:17080->17080/tcp, :::17080->17080/tcp          trae2api
25e6b341f3cb   rustdesk/rustdesk-server:latest   "hbbs"                    10 days ago     Exited (0) 18 hours ago                                                          hbbs
239edf233492   rustdesk/rustdesk-server:latest   "hbbr"                    10 days ago     Exited (0) 18 hours ago                                                          hbbr
84fbae57a78c   redis                             "docker-entrypoint.s…"   12 days ago     Up 4 hours                0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
48b0ee678e43   mysql                             "docker-entrypoint.s…"   12 days ago     Up 4 hours                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost ~]#
  1. 下一步,我们将使用 docker run 命令来创建一个新的容器。请执行以下命令:
docker run --name new-redis -d -p 6381:6379 redis

这个命令会基于 redis 镜像创建并启动一个新的容器。

执行完后,请再次运行 docker ps -a,是否看到了一个名为 “new-redis” 的新容器,以及它的状态如何。

AINER ID   IMAGE                             COMMAND                   CREATED         STATUS                    PORTS                                                  NAMES
751466ad80a1   redis                             "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds              0.0.0.0:6381->6379/tcp, :::6381->6379/tcp              new-redis
a31ec1598cf9   redis                             "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes              0.0.0.0:6380->6379/tcp, :::6380->6379/tcp              redis-test2
4fa63eb76d16   linqiu1199/trae2api:v1.0.1        "./main"                  16 hours ago    Up 4 hours                0.0.0.0:17080->17080/tcp, :::17080->17080/tcp          trae2api
25e6b341f3cb   rustdesk/rustdesk-server:latest   "hbbs"                    10 days ago     Up About a minute                                                                hbbs
239edf233492   rustdesk/rustdesk-server:latest   "hbbr"                    10 days ago     Exited (0) 18 hours ago                                                          hbbr
84fbae57a78c   redis                             "docker-entrypoint.s…"   12 days ago     Up 4 hours                0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
48b0ee678e43   mysql                             "docker-entrypoint.s…"   12 days ago     Up 4 hours                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost ~]# 

总结一下关键点:

  1. docker start (我们用在 hbbs 容器上):

    1. 启动了一个已存在但停止的容器
    2. 没有创建新的容器
    3. 容器 ID 和名称保持不变

  1. docker run (我们用来创建 new-redis):

    1. 创建了一个全新的容器 (ID: 751466ad80a1)
    2. 自动启动了这个新容器
    3. 使用了我们指定的名称 (new-redis)
    4. 映射了新的端口 (6381)

下一步,让我们更深入地理解这两个命令的使用场景。请尝试以下操作:

  1. 停止 new-redis 容器:
docker stop new-redis
  1. 然后尝试使用 docker run 再次创建一个同名的容器:
docker run --name new-redis -d -p 6381:6379 redis
[root@localhost ~]# docker run --name new-redis -d -p 6381:6379 redis
docker: Error response from daemon: Conflict. The container name "/new-redis" is already in use by container "751466ad80a1e95003b7df5370ec4657c95e6dab87b927e7ea01104ed8aa2081". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
[root@localhost ~]#
  • docker run 尝试创建一个新容器,但失败了。
  • 错误原因是容器名 “new-redis” 已经被使用。
  • Docker建议我们要么移除旧容器,要么重命名,才能重用这个名字。

这个结果进一步说明了 docker rundocker start 的区别:

  • docker run 总是尝试创建新容器,即使容器已停止。
  • docker start 则用于启动已存在的容器。

下一步,让我们尝试使用 docker start 来启动已停止的 new-redis 容器:

docker start new-redis

在这里插入图片描述
成功运行!!

相关文章:

Docker入门及基本概念

让我们从最基础的概念开始逐步理解。假设你已经准备好了docker 环境。 第一步,让我们先通过实际操作来看看当前系统中的镜像(images)和容器(containers)状态: docker images # 查看所有镜像 docker ps -a # 查看所有容器(包括未运行…...

java八股文-消息队列

一、MQ基础篇 1. 什么是消息队列? 消息队列(MQ)是分布式系统中实现异步通信的中间件,解耦生产者和消费者。 2. 使用场景有哪些? 异步处理(如注册后发送邮件)系统解耦(不同服务通过…...

设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件

设备唯一ID获取 支持安卓/iOS/鸿蒙(uni-device-id)UTS插件 介绍 获取设备唯一ID、设备唯一标识,支持安卓(AndroidId/OAID/IMEI/MEID/MacAddress/Serial/UUID/设备基础信息),iOS(Identifier/UUID),鸿蒙&am…...

基于Springboot医院预约挂号小程序系统【附源码】

基于Springboot医院预约挂号小程序系统 效果如下: 小程序主页面 帖子页面 医生账号页面 留言内容页面 管理员主页面 用户管理页面 我的挂号页面 医生管理页面 研究背景 随着信息技术的飞速发展和互联网医疗的兴起,传统的医疗服务模式正面临着深刻的变…...

微信小程序 - 页面跳转(wx.navigateTo、wx.redirectTo、wx.switchTab、wx.reLaunch)

API 跳转 1、wx.navigateTo (1)基本介绍 功能:保留当前页面,跳转到应用内的某个页面,使用该方法跳转后可以通过返回按钮返回到原页面 使用场景:适用于需要保留当前页面状态,后续还需返回的情…...

如何手动设置u-boot的以太网的IP地址、子网掩码、网关信息、TFTP的服务器地址,并进行测试

设置IP地址 运行下面这条命令设置u-boot的以太网的IP地址: setenv ipaddr 192.168.5.9设置子网掩码 运行下面这条命令设置u-boot的以太网的子网掩码: setenv netmask 255.255.255.0设置网关信息 运行下面这条命令设置u-boot的网关信息: …...

小红书运营教程(内容笔记01)

# 小红书笔记引流实战指南:合规涨粉与精准引流策略## 一、引流底层逻辑:平台算法与用户心理### 1.1 小红书流量推荐机制 ```mermaid graph TD A[笔记发布] --> B(机器初审) B --> C{内容质量检测} C -->|通过| D[进入初级流量池200-500曝光] D --> E{互动率达标?…...

tortoiseGit的使用和上传拉取

tortoiseGit的使用和上传拉取 下载TortoiseGit 通过网盘分享的文件:tortoiseGit.zip 链接: https://pan.baidu.com/s/1EOT_UsM9_OysRqXa8gES4A?pwd1234 提取码: 1234 在电脑桌面新建文件夹并进入 右击鼠标 将网址复制上去 用户名和密码是在git注册的用户名和…...

IDEA通过Maven使用JBLJavaToWeb插件创建Web项目

第一步:IDEA下载JBLJavaToWeb插件 File--->Settings--->Plugins--->Marketplace搜索: JBLJavaToWeb 第二步:创建普通Maven工程 第三步: 将普通Maven项目转换为Web项目...

【新手初学】SQL注入之二次注入、中转注入

二次注入 一、概念 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。 二、原理 防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处…...

【第四节】C++设计模式(创建型模式)-Builder(建造者)模式

目录 引言 一、Builder 模式概述 二、Builder 模式举例 三、Builder 模式的结构 四、Builder 模式的实现 五、Builder 模式的优缺点 六、总结 引言 Builder 模式是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。通过一步步构建对象,…...

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述: 🥲 Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…...

MariaDB 历史版本下载地址 —— 筑梦之路

MariaDB 官方yum源里面只有目前在维护的版本,而有时候对于老项目来说还是需要老版本的rpm包,国内很多镜像站都是同步的官方仓库,因此下载老版本也不好找,这里主要记录下从哪里可以下载到历史版本的MariaDB rpm包。 1. 官方归档网…...

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类,这就是QPdfWriter类。 (1)PDF文件生成 支持创建新的PDF文件或覆盖已有文件,通过构造函数直接绑定文件路径或QFile对象; 默认生成矢量图形PDF&#…...

使用 Promptic 进行对话管理需要具备python技术中的那些编程能力?

使用 Promptic 进行对话管理时,需要掌握一些基础的编程知识和技能,以下是详细说明: 1. Python 编程基础 Promptic 是一个基于 Python 的开发框架,因此需要具备一定的 Python 编程能力,包括: 函数定义与使用:了解如何定义函数、使用参数和返回值。类型注解:熟悉 Python…...

使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流

在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…...

遗传算法初探

组成要素 编码 分为二进制编码、实数编码和顺序编码 初始种群的产生 分为随机方法、基于反向学习优化的种群产生。 基于反向学习优化的种群其思想是先随机生成一个种群P(N),然后按照反向学习方法生成新的种群OP(N),合并两个种群,得到一个新的种群S(N…...

Oracle 连接报错:“ORA-12541:TNS:no listener ”,服务组件中找不到监听服务

一、 报错: navicat连接数据库报错:ORA-12541:TNS:no listener 二、排查问题 三、 解决问题 删除Oracle安装目录下选中的配置:listener.ora 及 listener*.bak相关的 cmd,用管理员打开 执行:netca 命…...

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...

计算机毕设-基于springboot的汽车配件销售管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 (1)整流:整流是将交流电(AC)转变为直流电(DC)。常见的整流电路包括单向整流(二极管)、桥式整流等。 半波整流:只使用交流电的正…...

C语言番外篇(3)------------>break、continue

看到我的封面图的时候,部分读者可能认为这和编程有什么关系呢? 实际上这个三个人指的是本篇文章有三个部分组成。 在之前的博客中我们提及到了while循环和for循环,在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for…...

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明:之前也在网上看到过可以使用pyenv来管理python版本,但由于作者的python安装路径实在是繁杂不堪,因此安装完成pyenv体验下来没有任何用处,但偶然发现vscode似乎可以看到各个python版本,因此写下这篇博客记录…...

网络安全知识--网络、网络安全产品及密码产品概述

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网络结构 网络设备:交换机、路由器、负载均衡 安全设备: 通信网络安全类:通信安全、网络监测与控制 区域边界安全类:隔离类…...

WiFi相关功能使用教程(wpa_supplicant及wpa_cli)

WiFi相关功能使用教程(wpa_supplicant及wpa_cli) 在之前的博客文中,我们已经成功交叉编译了wpa_supplicant和wpa_cli相关文件。 此篇文章中我们将介绍如何使用和配置WiFi模块。 先将生成的可执行文件拷贝到设备里 采用TFTP的方式拷贝到设备中并全都加上可执行权限…...

CentOS7 离线安装 Postgresql 指南

一、背景 服务器通常都是离线内网环境,想要通过联网方式一键下载安装 Postgresql 不太现实,本文将介绍如何在 CentOS7 离线安装 Postgresql,以及遇到困难如何解决。 二、安装包下载 先在本地下载好 rpm 包,再通过 ftp 上传到服…...

详解 为什么 tcp 会出现 粘包 拆包 问题

TCP 会出现 粘包 和 拆包 问题,主要是因为 TCP 是 面向字节流 的协议,它不关心应用层发送的数据是否有边界,也不会自动分割或合并数据包。由于 TCP 的流控制和传输机制,数据可能在传输过程中被拆分成多个小的 TCP 包,或…...

C/C++后端开发面经

字节跳动 客户端开发 实习 一面(50min) 自我介绍是否愿意转语言,是否只愿意搞后端选一个项目来详细谈谈HTTP和HTTPS有什么区别?谈一下HTTPS加密的具体过程: 非对称加密 对称加密 证书认证的方式 非对称加密是为了保证对称密钥的安全性。 对称…...

HTML之JavaScript DOM编程获取元素的方式

HTML之JavaScript DOM编程获取元素的方式 1.获得document DOM树window.document(是window的属性)2.从document中获取要操作的元素1.直接获取var aaa document.getElementById("username") // 根据元素的id值获取页面上的唯一一个元素,有同名的则返回找到的第一个var…...

路由器的WAN口和LAN口有什么区别?

今时今日,移动终端盛行的时代,WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口,到底有什么区别?它们的功能和作用…...