Docker入门指南(超详细)

一、什么是docker

        在云计算和微服务架构盛行的今天,Docker 作为容器技术的标杆,彻底改变了应用部署和运行的方式。简单来说,Docker 是一个开源的容器化平台,它通过将应用程序及其依赖环境打包成一个轻量级、可移植的容器,实现了 “一次构建,到处运行” 的终极目标。

二、为什么需要Docker?

在学习技术之前,我们先搞懂一个问题:为什么要用 Docker?

如果你经历过这些场景,那 Docker 就是为你准备的:

  • 开发时:“我本地能跑啊,怎么到你那就报错了?”
  • 部署时:“服务器环境少了个依赖,等我装一下... 哦不对,版本不对!”
  • 运维时:“这台服务器跑了 10 个应用,资源互相抢占,崩溃了都不知道是谁的锅。”

        Docker 的出现就是为了解决这些问题。它通过容器化技术,把应用和依赖 “打包” 成一个独立的 “容器”,实现了 “一次构建,到处运行”。无论在开发机、测试环境还是生产服务器,容器里的应用运行结果完全一致,彻底告别 “环境不一致” 的噩梦。

三、Docker 的核心概念

要理解 Docker,需先掌握以下核心概念:

1. 镜像(Image)

  • 定义:镜像可以理解为一个 “只读模板”,包含了运行应用所需的代码、库、环境变量、配置文件等所有依赖。例如,一个 Nginx 镜像包含了 Nginx 服务器的所有运行文件。
  • 特性
    • 只读性:镜像一旦构建完成,就无法修改,确保环境一致性。
    • 分层存储:镜像由多个只读层叠加而成,相同层可被多个镜像共享,节省存储空间。
    • 可继承性:通过 Dockerfile 基于基础镜像(如 ubuntucentos)构建新镜像,简化配置。

2. 容器(Container)

  • 定义:容器是镜像的运行实例,是镜像在内存中的动态表现形式。它在镜像的只读层之上添加了一个可写层,所有运行时的修改(如文件创建、配置变更)都保存在这一层。
  • 特性
    • 隔离性:容器之间通过 namespace 隔离进程、网络、文件系统等资源,互不干扰。
    • 轻量级:容器共享宿主机的内核,无需像虚拟机一样模拟完整操作系统,启动速度快(秒级)、资源占用低。
    • 可移植性:相同镜像在任何支持 Docker 的环境中运行结果一致,解决 “开发环境能跑,生产环境报错” 的问题。

