Docker从0到1:入门指南

news2025/5/15 23:18:05

目录

  • 什么是Docker
  • Docker的核心概念
    • 容器(Container)
    • 镜像(Image)
    • 镜像层(Image Layers)
    • Dockerfile
    • 仓库(Repository)
    • 数据卷(Volume)
    • 网络(Network)
  • Docker架构
  • Docker安装
  • Docker基本命令
  • 实际应用场景
  • Docker生态系统
  • 最佳实践
  • 常见问题

什么是Docker

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上。Docker容器完全使用沙箱机制,相互之间不会有任何接口。

Docker的优势:

  • 轻量级: 容器共享操作系统内核,比虚拟机更轻量
  • 可移植性: 在任何支持Docker的环境中运行
  • 隔离性: 应用程序及其依赖项在容器内隔离运行
  • 可扩展性: 容易水平扩展和管理
  • 版本控制与组件复用: 类似于Git的镜像管理

Docker的核心概念

Docker生态系统包含几个相互关联的核心概念,它们共同构成了Docker的完整工作流程:

容器(Container)

容器是Docker的核心概念,它是一个标准化的软件单元,包含了应用程序及其所有依赖项,确保应用程序在任何环境中都能以相同的方式运行。

特点:

  • 轻量级和可移植
  • 与主机系统隔离
  • 可以快速启动和停止
  • 可以限制资源使用(CPU、内存等)
  • 容器是镜像的运行实例,可以被创建、启动、停止、删除和暂停

镜像(Image)

Docker镜像是一个只读模板,用于创建Docker容器。镜像包含了运行应用程序所需的所有内容——代码、运行时、库、环境变量和配置文件。

特点:

  • 分层结构,便于共享和重用
  • 不可变性,一旦创建不能修改
  • 可以通过Dockerfile构建
  • 可以从Docker Hub等仓库获取
  • 一个镜像可以创建多个容器实例

镜像层(Image Layers)

Docker镜像由多个只读层组成,每层代表Dockerfile中的一条指令:

  • 每一层都建立在前一层的基础上
  • 当镜像被修改时,只有变化的层会被重新构建
  • 多个镜像可以共享相同的底层,节省存储空间
  • 当容器启动时,会在最顶层添加一个可写层(容器层)

Dockerfile

Dockerfile是一个文本文件,包含了构建Docker镜像所需的所有命令。Docker可以通过读取Dockerfile中的指令自动构建镜像。

常用指令:

  • FROM: 指定基础镜像
  • RUN: 执行命令
  • COPY/ADD: 复制文件
  • ENV: 设置环境变量
  • EXPOSE: 声明容器监听的端口
  • VOLUME: 创建挂载点
  • WORKDIR: 设置工作目录
  • USER: 指定运行容器时的用户
  • CMD/ENTRYPOINT: 指定容器启动时运行的命令

仓库(Repository)

Docker仓库用于存储和分发Docker镜像。Docker Hub是最流行的公共仓库,企业通常也会建立私有仓库。

类型:

  • 公共仓库(如Docker Hub, GitHub Container Registry)
  • 私有仓库(如Harbor, Nexus, AWS ECR, Azure Container Registry)

数据卷(Volume)

数据卷是Docker提供的一种持久化和共享数据的机制,用于解决容器中数据持久化的问题。

为什么需要数据卷?

Docker容器本身遵循"无状态"的设计理念,当容器被删除时,其中的所有数据也会丢失。这带来两个核心问题:

  1. 数据持久化问题:容器重启或删除后,容器内的数据会丢失
  2. 数据共享问题:容器之间或容器与主机之间需要共享数据

数据卷的核心特性:

  • 持久化存储:数据卷完全独立于容器的生命周期,即使容器被删除,数据卷及其数据仍然存在
  • 直接访问高效:数据卷绕过容器的写时复制(Copy-on-Write)层,性能更高
  • 跨容器共享:多个容器可以挂载相同的数据卷,实现数据共享
  • 主机独立:数据卷由Docker管理,不受特定主机文件系统路径的限制
  • 支持多种驱动:本地存储、NFS、云存储等多种后端存储选项
  • 更易于备份和迁移:数据卷可以被备份、恢复和迁移到其他Docker主机

数据卷与绑定挂载的区别:

