Docker 介绍与使用

Docker

文章目录

  • Docker
    • 介绍
      • 与虚拟机的比较
      • 启动速度
      • 占用资源
    • 优势
      • 更容易迁移
      • 更容易维护
      • 更容易扩展
    • 使用场景
      • 持续集成
      • 提供可伸缩的云服务
      • 搭建微服务架构
    • 镜像与容器
      • 镜像构成(分层结构)
      • 镜像与容器的区别
    • 安装 Docker
    • 常用命令介绍
      • 镜像相关
      • 容器相关
    • 实战:从构建到部署一个 Web 应用
      • 示例项目结构:
      • `app.js`
      • `package.json`
      • Dockerfile
      • 构建镜像
      • 运行容器
    • 使用 Docker Volume 实现持久化
      • 示例:MySQL 容器挂载本地目录
    • 多容器部署:Docker Compose 示例
      • 项目结构
      • docker-compose.yml
      • 构建并启动容器组
    • 容器之间通信
    • Docker 常用工具和高级功能
    • 清理命令合集
    • 参考资料

介绍

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包进一个轻量级、可移植的容器中,然后在任何支持 Docker 的平台上运行。
它的核心目标是“一次构建,到处运行”。

由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。

Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。


核心特点:

  • 镜像(Image):是一个只读的模板,包含运行应用所需的代码、库、依赖等。
  • 容器(Container):镜像的一个运行实例,是一个隔离的环境。
  • Dockerfile:用于构建镜像的脚本文件。
  • Docker Hub:一个公共的镜像仓库,也可以使用私有仓库。

与虚拟机的比较

虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。


启动速度

启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢;

而启动 Docker 相当于启动宿主操作系统上的一个进程。

占用资源

虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。

而 Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。

优势

除了启动速度快以及占用资源少之外,Docker 具有以下优势:

更容易迁移

提供一致性的运行环境。已经打包好的应用可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。

更容易维护

使用分层技术和镜像,使得应用可以更容易复用重复的部分。复用程度越高,维护工作也越容易。

更容易扩展

可以使用基础镜像进一步扩展得到新的镜像,并且官方和开源社区提供了大量的镜像,通过扩展这些镜像可以非常容易得到我们想要的镜像。

使用场景

持续集成

持续集成指的是频繁地将代码集成到主干上,这样能够更快地发现错误。

Docker 具有轻量级以及隔离性的特点,在将代码集成到一个 Docker 中不会对其它 Docker 产生影响。

提供可伸缩的云服务

根据应用的负载情况,可以很容易地增加或者减少 Docker。

搭建微服务架构

Docker 轻量级的特点使得它很适合用于部署、维护、组合微服务。

镜像与容器

镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。

镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,每一层都是只读的(read-only layers)。构建镜像时,会一层一层构建,前一层是后一层的基础。镜像的这种分层存储结构很适合镜像的复用以及定制。

构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。

镜像构成(分层结构)

每个镜像是多层构成的,比如:

FROM ubuntu:20.04     <- 基础层
RUN apt-get update    <- 新增一层
RUN apt install nginx <- 又新增一层
COPY . /app           <- 又一层

这些层具有缓存机制,因此只要上一层没变,Docker 会复用已有层来提高构建效率。


镜像与容器的区别

对象说明
镜像(Image)模板:不可变,类似于软件安装包
容器(Container)镜像的运行时实例,可修改状态、产生数据


安装 Docker

参考官网:https://docs.docker.com/get-docker/
主要支持 Windows、macOS、Linux 等系统,安装后可通过命令 docker --version 检查是否安装成功。


常用命令介绍

镜像相关

# 搜索镜像(如nginx)
docker search nginx# 拉取镜像
docker pull nginx# 查看本地镜像
docker images# 删除镜像
docker rmi 镜像ID或名称

容器相关

# 运行容器
docker run -d -p 8080:80 --name mynginx nginx
# -d 后台运行
# -p 映射端口(宿主机:容器)
# --name 给容器起个名字# 查看正在运行的容器
docker ps# 查看所有容器(包含停止的)
docker ps -a# 停止容器
docker stop 容器名或ID# 启动容器
docker start 容器名或ID# 进入容器交互终端
docker exec -it 容器名或ID bash# 删除容器
docker rm 容器名或ID

实战:从构建到部署一个 Web 应用

下面以构建一个简单 Node.js 应用为例,展示完整流程。

示例项目结构:

myapp/
│
├── app.js
├── package.json
└── Dockerfile

app.js

const express = require('express');
const app = express();
const port = 3000;app.get('/', (req, res) => res.send('Hello Docker!'));
app.listen(port, () => console.log(`Server running on port ${port}`));