3. 仓库(Repository)

  • 定义:仓库是用于存放和分发 Docker 镜像的平台,类似代码仓库(如 GitHub),你可以从仓库拉取别人做好的镜像,也可以把自己构建的镜像推到仓库分享。。
  • 常见仓库
    • Docker Hub:官方公共仓库Docker Hub(https://hub.docker.com/),里面有数十万现成的镜像(比如 MySQL、Redis、Nginx 等),直接拿来就能用。。
    • 私有仓库:企业或团队内部搭建的仓库(如 Harbor),用于存储私有镜像,保障安全性。

四、Docker 安装:3 步搞定环境搭建

接下来我们动手安装 Docker,支持 Windows、macOS 和 Linux,步骤都很简单:

1. Windows 安装

  • 系统要求:Windows 10/11 专业版 / 企业版(需开启 Hyper - V),或使用 WSL2;
  • 下载地址:Docker Desktop for Windows;
  • 安装:双击安装包,一路 “下一步”,安装完成后启动 Docker(桌面会出现鲸鱼图标)。

2. Linux 安装(以 Ubuntu 为例)

# 更新包索引
sudo apt-get update
# 安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装(运行hello-world)
sudo docker run hello-world

安装完成后,运行docker --version查看版本,出现类似Docker version 24.0.6, build ed223bc的输出就说明安装成功了!

五、Docker 的基本工作流程

  1. 构建镜像
    通过编写 Dockerfile 定义镜像的构建步骤(如基础镜像选择、依赖安装、应用部署等),然后执行 docker build 命令生成镜像。
    示例 Dockerfile 片段:

    FROM python:3.9  # 基础镜像
    WORKDIR /app      # 工作目录
    COPY . .          # 复制本地文件到容器
    RUN pip install -r requirements.txt  # 安装依赖
    CMD ["python", "app.py"]  # 容器启动命令
    

  2. 分发镜像
    将构建好的镜像推送到仓库(如 Docker Hub 或私有仓库),供其他环境或团队成员使用。

  3. 运行容器
    从仓库拉取镜像,通过 docker run 命令创建并启动容器,指定端口映射、数据卷挂载等参数。
    示例:docker run -d -p 8080:80 --name myapp myapp:v1
    (-d 后台运行,-p 端口映射,--name 容器名称)

  4. 管理容器生命周期
    通过命令停止(docker stop)、启动(docker start)、删除(docker rm)容器,或查看日志(docker logs)、进入容器(docker exec)等。

六、Docker 常用命令

操作场景命令示例说明
镜像相关docker pull [镜像名]从仓库拉取镜像
docker build -t [镜像名:版本] .基于 Dockerfile 构建镜像
docker images查看本地镜像列表
容器相关docker run -d -p 80:80 --name [容器名] [镜像名]创建并启动容器(-d 后台运行,-p 端口映射)
docker ps查看运行中的容器
docker ps -a查看所有容器(包括停止的)
docker stop [容器名/ID]停止容器
docker rm [容器名/ID]删除容器
仓库相关docker push [镜像名:版本]推送镜像到仓库

六、实战:用 Docker 部署一个 Node.js Web 应用

光说不练假把式,我们来实战部署一个简单的 Node.js Web 应用,体验完整的 Docker 流程:

1. 准备应用代码

创建一个简单的 Node.js 应用,目录结构如下:

myapp/
├── app.js       # 应用代码
├── package.json # 依赖配置
└── Dockerfile   # Docker构建文件

app.js内容:

const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {res.statusCode = 200;res.setHeader('Content-Type', 'text/plain');res.end('Hello Docker! This is my Node.js app.\n');
});
server.listen(port, () => {console.log(`Server running at http://localhost:${port}/`);
});

package.json内容:

{"name": "my-docker-app","version": "1.0.0","main": "app.js","dependencies": {}
}

2. 编写 Dockerfile:定义镜像构建规则

Dockerfile是构建镜像的 “说明书”,内容如下:

# 基础镜像:使用Node.js官方镜像(包含Node环境)
FROM node:16-alpine# 设置工作目录(容器内的目录)
WORKDIR /app# 复制本地文件到容器的工作目录
COPY package*.json ./
COPY app.js ./# 安装依赖(因为package.json中无依赖,这步可省略,但保留规范)
RUN npm install# 暴露容器的3000端口(告诉Docker容器会使用这个端口)
EXPOSE 3000# 容器启动命令(运行Node应用)
CMD ["node", "app.js"]

3. 构建镜像与运行容器

# 进入myapp目录,构建镜像(-t指定镜像名和版本)
docker build -t my-node-app:v1 .# 查看构建好的镜像
docker images | grep my-node-app
# 输出:my-node-app   v1        abc123456789   1 minute ago   110MB# 运行容器(映射宿主机3000端口到容器3000端口)
docker run -d -p 3000:3000 --name myapp-container my-node-app:v1# 访问应用:打开浏览器访问 http://localhost:3000,能看到“Hello Docker! This is my Node.js app.”就成功了!

4. 推送镜像到仓库(可选)

如果你想把镜像分享给团队或部署到服务器,可以推送到 Docker Hub(需先注册账号并登录):

# 登录Docker Hub
docker login# 给镜像打标签(格式:用户名/镜像名:版本)
docker tag my-node-app:v1 你的用户名/my-node-app:v1# 推送镜像到仓库
docker push 你的用户名/my-node-app:v1

 七、Docker 进阶:数据持久化与网络配置

实际应用中,我们还需要解决数据持久化(容器删除后数据不丢失)和容器间通信的问题。