特性数据卷绑定挂载
存储位置由Docker管理(/var/lib/docker/volumes/)由用户指定主机上的任意路径
迁移性更好,不依赖主机目录结构依赖主机特定路径
内容初始化新卷会复制容器指定路径中的内容覆盖容器中的目录,不复制内容
权限管理可由容器内进程修改依赖主机文件系统权限
适用场景存储Docker应用数据与主机系统共享配置文件或源代码

数据卷的使用场景:

  1. 数据库容器:存储数据库文件,确保容器重启后数据不丢失
  2. 内容管理系统:存储上传的媒体文件和文档
  3. 配置文件:存储可能需要动态修改的应用配置
  4. 日志文件:集中存储和管理容器的日志输出
  5. 共享数据:在微服务架构中不同服务间共享资源

数据卷的基本操作:

# 创建数据卷
docker volume create my_volume

# 查看所有数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect my_volume

# 删除数据卷
docker volume rm my_volume

# 删除所有未使用的数据卷
docker volume prune

# 启动容器并挂载数据卷
docker run -v my_volume:/data nginx

# 使用只读模式挂载
docker run -v my_volume:/data:ro nginx

数据卷使用实例:

PostgreSQL数据库使用数据卷:

# 创建数据卷
docker volume create pgdata

# 运行PostgreSQL容器并挂载数据卷
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v pgdata:/var/lib/postgresql/data \
  postgres:13

当容器删除后,您的数据仍然保存在pgdata数据卷中,可以被新容器挂载使用。

网络(Network)

Docker网络允许容器相互通信:

  • 桥接网络(Bridge): 默认网络,适合单主机容器通信
  • 主机网络(Host): 共享主机网络栈
  • 覆盖网络(Overlay): 适合跨主机容器通信
  • Macvlan: 为容器分配MAC地址
  • 空网络(None): 禁用所有网络

Docker架构

Docker使用客户端-服务器(C/S)架构模式,Docker客户端与Docker守护进程通信,后者负责构建、运行和分发Docker容器。

组件:

  • Docker客户端(Client): 通过命令行或其他工具与Docker守护进程交互
  • Docker守护进程(Daemon): 监听Docker API请求并管理Docker对象
  • Docker镜像(Images): 用于创建容器的只读模板
  • Docker容器(Containers): 镜像的可运行实例
  • Docker注册表(Registry): 存储Docker镜像的地方

Docker安装

Linux (Ubuntu为例)

# 更新apt包索引
sudo apt-get update

# 安装必要的包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y

# 指定使用阿里云镜像 
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# 设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"


# 更新apt包索引
sudo apt-get update

# 安装最新版本的Docker CE
sudo apt-get install docker-ce -y

Docker镜像加速

在国内使用 Docker 时,由于网络原因,从官方镜像源下载镜像的速度可能较慢。为了提高镜像下载速度,可以配置镜像加速器。这里以阿里云镜像加速器为例,其他常见的镜像加速器还有网易云镜像加速器、腾讯云镜像加速器等,配置方法类似。

创建或编辑 Docker 配置文件:在终端执行以下命令:

sudo mkdir -p /etc/docker

sudo vim /etc/docker/daemon.json

mkdir -p /etc/docker 命令用于创建 /etc/docker 目录,如果该目录已经存在则不会报错。vim /etc/docker/daemon.json 命令使用 vim 文本编辑器打开或创建 /etc/docker/daemon.json 文件,这个文件用于存储 Docker 守护进程的配置信息。

添加镜像加速器地址:在打开的 daemon.json 文件中添加或修改如下内容:

{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://docker.imgdb.de",
        "https://docker-0.unsee.tech",
        "https://docker.hlmirror.com",
        "https://docker.1ms.run",
        "https://func.ink",
        "https://lispy.org",
        "https://docker.xiaogenban1993.com"
    ]
}

重启docker 生效

sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl restart docker

Docker基本命令

镜像管理

# 列出本地镜像
docker images

# 拉取镜像
docker pull [镜像名]:[标签]

# 构建镜像
docker build -t [镜像名]:[标签] [Dockerfile路径]

# 删除镜像
docker rmi [镜像ID]

容器管理

# 创建并启动容器
docker run [选项] [镜像名] [命令]

# 列出运行中的容器
docker ps

# 列出所有容器
docker ps -a

# 启动/停止/重启容器
docker start/stop/restart [容器ID]

# 进入容器
docker exec -it [容器ID] bash

# 删除容器
docker rm [容器ID]

数据管理

# 创建数据卷
docker volume create [数据卷名]

