【Docker】P3 入门指南:运维与开发双重视角

目录

  • Docker入门:运维与开发
  • 运维视角
    • Docker 架构概述
    • Docker 镜像
      • 镜像概念理解
      • 查看和管理镜像
      • 拉取镜像
      • 镜像标识
  • 容器管理
    • 启动容器
    • 容器内操作
    • 容器的后台运行
    • 多容器管理
    • 重新进入运行中的容器
    • 容器生命周期管理
  • 开发视角
    • 容器化思维
    • 示例:基于 Nginx 镜像构建简单 Web 应用
      • 创建 Dockerfile
      • 创建静态网页文件
      • 构建镜像
    • 运行应用容器
    • 完整的开发工作流
  • 总结

注:本文将基于 macOS 操作系统环境展开。

在这里插入图片描述

Docker入门:运维与开发

本章的初衷是在深入研究 Docker 之前,对 Docker 进行一个整体的介绍,让读者有一个全面而清晰的初步认知。本章内容主要从两种视角展开:

  • 运维(Ops)视角: 关注 Docker 的基础操作和管理
  • 开发(Dev)视角: 关注应用开发和容器化

在运维视角中,主要包括下载镜像、运行新的容器、登录新容器、在容器内运行命令,以及销毁容器等核心操作。

在开发视角中,主要关注与应用构建、打包和部署相关的内容。

通过上述两部分内容的了解,读者可以从整体上理解 Docker 究竟是什么,以及主要组件之间是如何相互配合的。


运维视角

Docker 架构概述

当读者安装 Docker 时,会涉及两个核心组件:

  1. Docker 客户端(Docker Client): 用户与 Docker 交互的命令行工具
  2. Docker 守护进程(Docker Daemon): 实现了 Docker 引擎的 API,负责管理镜像、容器、网络和存储卷

在不同操作系统上,客户端与守护进程的通信方式有所不同:

  • Linux/macOS: 通过本地 IPC/UNIX Socket (/var/run/docker.sock) 完成通信
  • Windows: 通过命名管道(Named Pipes)完成通信

读者可以使用以下命令来检查客户端和服务端是否都已经成功运行,并且可以互相通信:

docker version

期望输出应包含 Client 和 Server 两部分信息,表示通信正常。

Docker 镜像

镜像概念理解

将 Docker 镜像理解为一个包含了操作系统文件系统和应用程序的只读模板会很有帮助。如果读者有虚拟化经验,可以将其类比为虚拟机模板——虚拟机模板本质上是处于关机状态的虚拟机。在 Docker 世界中,镜像实际上等价于未运行的容器。

查看和管理镜像

在 Docker 主机上运行以下命令查看所有本地镜像:

docker image ls

在刚搭建好的 Docker 环境中,会输出类似如下的表头,但没有任何镜像:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE

拉取镜像

在 Docker 主机上获取镜像的操作被称为拉取(Pulling)。我们以 Ubuntu 为例:

# 拉取最新版本的 ubuntu 镜像,默认为 ubuntu:latest
docker pull ubuntu# 或者拉取特定版本
docker pull ubuntu:perl

再次运行 docker image ls 命令查看刚刚拉取的镜像:

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        latest    b60cb74dfa1b   3 weeks ago   101MB

镜像标识