1. 数据卷(Volume):让数据 “长生不老”

容器内的数据默认是临时的,容器删除后数据会丢失。用数据卷可以将容器内的目录映射到宿主机,实现数据持久化:

# 创建数据卷
docker volume create nginx-data# 运行Nginx容器并挂载数据卷(将容器的/usr/share/nginx/html目录映射到nginx-data卷)
docker run -d -p 8080:80 -v nginx-data:/usr/share/nginx/html --name mynginx nginx# 现在往宿主机的数据卷目录写文件,容器内会同步(数据卷在宿主机的路径可通过docker inspect查看)

2. 网络配置:让容器 “互联互通”

Docker 默认提供了桥接网络,容器可以通过名称或 IP 通信:

# 创建自定义网络
docker network create my-network# 运行两个容器并加入同一网络
docker run -d --name app1 --network my-network my-node-app:v1
docker run -d --name app2 --network my-network nginx# 在app1容器中访问app2(通过容器名)
docker exec -it app1 ping app2
# 能ping通说明网络连通成功

八、总结与后续学习方向

通过这篇文章,你已经掌握了 Docker 的核心概念、安装方法、基础命令和实战部署流程。Docker 的核心价值在于环境一致性、轻量级隔离和快速部署,这些特性让它成为现代软件开发和云原生架构的基石。

后续可以深入学习这些内容:

  • Docker Compose:多容器应用编排工具,通过 yaml 文件定义多个容器的关系;
  • Docker Swarm:Docker 原生的容器集群管理工具;
  • Kubernetes(K8s):容器编排王者,用于大规模容器集群的管理(Docker 是基础);
  • Docker 进阶技巧:镜像优化(减小体积)、多阶段构建、私有仓库搭建等。

Docker 不难,多动手实践就能熟练掌握。从今天开始,用 Docker 规范你的开发环境,提升部署效率吧!如果有问题,欢迎在评论区交流~

 

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

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

相关文章

学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)

文章目录前言数据库设计秒杀商品列表页秒杀商品详情实现简单秒杀订单详情前言 由于慕课课程中是先实现最基本的功能然后对其压测,压测那个地方出问题,然后在对其优化。所以本文记录的也是实现的是简单的秒杀功能没有涉及到高并发的优化。 数据库设计 …

React 的常用钩子函数在Vue中是如何设计体现出来的。

1、定义响应式数据: React 通过 useState 和 useReducer Vue 通过 ref 和 reactiveconst [state, setState] useState(initialState)const [state, dispatch] useReducer(reducer, initialState)2、定义缓存数据: React 通过 memo 和 useMemo useCal…

开源的 H.264/AVC 视频编码器库-x264 的交叉编译 和 程序测试

一、环境准备 安装交叉编译工具链 根据目标ARM架构选择对应工具链(如arm-linux-gnueabihf-):# Ubuntu/Debian系统 sudo apt-get install gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf# 验证安装 arm-linux-gnueabihf-gcc --version或者手动…

自由学习记录(69)

RectToPolar() 是 将直角坐标系 (笛卡尔坐标系) 的 uv 坐标,转化为极坐标系(θ,r) uv - centerUV:将坐标原点平移,使 (0.5, 0.5) 变成原点。 r length(uv):距离中心点的半径(从中…

Spring Boot 敏感信息入库加密全面解决方案

Spring Boot 敏感信息入库加密全面解决方案 在当今数据驱动的时代,保护用户隐私数据已成为系统设计的必备要求。本文将详细介绍 Spring Boot 应用中敏感数据加密存储的完整方案,涵盖从基础实现到生产级落地的全流程。 一、加密方案选型 1.1 常见加密类型对比 加密类型特点…

docker0网卡没有ip一步解决

正常查看ip的时候一直显示没有ip这里先删除docker0网卡ip link delete docker0然后重启服务systemctl restart docker再次查看显示有ip了并且查看配置文件也是正常的cat /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io",&q…

MYSQL-索引篇

索引结构概述MySQL 的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:索引结构描述BTree索引最常见的索引类型,大部分引擎都支持 B 树索引Hash索引底层数据结构是用哈希表实现的,只有精确…

(纯新手教程)HTML零基础教学

(下一章:python网络爬虫)HTML 简介HTML(HyperText Markup Language,超文本标记语言)是用于创建网页的标准标记语言。什么是 HTML?HTML 不是编程语言,而是一种标记语言使用标签来描述…

前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)