# 挂载数据卷
docker run -v [数据卷名]:[容器内路径] [镜像名]

# 挂载主机目录
docker run -v [主机路径]:[容器内路径] [镜像名]

网络管理

# 创建网络
docker network create [网络名]

# 将容器连接到网络
docker network connect [网络名] [容器ID]

# 查看网络
docker network ls

实际应用场景

  1. 开发环境标准化: 确保所有开发人员使用相同的环境
  2. 持续集成/持续部署: 自动化构建、测试和部署流程
  3. 微服务架构: 每个服务独立部署在容器中
  4. 应用隔离: 在同一主机上运行多个应用而不互相干扰
  5. 快速扩展: 轻松创建多个相同配置的应用实例

Docker生态系统

Docker Compose

用于定义和运行多容器Docker应用程序的工具。使用YAML文件配置应用程序的服务,然后使用单个命令创建和启动所有服务。

Docker Swarm

Docker的原生集群管理工具,将多个Docker主机转变为单个虚拟Docker主机。

Kubernetes

开源容器编排平台,提供容器部署、扩展和管理的自动化。

最佳实践

  1. 使用官方镜像作为基础: 减少安全风险和兼容性问题
  2. 精简镜像大小: 使用多阶段构建和Alpine基础镜像
  3. 不在容器中存储数据: 使用卷或绑定挂载来持久化数据
  4. 指定镜像版本: 使用特定版本标签而不是latest
  5. 限制容器资源: 设置内存和CPU限制
  6. 使用非root用户: 减少潜在的安全风险
  7. 定期更新基础镜像: 修复安全漏洞

常见问题

容器和虚拟机的区别?

  • 容器共享主机的操作系统内核,更轻量级
  • 虚拟机包含完整的操作系统,资源消耗更大
  • 容器启动更快,通常在秒级
  • 虚拟机提供更强的隔离性

容器停止后数据会丢失吗?

默认情况下,容器停止后数据仍然存在,但容器被删除后数据会丢失。要持久化数据,应使用Docker卷或绑定挂载。

如何在Docker中设置环境变量?

可以在Dockerfile中使用ENV指令,或在运行容器时使用-e--env标志。

Docker的网络模式有哪些?

  • bridge: 默认网络模式,创建虚拟网桥
  • host: 直接使用主机网络
  • none: 无网络
  • overlay: 用于Docker Swarm服务之间的通信
  • macvlan: 允许容器拥有MAC地址,看起来像物理网络上的设备

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候,不小心按错键了,导致一按字符键就显示桌面。如下: 一开始我以为是输入法的问题(相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦),但是后来解决半天发现并不是。在网上搜…

Gemini 2.5 Flash和Pro预览版价格以及上下文缓存的理解

Gemini 2.5 Flash和Pro预览版价格 Gemini 2.5 Flash 预览版就是 Google 的最新 AI 大模型,能处理巨量内容。可以免费体验,但有次数和功能上的限制;付费层级才开放全部高级功能。价格也比传统 API 略有不同,尤其在“思考预算”“上…

vue2 头像上传+裁剪组件封装

背景:最近在进行公司业务开发时,遇到了头像上传限制尺寸的需求,即限制为一寸证件照(宽295像素,高413像素)。 用到的第三方库: "vue-cropper": "^0.5.5" 完整组件代码&…

AI-02a5a5.神经网络-与学习相关的技巧-权重初始值

权重的初始值 在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。 不要将权重初始值设为 0 权值衰减(weight decay):抑制过拟合、提高泛化能…

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) 这篇文章主要介绍单个eureka服务端的集群环境是如何搭建的。 通过前面的文章【springcloud学习(dalston.sr1)】…

Node.js数据抓取技术实战示例

Node.js常用的库有哪些呢?比如axios或者node-fetch用来发送HTTP请求,cheerio用来解析HTML,如果是动态网页的话可能需要puppeteer这样的无头浏览器。这些工具的组合应该能满足大部分需求。 然后,可能遇到的难点在哪里?…

windows10 安装 QT

本地环境有个qt文件,这里是5.14.2 打开一个cmd窗口并指定到该文件根目录下 .\qt-opensource-windows-x86-5.14.2.exe --mirror https://mirrors.ustc.edu.cn/qtproject 执行上面命令 记住是文件名,记住不要傻 X的直接复制,是你的文件名 点击…

WordPress 和 GPL – 您需要了解的一切