Docker 的每个镜像都有自己唯一的 ID(基于 SHA256 哈希),如上述示例中的 IMAGE ID 属性对应的值 b60 即为 ubuntu 镜像源的 ID值,用户可以通过以下方式引用镜像:

  • 镜像名称 + 标签: ubuntu:latest
  • 镜像 ID: b60cb74dfa1b(通常只需要输入前几个字符即可识别,如 b60

容器管理

启动容器

到目前为止,读者已经拥有一个拉取到本地的镜像,可以使用 docker run 命令从镜像来启动容器:

# 交互式启动容器并进入 bash shell
docker run -it ubuntu:latest /bin/bash

在上述命令中:

  • run 命令从镜像源 nginx:latest 中启动了容器
  • -it 参数组合了 -i(交互式)和 -t(分配伪终端),直接进入到容器内部并在后台启动
  • /bin/bash 指定了容器启动后要执行的命令

容器内操作

在容器内,我们可以通过 ps -elf 来查看所有进程:

在这里插入图片描述
关键进程解释:

  • 第一个进程 PID 1/bin/bash 进程,该进程是通过 docker run 命令启动的主进程
  • 第二个进程 PID 2ps -elf 进程,即当前正在执行的查看进程命令

容器的后台运行

如果想退出容器但保持容器在后台运行,可以通过使用组合键:

Ctrl + PQ

这会让你退回到 Docker 守护进程所在的终端,而容器继续在后台运行。
现在可以通过 docker ps 命令查看当前运行的容器:

在这里插入图片描述

多容器管理

有意思的是,镜像是唯一的,但我们可以同一个镜像创建多个容器实例。

# 启动第二个容器
docker run -it ubuntu:latest /bin/bash
# 使用 Ctrl + P + Q 退出# 查看所有运行中的容器
docker ps

请添加图片描述

重新进入运行中的容器

如果想重新进入到第一个运行的容器,可以首先通过 docker ps 查看容器的相信信息,尤其关注 CONTAINER ID 以及 NAMES 两个属性的值。

请添加图片描述

可以使用 docker exec 命令:

# 方法1:使用容器ID(前几位即可)
docker exec -it d85 /bin/bash# 方法2:使用容器名称
docker exec -it happy_mendeleev /bin/bash

docker exec 命令支持我们重新进入当前正在运行的容器。

容器生命周期管理

停止容器

# 通过 Container ID 停止容器
docker stop d85
# 通过 Container Name 停止同期
docker stop happy_mendeleev

重启容器

# 同样可以通过 ID 或者 Names 重启服务,这里只介绍通过 ID 重启
docker restart d85

删除容器

# 在停止容器运行时,注意需要区分是否已经停止运行
# 删除已停止的容器
docker rm d85# 强制删除运行中的容器
docker rm -f d85

开发视角

容器化思维

容器即应用! 这是 Docker 的核心理念。当我们开发完成一个应用时,如何将其封装成一个可移植的"软件包"呢?在 Docker 中,这个软件包就是镜像。

示例:基于 Nginx 镜像构建简单 Web 应用

在 Docker 中,我们通过 Dockerfile 文件来定义如何构建镜像。首先我们先创建一个目录地址,用于承载我们搭建的应用。

创建 Dockerfile

# 创建项目目录
mkdir my-web-app
cd my-web-app# 创建 Dockerfile
touch Dockerfile
vim Dockerfile

在创建好的 Dockerfile 中输入内容:

# Dockerfile
FROM nginx:alpine# 设置工作目录
WORKDIR /usr/share/nginx/html# 复制静态文件到容器中
COPY ./html/ .# 暴露端口
EXPOSE 80# 启动命令(nginx:alpine 镜像已有默认CMD)

创建静态网页文件

下面我们基于 HTML 创建一个简单的静态网页文件,首先我们先在 my-web-app 目录下创建一个名为 html 文件夹:

mkdir html

然后将下述内容粘贴到终端中。

cat > html/index.html << EOF
<!DOCTYPE html>
<html>
<head><title>My Docker Web App</title><style>body { font-family: Arial, sans-serif; margin: 40px; }.container { max-width: 600px; margin: 0 auto; text-align: center; }.success { color: #28a745; }</style>
</head>
<body><div class="container"><h1 class="success">Docker 容器化成功!</h1><p>这是一个运行在 Docker 容器中的静态网站。</p><p>当前时间:<span id="time"></span></p></div><script>document.getElementById('time').textContent = new Date().toLocaleString();</script>
</body>
</html>
EOF

此时,我们的 my-web-app 整体架构如下:

.
Dockerfile
html
|-- index.html

通过 cat 命令查看 index.html 文件中内容,正如我们刚才粘贴创建的静态网页内容:

请添加图片描述

构建镜像

下一步,我们基于现已构建好的 Dockerfile 以及前端界面构建我们的镜像。

# 构建镜像,注意最后的 . 表示当前目录
docker build -t my-web-app:v1.0 .

构建过程输出:

当构建完成后,可以通过 docker image ls 命令查看我们构建好的镜像:

docker image ls

输出示例:

请添加图片描述

太好了,创建完成!现在我们再输入 docker image ls 命令查看所有的镜像源,就会发现多一条我们刚创建好的、名为 my-web-app,版本为 v1.0 的镜像源:

在这里插入图片描述

运行应用容器

下一步,我们基于构建好的镜像文件,启动容器。

# 运行容器,将容器的80端口映射到主机的8080端口
docker run -d -p 8080:80 --name my-webapp my-web-app:v1.0

参数说明:

  • -d:后台运行(detached mode)
  • -p 8080:80:端口映射,主机 8080 端口映射到容器 80 端口
  • --name my-webapp:给容器指定一个名称
  • my-web-app:v1.0:使用的镜像

现在,我们再通过 docker ps 命令检查,就可以发现我们已经有一个在运行的容器了~

最后,我们欣赏一下自己基于 Docker-Nginx 镜像源搭建的第一个小网络。
http://localhost:8080

在这里插入图片描述

完整的开发工作流

现在,让我们从宏观的工作流上总结下怎样构建一个完整的应用:

  1. 编写应用代码
  2. 创建 Dockerfile
  3. 构建镜像 (docker build)
  4. 运行容器 (docker run)
  5. 测试应用
  6. 推送到仓库(可选)
# 可选:推送到 Docker Hub
docker tag my-web-app:v1.0 yourusername/my-web-app:v1.0
docker push yourusername/my-web-app:v1.0

总结

通过本博文内容,我们从运维开发两个视角了解了 Docker 的基本概念和核心操作:

运维视角重点:

  • Docker 架构: 客户端-服务端模式
  • 镜像管理: 拉取、查看、删除
  • 容器生命周期: 创建、启动、停止、删除
  • 容器操作: 进入容器、执行命令

开发视角重点:

  • 容器化思维: 容器即应用
  • Dockerfile: 定义镜像构建过程
  • 镜像构建: 从代码到可部署的镜像
  • 应用部署: 端口映射、容器命名

这些基础操作构成了 Docker 使用的核心工作流,为后续深入学习 Docker 的高级特性打下了坚实的基础。在后续博文中,我们将深入探讨 Docker 网络、存储卷、编排等高级主题。


2025.09 金融街

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

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

相关文章

第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)

重要信息 时间&#xff1a;2025年10月17-19日 地点&#xff1a;中国上海 官网&#xff1a;www.icbaie.net 征稿主题 1. 大数据与云计算 2. 人工智能技术与应用 3. 机器人科学与工程 4. 物联网与传感器技术 5. 其他 大数据、人工智能与物联网 引言 在数字化转型的时代…

Docker存储卷(Volume)核心概念、类型与操作指南

文章目录一、存储卷概念二、存储卷分类2.1 管理卷2.2 绑定数据卷2.3 临时数据卷三、MySQL灾难恢复四、存储卷的局限性一、存储卷概念 什么是存储卷&#xff1f;   Docker 存储卷 是 Docker 容器中用于持久化存储数据的独立文件系统区域。它独立于容器的联合文件系统&#xf…

Electron 原生模块集成:使用 N-API

引言&#xff1a;原生模块集成在 Electron 开发中的 N-API 核心作用与必要性 在 Electron 框架的扩展开发中&#xff0c;原生模块集成是提升应用性能和功能边界的关键技术&#xff0c;特别是使用 N-API&#xff08;Node-API&#xff09;编写和集成 C 原生模块&#xff0c;更是 …

android组包时会把从maven私服获取的包下载到本地吗

Android项目在构建&#xff08;组包&#xff09;时&#xff0c;Gradle会自动将从Maven私服&#xff08;或任何配置的仓库&#xff09;获取的依赖包&#xff08;AAR、JAR等&#xff09;下载到本地的Gradle缓存目录中。 下面详细解释这个过程和相关的概念&#xff1a; 详细过程声…

【应用笔记】构建具有增强识别、防欺骗和说话人识别功能的高级语音用户界面--瑞萨电子

Suad Jusuf&#xff08;Director Product Marketing and Strategy, Renesas AI Center of Excellence&#xff09;&#xff1a;语音用户界面&#xff08;VUI&#xff09;正在彻底改变我们与技术交互的方式&#xff0c;实现免提、无缝的通信。通过整合先进语音命令识别功能&…

DAY 26 函数专题1:函数定义与参数-2025.9.13

DAY 26 函数专题1&#xff1a;函数定义与参数 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时…

芯昇XS9922C可替代TP9932和TP9930:国产四核高清解码芯片,开启车载视觉处理新纪元 ——从像素级解析到全链路集成,重新定义智能驾驶感知核心

引言&#xff1a;车载视觉的“芯”革命 在智能驾驶技术飞速演进的今天&#xff0c;高清视频采集与实时处理已成为车辆环境感知的“神经中枢”。传统解码方案面临传输距离有限、多芯片集成度低、音视频同步难等痛点&#xff0c;制约着车载环视、盲区检测等关键功能的性能突破。X…

百度竞价推广:百度搜索竞价推广代运营

在数字化营销浪潮中&#xff0c;百度竞价推广凭借其强大的流量优势和精准触达能力&#xff0c;成为企业获取客户的核心渠道之一。然而&#xff0c;面对复杂的账户管理、激烈的关键词竞争以及动态变化的市场环境&#xff0c;许多企业选择将专业的事交给专业的人——通过代运营团…

开源端到端训练多模态大模型LLaVA 深度拆解

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

排序算法(Java)

目录 前言 常见的排序算法实现&#xff1a; 1. 冒泡排序 思路分析&#xff1a; 代码实现&#xff1a; 2.选择排序 思路分析&#xff1a; 代码实现&#xff1a; 3.插入排序 思路分析&#xff1a; 代码实现&#xff1a; 4.快速排序 思路分析&#xff1a; 代码实现&…

深度学习打卡第N6周:中文文本分类-Pytorch实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 数据格式&#xff1a; import torch from torch import nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

【代码随想录day 24】 力扣 90. 集合II

视频讲解&#xff1a;https://www.bilibili.com/video/BV1vm4y1F71J/?vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解&#xff1a;https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html#%E6%80%9D%E8%B7%AF 力扣题目&#xff1a;https://leetcode.cn/problems/su…

.NET 6 文件下载

.NET 6 API中实现文件的下载。创建HttpHeaderConstant用于指定http头。public sealed class HttpHeaderConstant{public const string RESPONSE_HEADER_CONTENTTYPE_STREAM "application/octet-stream";public const string RESPONSE_HEADER_NAME_FILENAME "f…

[数据结构——lesson6.栈]

目录 引言 1.栈的概念和结构 栈的核心概念 栈的结构 2.栈的实现 2.1栈的实现方式 2.2栈的功能 2.3栈的声明 1.顺序栈 2。链式栈 2.4栈的功能实现 1.栈的初始化 2.判断栈是否为空 3.返回栈顶元素 4.返回栈的大小 5.元素入栈 6.元素出栈 7.打印栈的元素 8.销毁…

华为HICE云计算的含金量高吗?

在数字时代的今天&#xff0c;云计算技术证飞速的发展成为企业数字化转型的重要支撑。而华为作为领先的通信和信息技术公司&#xff0c;推出的HCIE云计算认证备受关注。接下来就来说说华为HCIE云计算认证的含金量到底有多高。HCIE认证被认为是华为认证中的最高等级&#xff0c;…

OSPF协议原理讲解和实际配置(华为/思科)

OSPF&#xff08;open shorest path first&#xff0c;开放最短路径优先&#xff09;是一种动态的&#xff0c;基于链路状态的动态路由协议&#xff0c;广泛的应用在企业网络中&#xff0c;通过维护网络拓扑信息&#xff0c;利用 Dijkstra 算法实现最短路径&#xff0c;实现高效…

【开题答辩全过程】以 《黄帝内经》问答系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚

这个错误是由于 PowerShell 的执行策略限制&#xff0c;导致无法运行脚本。你可以通过以下步骤解决这个问题&#xff1a; 1. 查看当前的执行策略 打开 PowerShell&#xff0c;以管理员身份运行&#xff0c;输入以下命令查看当前的执行策略&#xff1a; Get-ExecutionPolicy如果…

macOS苹果电脑运行向日葵远程控制软件闪退

文章目录问题原因分析修复附录向日葵字太小按Ctrl键会弹出开始菜单的问题问题 向日葵是一款远程控制的应用&#xff0c;在macOS下也能运行&#xff0c; 本来用的好好的&#xff0c;有一天升级后突然就运行不起来了&#xff0c;一点开能显示几秒首界面&#xff0c;立马就自动退…

Linux dma-buf 框架原理、实现与应用详解

1. 背景与意义 1.1 异构系统与缓冲区共享的挑战 在现代 SoC、嵌入式、图形和多媒体系统中&#xff0c;CPU、GPU、VPU、ISP、DMA 控制器等多个硬件单元需要高效地共享和传递大块数据&#xff08;如图像帧、视频流、AI 张量等&#xff09;。如果每个设备都维护独立的缓冲区&…