Docker概述与基础入门

1. 什么是Docker?

Docker 是一个开源的平台,用于自动化应用程序的构建、部署和管理。它允许开发人员通过将应用程序及其依赖项打包成容器镜像,从而确保应用可以在任何环境中一致地运行。Docker 容器是轻量级的、可移植的、且具有高度隔离性的虚拟化环境。它们是运行在操作系统级别的,不同于传统的虚拟机(VM),Docker 容器共享主机的内核,因此具有更低的资源开销。

Docker的核心概念:
  • 镜像(Image):Docker 镜像是一个只读模板,用于创建容器。镜像包含了应用程序的运行环境、依赖项和配置文件。每个镜像都是由多个层次组成的,每一层通常都是基于另一个镜像构建的。镜像是创建容器的蓝图,可以通过 Dockerfile 来定义。

  • 容器(Container):容器是镜像的一个运行实例。容器包含了应用程序及其运行环境,并在隔离的环境中运行。每个容器在运行时都会有自己的文件系统、网络设置和进程。

  • Docker引擎(Docker Engine):Docker引擎是一个客户端-服务器架构的应用程序,它负责构建、运行、管理容器,并与Docker守护进程交互。Docker引擎包括两个主要组件:

    • 守护进程(Docker Daemon):负责管理容器的生命周期,包括创建、运行、停止和删除容器。
    • 客户端(Docker CLI):用户与 Docker 交互的命令行工具。用户通过客户端向 Docker 守护进程发送指令。
为什么选择Docker?
  • 跨平台性:Docker容器可以在任何支持Docker的操作系统上运行,无论是Linux、Windows还是macOS。这使得开发人员能够在本地开发并且能够保证应用程序能够在生产环境中无缝运行。
  • 快速启动:容器启动速度远远快于传统虚拟机,因为它们共享主机操作系统的内核,而不需要启动整个操作系统。
  • 隔离性:每个容器运行在独立的用户空间,互不干扰。这使得多个应用程序能够在同一台机器上运行,而不会相互影响。
  • 资源效率:Docker容器的资源开销较小,不需要虚拟化整个操作系统,因此比虚拟机更轻量级。
2. Docker的工作原理:容器与镜像

Docker的工作原理是基于容器化的理念,而容器本质上是操作系统层级的虚拟化。容器通过共享宿主操作系统的内核来提供隔离,避免了虚拟机所需的额外硬件资源,因此更为高效。

镜像(Image)与容器(Container)的关系:
  • 镜像 是静态的、不可变的,通常由多个层组成。每一层代表对应用的某个变更(如安装软件、修改配置等)。镜像是通过Dockerfile构建的。
  • 容器 是镜像的一个运行实例。容器在启动时从镜像创建,容器拥有独立的文件系统、网络、进程空间和资源限制,但它们与主机操作系统共享内核。容器在运行时可以修改文件系统,但修改不会影响镜像本身,容器退出后,文件系统会被清理。
Docker的工作流程:
  1. 创建镜像:使用Dockerfile定义应用程序的环境,构建镜像。Dockerfile是一个文本文件,包含了构建镜像的所有指令。你可以使用命令如docker build来构建镜像。

  2. 推送镜像到仓库:镜像构建完成后,你可以将其推送到 Docker Hub 或私有的 Docker 镜像仓库,便于其他人或其他环境使用。

  3. 创建容器:使用镜像创建容器。通过docker run命令,Docker会从镜像中创建一个容器实例,分配网络资源和文件系统,并启动应用程序。

  4. 运行与管理容器:容器可以启动、停止、重启、删除。docker startdocker stopdocker restartdocker rm等命令都用于容器的管理。

3. Docker与传统虚拟化的区别

传统的虚拟化技术如虚拟机(VM)通过在物理硬件上运行多个完整的操作系统来实现隔离。每个虚拟机都包含了完整的操作系统、应用程序以及必要的库文件,虚拟机之间是完全独立的。而Docker容器通过在操作系统层面进行隔离,多个容器共享宿主机的操作系统内核,因此比虚拟机更加轻量。

对比 Docker 与 虚拟机:
特性Docker虚拟机(VM)
资源使用较少,容器共享宿主机内核高,每个虚拟机需要独立的操作系统
启动时间几秒钟数分钟
性能接近原生性能相对较低,因需要虚拟化整个操作系统
隔离性容器共享操作系统内核,提供进程和文件系统的隔离完全隔离,每个虚拟机有自己的内核
资源管理通过cgroups与namespaces管理资源通过hypervisor管理资源
Docker的优势:
  • 轻量级:由于没有虚拟化操作系统,容器启动和销毁速度非常快。
  • 高效性:容器共享宿主机内核,减少了资源开销。
  • 更强的密度:同一台物理机上,可以运行更多的容器而不影响性能。