引言 在我参与智能问答项目中一个智能体回话并不会像豆包一样,每次新建会话都是是从头开始,而项目中你想创建新会话就像chatbox一样,是点击橡皮擦开启新的聊天上下文,但是直接的聊天记录依然存在,针对超过十万&#xf…

Python元组:不可变数据的强大用法

文章目录元组概念1.基本特性2.创建元组3.访问元素4.元组的不可变性5.元组操作6.元组解包7.命名元组8.元组与列表的比较9.元组的优势10.适用场景11.常用方法小结元组 概念 元组是 Python 中一个非常重要的内置数据结构,它与列表(list)相似但具有关键差异。下面我将…

若尔盖湿地的花湖

花湖位于若尔盖县和甘肃的郎木寺之间的213国道旁,属于若尔盖湿地国家级自然保护区内。又名“梅朵湖”,因阳光照射下湖面色彩斑斓如绚丽的花瓣得名。花湖的大门是梯形高大石柱搭成,我们需要过天桥到对面检票坐小交通。通过车窗看到一层一层的云…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleClickHeart(双击爱心)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DoubleClickHeart组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script se…

1-绪论-1-数据结构的基本概念

&#x1f389; 数据结构的魔法世界&#x1f4da;&#x1f468;‍&#x1f393;“数据就像大海中的浪花&#xff0c;结构则是那神秘的洋流。掌握数据结构&#xff0c;就是掌握在信息海洋中自由航行的力量&#xff01;”引言&#xff1a;为什么要学数据结构&#xff1f;&#x1f…

linux网络相关命令简介

目录 一、IP命令 1、Link或L:管理网络接口(网卡) 2、Address或Addr,A:管理Ip地址 3、Route或R:管理路由表

教育培训机构如何为课程视频添加防盗录的强水印?

在知识付费时代&#xff0c;教育培训机构的课程视频是核心资产&#xff0c;但盗录、非法传播等问题却让机构防不胜防。如何在不影响学员观看体验的前提下&#xff0c;为课程视频添加“强效防盗水印”&#xff0c;精准追踪泄露源头&#xff1f;本文将为您揭秘高安全性水印的添加…

python的形成性考核管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 摘要 随着…

A*算法详解

A*算法详解一、A*算法基础概念1.1 算法定位1.2 核心评估函数1.3 关键数据结构二、A*算法的核心步骤三、启发函数设计3.1 网格地图中的启发函数3.2 启发函数的选择原则三、Java代码实现四、启发函数的设计与优化4.1 启发函数的可采纳性4.2 启发函数的效率影响4.3 常见启发函数对…

.net winfrom 获取上传的Excel文件 单元格的背景色

需求&#xff1a;根据Excel某行标注了黄色高亮颜色&#xff0c;说明该行数据已被用户选中(Excel文件中并没有“已选中”这一列&#xff0c;纯粹用颜色表示)&#xff0c;导入数据到数据库时标注此行已选中直接上代码&#xff1a;//选择Excel文件private void btnBrowse_Click(ob…

OpenAI GPT-4o技术详解:全能多模态模型的架构革新与生态影响

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; ⚙️ 一、核心定义与发布背景 官方定位 GPT-4o&#xff08;“o”代表“…

⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现

引子 在前面的文章中&#xff0c;我们基于 Netty 构建了一套单体架构的即时通讯服务。虽然单体架构在开发初期简单高效&#xff0c;但随着用户量的增长和业务规模的扩大&#xff0c;其局限性逐渐显现。当面对高并发场景时&#xff0c;单体 Netty 服务很容易触及性能天花板&…