package.json

{"name": "myapp","version": "1.0.0","dependencies": {"express": "^4.18.2"}
}

Dockerfile

# 基础镜像
FROM node:18# 创建工作目录
WORKDIR /usr/src/app# 拷贝依赖清单
COPY package*.json ./# 安装依赖
RUN npm install# 拷贝应用代码
COPY . .# 开放端口
EXPOSE 3000# 启动命令
CMD ["node", "app.js"]

构建镜像

docker build -t my-node-app .

运行容器

docker run -d -p 3000:3000 --name node-test my-node-app

此时访问浏览器 http://localhost:3000 即可看到输出。


使用 Docker Volume 实现持久化

Docker 中容器一旦销毁,其中的数据会丢失,因此常用 volume 保存持久化数据。

示例:MySQL 容器挂载本地目录

docker run -d \--name mydb \-e MYSQL_ROOT_PASSWORD=root \-v /my/local/mysql:/var/lib/mysql \mysql:8

容器内 /var/lib/mysql 的数据将映射到宿主机 /my/local/mysql,保证重启后数据不丢。


多容器部署:Docker Compose 示例

项目结构

myapp/
├── docker-compose.yml
├── app/
│   ├── app.js
│   ├── package.json
│   └── Dockerfile
└── db/

docker-compose.yml

version: '3.8'
services:web:build: ./appports:- "3000:3000"depends_on:- dbdb:image: mysql:8environment:MYSQL_ROOT_PASSWORD: rootvolumes:- db_data:/var/lib/mysqlvolumes:db_data:

构建并启动容器组

docker-compose up -d

容器之间通信

在 Compose 中,各服务默认加入同一网络,可以直接通过服务名访问:

// 在 web 服务代码中
mysql.createConnection({host: 'db',   // Compose 中的服务名user: 'root',password: 'root'
});

Docker 常用工具和高级功能

  • Docker Volume:管理数据持久化
  • Docker Network:自定义网络让容器之间安全通信
  • Docker Compose:本地开发和测试的神器
  • Dockerfile 构建优化
    • 多阶段构建(multi-stage)
    • 合理利用缓存层
    • 使用 .dockerignore 排除无关文件

清理命令合集

# 清除所有停止的容器
docker container prune# 清除未使用的镜像
docker image prune# 清理所有未使用的数据(包括镜像、容器、卷等)
docker system prune -a

参考资料

  • DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP
  • Docker 入门教程
  • Docker container vs Virtual machine
  • How to Create Docker Container using Dockerfile
  • 理解 Docker(2):Docker 镜像
  • 为什么要使用 Docker?
  • What is Docker
  • 持续集成是什么?

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

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

相关文章

《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架

第62篇&#xff1a;TypeChat——类型安全的大模型编程框架 摘要 在构建 AI 应用时&#xff0c;一个常见的痛点是大语言模型&#xff08;LLM&#xff09;输出的不确定性与格式不一致问题。开发者往往需要手动解析、校验和处理模型返回的内容&#xff0c;这不仅增加了开发成本&a…

upload-labs通关笔记-第5关 文件上传之.ini绕过

目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先创建一个文本文件 &#xff08;2&#xff09;保存文件名为.user.ini 2、制作jpg后缀脚本 &#xff08;1&#xff09;创建一个文本文件 &#xf…

为什么 Linux 上默认没有 host.docker.internal

在 Linux 环境中&#xff0c;host.docker.internal 是 Docker 为容器提供的一个特殊 DNS 名称&#xff0c;用于指向宿主机的 IP 地址&#xff08;类似 macOS/Windows 中的行为&#xff09;。但这个功能在 Linux 上默认不启用&#xff0c;需要手动配置才能使用。以下是详细解释和…

C++GO语言微服务和服务发现②

01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令&#xff1a;micro new --type srv test66 框架默认自带服务发现&#xff1a;mdns。 使用consul服务发现&#xff1a; 1. 初始consul服务发现&…

Redis--常见数据类型List列表

目录 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、内部编码 一、概念 列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&…

QListWedget控件使用指南

QListWedget公共函数 函数签名功能描述QListWidget(QWidget *parent nullptr)构造函数&#xff0c;创建一个QListWidget对象&#xff0c;可指定父部件&#xff08;默认为nullptr&#xff09;。virtual ~QListWidget()虚析构函数&#xff0c;释放QListWidget对象及其资源。voi…

Seata源码—1.Seata分布式事务的模式简介