4. 安装与配置Docker(Windows、macOS、Linux)

Docker提供了适用于多个操作系统的安装包。无论是在Windows、macOS还是Linux系统上安装Docker,都有各自的安装方法和注意事项。

Windows与macOS安装
  • Windows安装

    • 需要启用Hyper-V(Windows 10 Professional及以上版本支持)。
    • 下载Docker Desktop for Windows,并执行安装程序。
    • 安装完成后,Docker Desktop会自动启动并运行Docker守护进程。
    • 通过命令行执行docker --version检查Docker是否正确安装。
  • macOS安装

    • 在macOS上安装Docker Desktop需要macOS 10.13或更高版本。
    • 下载Docker Desktop for Mac,安装并启动。
    • 安装完成后,可以通过命令行检查Docker是否正常运行。
Linux安装
  • 在Linux上,Docker的安装方法可能会因发行版的不同而有所区别。以Ubuntu为例,安装步骤如下:
    1. 更新包索引:sudo apt-get update
    2. 安装Docker依赖包:sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
    3. 添加Docker官方GPG密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    4. 添加Docker的APT仓库:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    5. 安装Docker:sudo apt-get update && sudo apt-get install docker-ce
    6. 启动Docker并设置开机自启:sudo systemctl start docker && sudo systemctl enable docker
    7. 验证安装:docker --version
5. 第一个Docker容器:docker run hello-world

创建第一个Docker容器是验证Docker是否正确安装的重要步骤。执行以下命令:

docker run hello-world

该命令会下载hello-world镜像,并创建一个容器运行它。Docker会打印一条消息,告知你Docker已成功安装并运行。

6. 常用命令概览

了解Docker的基本命令是开发人员的必备技能。以下是一些常用的命令及其用途:

  • docker ps:列出所有正在运行的容器。

    docker ps
  • docker ps -a:列出所有容器(包括停止的容器)。

    docker ps -a
  • docker images:列出本地Docker镜像。

    docker images
  • docker exec:在运行中的容器中执行命令。

    docker exec -it <container_id> /bin/bash

    这个命令允许你进入容器并在其中执行交互式命令。

  • docker stop:停止容器。

    docker stop <container_id>
实践环节:安装Docker Desktop并创建容器
  • 步骤1:安装Docker Desktop(Windows/macOS)
    • 按照上述安装步骤,成功安装并启动Docker Desktop。
  • 步骤2:运行第一个容器
    • 使用docker run hello-world验证Docker是否正常工作。
  • 步骤3:使用docker ps, docker stop, docker rm管理容器
    • 通过docker ps查看当前正在运行的容器。
    • 使用docker stop停止容器。
    • 使用docker rm删除停止的容器。

小结:

在本章节中,我们从Docker的基本概念入手,介绍了容器与虚拟机的区别,理解了Docker的工作原理。我们还学习了如何在Windows、macOS和Linux平台上安装和配置Docker,并通过实际操作运行了第一个Docker容器。接下来,我们将继续深入探讨Docker的实际应用与管理技巧。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】十五、Linux/CentOS 7 用户和组管理

Linux下组和用户的管理都必须是root用户下进行&#xff1a; 一、组的管理 1.组的创建 格式&#xff1a; groupadd 组名参数&#xff1a; -g&#xff1a;指定用户组的组ID&#xff08;GID&#xff09;&#xff0c;如果不提供则由系统自动分配。 【案例】创建一个名为 oldg…

XV6 开发环境搭建

Step 1 搭建ubuntu 20.04 虚拟机 注意&#xff1a;一定要使用ubuntu 20.04&#xff0c;该版本可以直接通过deb安装gnu编译工具链。 安装完虚拟机后&#xff0c;换apt源。 ubuntu20.04镜像下载链接 设置root账户密码: sudo passwd root Step 2 下载解压qemu 5.1.0 wget ht…

计算机网络-基础概念(HTTP,TPC/IP, DNS,URL)

HTTP不同的版本 HTTP0.9于1990年问世&#xff0c;此时HTTP并没有作为正式的标准被建立。HTTP正式被公布是1996年的5月&#xff0c;版本命名为HTTP/1.0。HTTP1.1&#xff0c;1997年1月公布&#xff0c;目前仍然是主流版本的HTTP协议版本。 TCP/IP 通常使用的网络是在TCP/IP协…

使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)

原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写&#xff0c;抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化&#xff0c;从而确保了枚举的单例特性。 …

数据挖掘之聚类分析

聚类分析&#xff08;Clustering Analysis&#xff09; 是数据挖掘中的一项重要技术&#xff0c;旨在根据对象间的相似性或差异性&#xff0c;将对象分为若干组&#xff08;簇&#xff09;。同一簇内的对象相似性较高&#xff0c;而不同簇间的对象差异性较大。聚类分析广泛应用…