如果您使用 WordPress,GPL 对您来说应该很重要,您也应该了解它。查看有关 WordPress 和 GPL 的最全面指南。 您可能听说过 GPL(通常被称为 WordPress 的权利法案),但很可能并不完全了解它。这是有道理的–这是一个复杂…

C++书本摆放 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析

目录 C++书本摆放 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、 推荐资料 1、C++资料 2、Scratch资料 3、Python资料 C++书本摆放 2024年信息素养大赛 C++复赛真题 一、题目要求 1、编程实现 中科智慧科技…

RabbitMQ 核心概念与消息模型深度解析(一)

一、RabbitMQ 是什么 在当今分布式系统盛行的时代,消息队列作为一种至关重要的中间件技术,扮演着实现系统之间异步通信、解耦和削峰填谷等关键角色 。RabbitMQ 便是消息队列领域中的佼佼者,是一个开源的消息代理和队列服务器,基于…

论文阅读笔记——双流网络

双流网络论文 视频相比图像包含更多信息:运动信息、时序信息、背景信息等等。 原先处理视频的方法: CNN LSTM:CNN 抽取关键特征,LSTM 做时序逻辑;抽取视频中关键 K 帧输入 CNN 得到图片特征,再输入 LSTM&…

LabVIEW在电子电工教学中的应用

在电子电工教学领域,传统教学模式面临诸多挑战,如实验设备数量有限、实验过程存在安全隐患、教学内容更新滞后等。LabVIEW 作为一款功能强大的图形化编程软件,为解决这些问题提供了创新思路,在电子电工教学的多个关键环节发挥着重…

Vue3 怎么在ElMessage消息提示组件中添加自定义icon图标

1、定义icon组件代码&#xff1a; <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName" :fill"color"/></svg> </template><script> export default defineComponen…

生活破破烂烂,AI 缝缝补补(附提示词)

写在前面&#xff1a;​【Fire 计算器】已上线&#xff0c;快算算财富自由要多少​ 现实不总温柔&#xff0c;愿你始终自渡。 请永远拯救自己于水火之中。 毛绒风格提示词&#xff08;供参考&#xff09;&#xff1a; 1. 逼真毛绒风 Transform this image into a hyperrealist…

张 。。 通过Token实现Loss调优prompt

词编码模型和 API LLM不匹配,采用本地模型 理性中性案例(针对中性调整比较合理) 代码解释:Qwen2模型的文本编码与生成过程 这段代码展示了如何使用Qwen2模型进行文本的编码和解码操作。 模型加载与初始化 from transformers import AutoModelForCausalLM, AutoTokenizer

JVM学习专题(一)类加载器与双亲委派

目录 1、JVM加载运行全过程梳理 2、JVM Hotspot底层 3、war包、jar包如何加载 4、类加载器 我们来查看一下getLauncher&#xff1a; 1.我们先查看getExtClassLoader() 2、再来看看getAppClassLoader(extcl) 5、双亲委派机制 1.职责明确&#xff0c;路径隔离​&#xff…

PyTorch API 9 - masked, nested, 稀疏, 存储

文章目录 torch.randomtorch.masked简介动机什么是 MaskedTensor&#xff1f; 支持的运算符一元运算符二元运算符归约操作查看与选择函数 torch.nested简介构造方法数据布局与形状支持的操作查看嵌套张量的组成元素填充张量的相互转换形状操作注意力机制 与 torch.compile 的配…

进程相关面试题20道

一、基础概念与原理 1.进程的定义及其与程序的本质区别是什么&#xff1f; 答案&#xff1a;进程是操作系统分配资源的基本单位&#xff0c;是程序在数据集合上的一次动态执行过程。核心区别&#xff1a;​ 动态性&#xff1a;程序是静态文件&#xff0c;进程是动态执行实例…

Linux复习笔记(五) 网络服务配置(dhcp)

二、网络服务配置 2.5 dhcp服务配置&#xff08;不涉及实际操作&#xff09; 要求&#xff1a;知道原理和常见的参数配置就行 2.5.1 概述DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; DHCP&#xff08;Dynamic Host Conf…

windows版redis的使用

redis下载 Releases microsoftarchive/redishttps://github.com/microsoftarchive/redis/releases redis的启动和停止 进入路径的cmd 启动&#xff1a;redis-server.exe redis.windows.conf 停止&#xff1a;ctrlc 连接redis 指定要连接的IP和端口号 -h IP地址 -p 端口…