大纲 1.Seata分布式事务框架简介 2.Seata AT模式实现分布式事务的机制 3.Seata AT模式下的写隔离机制 4.Seata AT模式下的读隔离机制 5.官网示例说明Seata AT模式的工作机制 6.Seata TCC模式的介绍以及与AT模式区别 7.Seata Saga模式的介绍 8.单服务多个库的分布式事务…

【Qt】之音视频编程2:QtAV的使用篇

QtAV 基本播放控制功能实现&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暂停、停止、快进快退、截屏 等功能。以下是具体实现方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…

歌词滚动效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置标签页图标 --><link rel"shortcut icon&…

基于大模型的TIA诊疗全流程智能决策系统技术方案

目录 一、多模态数据融合与预处理系统1.1 数据接入模块1.2 数据预处理伪代码二、TIA智能预测模型系统2.1 模型训练流程2.2 混合模型架构伪代码三、术中智能监测系统3.1 实时监测流程3.2 实时预测伪代码四、智能诊疗决策系统4.1 手术方案推荐流程4.2 麻醉方案生成伪代码五、预后…

Java 日期解析与格式化:从标准格式到自然语言解析

使用 Java 搭配 Apache Commons Lang3 和 Natty 库&#xff0c;实现灵活高效的日期解析与格式化。 一、背景 将不同格式的日期统一成一个格式。日期格式可能有以下几种类型&#xff1a; 标准格式&#xff1a;2024-02-28、14/05/2022、2002年5月6日非英文月份缩写&#xff1a;…

Room持久化库:从零到一的全面解析与实战

简介 在Android开发中,Room作为官方推荐的数据库持久化库,提供了对SQLite的抽象层,使得数据库操作更加安全、高效且易于维护。 Room通过注解处理器和编译时验证,显著降低了数据库操作的复杂度,同时支持响应式编程模式,使开发者能够轻松实现数据变化的实时监听。对于企业…

MySQL(6)如何删除数据库和表?

在 MySQL 中删除数据库和表是常见的管理操作。下面将详细介绍如何使用 SQL 语句以及图形化工具来删除数据库和表。 步骤一&#xff1a;连接 MySQL 服务器 首先&#xff0c;连接到 MySQL 服务器&#xff0c;可以使用命令行工具 mysql 或图形化工具如 MySQL Workbench。 使用命…

携固态电池、新形态钢壳叠片电池等产品 豪鹏科技将亮相CIBF 2025

携固态电池、新形态钢壳叠片电池等产品 豪鹏科技将亮相CIBF 2025 来源&#xff1a; 电池百人会-电池网 豪鹏科技&#xff08;展位号:14W001&#xff09;将携固态电池、新形态钢壳叠片电池及高安全性钠离子电池等前沿技术产品亮相CIBF 2025&#xff0c;凭借多年的技术积累和产…

React学习———useEffect和useLayoutEffect

useEffect useEffect是React的一个Hook&#xff0c;用于在函数组件中处理副作用。副作用包括数据获取、订阅、手动DOM操作以及其他需要再渲染后执行的操作 基本用法 useEffect(() > {// 副作用逻辑return () > {// 可选的清理函数} }, [依赖数组])第一个参数&#xff…

“天神之眼”计算平台的算力设计(预计500-1000 TOPS)

关于比亚迪“天神之眼”计算平台的算力设计&#xff08;预计500-1000 TOPS&#xff09;&#xff0c;其技术路径和行业意义值得深入探讨。以下从实现方式、技术挑战和行业影响三个维度展开分析&#xff1a; 1. 多芯片互联的技术实现路径 &#xff08;1&#xff09;芯片选型方案…

FPGA: Xilinx Kintex 7实现PCIe接口

在Xilinx Kintex-7系列FPGA上实现PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;接口&#xff0c;通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核&#xff0c;结合Vivado设计流程。以下是实现PCIe接口的详细步骤和关键点&#xff0c;适…

ArcGIS Desktop使用入门(二)常用工具条——图形

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

JT/T 808 通讯协议及数据格式解析

文章目录 一、引言二、协议数据帧结构三、消息头结构&#xff08;Message Header&#xff09;四、常用消息类型&#xff08;Message ID&#xff09;五、典型消息体结构解析六、数据转义规则七、校验码计算方法八、终端与平台通信流程示意&#xff08;简要&#xff09;九、平台接…

Rust 输出到命令行

Rust 输出到命令行 引言 Rust 是一门系统编程语言&#xff0c;以其高性能、内存安全、并发支持和零成本抽象等特性而闻名。在开发过程中&#xff0c;将 Rust 程序的输出传递到命令行是常见的需求。本文将详细介绍 Rust 输出到命令行的多种方法&#xff0c;帮助读者掌握这一技…