【C++】判断能否被 3, 5, 7 整除问题解析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;老师代码实现与分析老师代码逻辑分析优点缺点 &#x1f4af;学生代码实现与分析学生代码逻辑分析优点缺点 &#x1f4af;改进与优化优化代码实现优化…

PHP开发日志 ━━ 基础知识:四种不同的变量返回方式该如何调用

最近在给框架升级&#xff0c;其中涉及到古早的缓存系统升级&#xff0c;现在准备区分类型为混合、变量和普通文件&#xff0c;那么变量用什么形式存储到缓存才能给后续开发带来便利和通用性呢&#xff1f;于是就涉及到了本文的php基础知识。 好吧&#xff0c;又是一个无用的知…

Y3编辑器教程5:触发器进阶使用(镜头、UI、表格、函数库、排行榜、游戏不同步)

文章目录 一、游戏声音设计二、 游戏镜头设计2.1 镜头的基本参数2.2 镜头时间轴动画 三、界面编辑3.1 界面编辑器设置3.2 添加按钮事件3.3 触发编写 四、 表格编辑器&#xff08;实现对话UI&#xff09;4.1 一维表和多维表4.2 数据验证、搜索、保存与撤销4.3 Excel导入导出4.4 …

高中数学:成对数据的统计分析

文章目录 一、成对数据的统计相关性1、相关关系2、样本相关系数 二、一元线性回归模型及其应用1、一元线性回归模型2、最小二乘估计3、拟合效果比较公式4、注意点5、例题 三、列联表与独立性检验1、分类变量2、分类变量与列联表3、独立性检验4、常用小概率值和临界值5、例题6、…

Python OCR文字识别api接口

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

【Unity3D】实现UGUI高亮引导点击

Unity版本2019.4.0f1 Personal <DX11> using UnityEngine; using UnityEngine.UI;public class GuideMask : MonoBehaviour, ICanvasRaycastFilter {public Canvas canvas;public Transform guideTargetTrans;public Image image;private Vector3 guideTargetWorldPos;pr…

docker启动一个helloworld(公司内网服务器)

这里写目录标题 容易遇到的问题&#xff1a;1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法&#xff1a; 最简单的方式&#xff1a; docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World&#xff1a; docker…

Redisson常用方法

Redisson 参考: 原文链接 定义&#xff1a;Redisson 是一个用于与 Redis 进行交互的 Java 客户端库 优点&#xff1a;很多 1. 入门 1.1 安装 <!--redission--> <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifa…

火焰传感器与C++编程:精准检测火灾的技术实现

火灾是我们日常生活中一个不可忽视的安全隐患&#xff0c;而火灾报警系统的实现可以大大提高我们的安全保障。通过嵌入式技术和传感器&#xff0c;我们能够在第一时间识别火灾隐患并发出警报。火焰传感器作为一种专门用于火灾监测的传感器&#xff0c;能高效地通过红外线&#…

arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)

无人机航拍建图之后&#xff0c;通过大疆智图软件可以对所飞行的区域的进行拼图&#xff0c;但是如果需要对拼好的图再次合并&#xff0c;则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法&#xff1a;点击“”图标进行导入操作…

VMware Workstation的有线连接消失了

进入/var/lib目录下 cd /var/lib 查看是否存在NetworkManager 文件 ls 将其删除&#xff0c;然后虚拟机reboot一下。 sudo rm -r NetworkManager reboot 解决了&#xff0c;可以联网

算法-动态数组-62.不同路径

一、题目 二、思路解析 1.思路&#xff1a; 对于找到目的地它的来源主要来源于目的地的上一格和目的地的左一格 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.处理边界&#xff1a; a.只向右移动&#xff0c;至始至终只有一条路径 for(int i0;i<m;i){dp[i][0]1; } …

C# 探险之旅:第三十节 - 类型class(继承Inheritance) —— 当“儿子”继承“老爸”的遗产

嘿&#xff0c;探险家们&#xff01;欢迎再次踏上我们的C#奇幻旅程。今天&#xff0c;我们要聊一个既有趣又实用的话题——继承&#xff08;Inheritance&#xff09;&#xff01;想象一下&#xff0c;如果你的“儿子”能够继承“老爸”的遗产&#xff0c;那编程世界里的对象们也…

Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)

转载 https://blog.csdn.net/m0_71489826/article/details/142288179 前言 本文主要写Q_GLOBAL_STATIC实现单例以及单例的释放&#xff0c;网上很多教程只有单例的创建&#xff0c;但是并没有告诉我们单例的内存管理&#xff0c;这就很头疼。 正文 使用 Qt 的 Q_GLOBAL_STA…