当前位置: 首页 > backend >正文

Docker详细学习

Docker 详解:从零开始全面理解容器化技术

什么是 Docker?一个生动的比喻

想象一下您要搬家:

  • 传统方式:把家具、电器、日用品一个个打包,搬到新家后重新拆包、布置,可能还会发现有些东西不兼容(比如电源插座不匹配)

  • Docker方式:直接把整个房间(包括所有家具、装饰、电器)做成一个可移动的"集装箱",搬到任何地方都能立即使用,环境完全一致

Docker 就是这个"应用集装箱"系统,它让应用程序及其所有依赖项被打包在一起,可以在任何支持 Docker 的环境中一致地运行。

Docker和容器是两个不同的概念,Docker只是一个容器化的解决方案和平台。容器是一种虚拟化技术,和虚拟机类似,也是一个独立的环境,可以在这个环境中运行应用程序,和虚拟机不同的是,它并不需要运行一个完整的操作系统,而是使用宿主机的操作系统

Docker是cs架构模式

容器化:将应用程序打包成容器,然后再容器中运行应用程序的过程

容器化过程 :1.创建一个dockerfile,来告诉Docker构建应用程序镜像所需要的步骤和配置

                        2.使用Dockerfile来构建镜像  Dockerfile:包含一条条指令,用来告诉Docker如何来构建镜像,这个镜像中包括了我们应用程序执行的所有命令,各种依赖,配置环境和运行应用程序所需要的所有内容,一般包括:精简版的操作系统,比如Alpine,应用程序的运行时环境比如Nodejs,java,python,应用程序比如SpringBoot打包好的jar包,应用程序的第三方库或者包,应用程序的配置文件,环境变量等等,一般会在项目的根目录下,创建一个叫Dockerfile的文件,Docker就会根据Dockerfile文件来构建一个镜像

                        3.使用镜像来创建和运行容器,

Docker可视化软件

Docker Compose是由Docker官方开源的项目,是一个用来定义和运行多个Docker容器应用程序的工具,如果想要搭建一个网站的话,可能会使用到前端,后端,数据库,缓存,负载均衡多个服务器,这些服务器是独立的,但是它们之间是有关联的,需要相互配合来工作,前端需要连接后端,后端要连接数据库。Docker Compose通过一个单独的docker-compose.yaml的配置文件。来将这一组互相关联的容器组合在一起。形成一个项目,然后使用一条命令就可以就启动,停止或者重建这些服务。只需要执行下docker compose up命令,就可以自动安装各种依赖和配置运行环境,然后在本地运行项目

Docker 的核心概念

1. 镜像 (Image)   相当于c++中的类,是一个模板

就像应用程序的"模板"或"蓝图"

  • 包含运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件

  • 类似于虚拟机的 ISO 安装镜像,但更轻量级

  • 可以基于其他镜像构建,形成层次结构

2. 容器 (Container)    相当于c++中的实例,可以创建多个

是镜像的运行实例

  • 就像基于蓝图建造的实际房屋

  • 是轻量级、可执行的软件包

  • 相互隔离,但共享主机操作系统内核

  • 可以启动、停止、移动和删除

3. Dockerfile

构建镜像的"食谱"或"说明书"

  • 文本文件,包含一系列构建镜像的指令

  • 每条指令在镜像中创建一个层

4. Docker Compose

用于定义和运行多容器应用程序的工具

  • 使用 YAML 文件配置应用程序的服务

  • 一条命令就可以启动和运行整个应用栈

Docker 与传统虚拟机的区别

特性传统虚拟机Docker 容器
隔离级别操作系统级别进程级别
启动时间分钟级秒级
性能损耗高(15-20%)低(1-5%)
磁盘占用GB 级MB 级
隔离性完全隔离进程隔离
镜像大小
部署速度

图示对比:

text

传统虚拟机架构:
┌─────────────────────────────────┐
│          应用程序 1              │
├─────────────────────────────────┤
│            Guest OS             │
├─────────────────────────────────┤
│            Hypervisor           │
├─────────────────────────────────┤
│            Host OS              │
├─────────────────────────────────┤
│            Hardware             │
└─────────────────────────────────┘Docker 容器架构:
┌─────────────────┬─────────────────┐
│   应用程序 1     │   应用程序 2     │
├─────────────────┴─────────────────┤
│           Docker Engine           │
├───────────────────────────────────┤
│             Host OS               │
├───────────────────────────────────┤
│             Hardware              │
└───────────────────────────────────┘

为什么您的聊天服务器项目使用 Docker?

您的项目需要多个服务协同工作:

  1. MySQL - 存储用户数据、聊天记录

  2. Redis - 处理会话缓存、消息队列

  3. Kafka (可选) - 消息队列系统

  4. Nginx - 负载均衡和反向代理

  5. 聊天服务器本身 - 处理业务逻辑

不使用 Docker 的挑战:

  • 需要手动安装和配置每个服务

  • 解决依赖冲突和版本兼容性问题

  • 不同的环境(开发、测试、生产)配置可能不一致

  • 服务之间的网络连接需要手动配置

使用 Docker 的优势:

  • 一键启动所有服务,自动配置网络连接

  • 环境一致性,避免"在我机器上能运行"的问题

  • 依赖隔离,避免污染主机系统

  • 快速重建和恢复环境

Docker 详细使用指南

1. 在 Ubuntu 上安装 Docker

bash

# 更新软件包索引
sudo apt update# 安装依赖包
sudo apt install apt-transport-https ca-certificates curl software-properties-common# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 添加 Docker 仓库
echo "deb [arch=amd64 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# 更新软件包索引(再次)
sudo apt update# 安装 Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io# 验证 Docker 是否安装成功
sudo docker run hello-world# 将当前用户添加到 docker 组,避免每次使用 sudo
sudo usermod -aG docker $USER# 需要注销并重新登录使组更改生效

2. 安装 Docker Compose

bash

# 下载 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose --version

3. 使用 Docker 运行您的聊天服务器

bash

# 进入项目目录
cd /home/song/workspace/chatserver# 使用 Docker Compose 启动所有服务(在后台运行)
docker-compose up -d# 查看运行中的容器
docker-compose ps# 查看容器日志
docker-compose logs# 停止所有服务
docker-compose down

4. 常用 Docker 命令

bash

# 查看 Docker 信息
docker info# 列出正在运行的容器
docker ps# 列出所有容器(包括已停止的)
docker ps -a# 查看镜像列表
docker images# 运行一个容器
docker run [选项] 镜像名 [命令]# 停止容器
docker stop 容器名或ID# 启动已停止的容器
docker start 容器名或ID# 进入运行中的容器
docker exec -it 容器名或ID /bin/bash# 查看容器日志
docker logs 容器名或ID# 删除容器
docker rm 容器名或ID# 删除镜像
docker rmi 镜像名或ID# 构建镜像(需要在 Dockerfile 所在目录)
docker build -t 镜像名:标签 .

Docker 在您项目中的具体工作流程

  1. 定义服务:在 docker-compose.yml 文件中定义 MySQL、Redis 等服务

  2. 配置环境:设置环境变量、端口映射、数据卷等

  3. 一键启动:使用 docker-compose up -d 启动所有服务

  4. 自动配置:Docker 会自动:

    • 下载所需的镜像(如果本地没有)

    • 创建容器并配置网络

    • 设置服务之间的连接

    • 初始化数据库和数据

  5. 运行应用:编译并运行您的聊天服务器,它会自动连接到 Docker 启动的服务

实际示例:查看您的聊天服务器 Docker 配置

如果您想查看项目的 Docker 配置,可以:

bash

# 查看 docker-compose.yml 文件内容
cat /home/song/workspace/chatserver/docker-compose.yml# 查看可能存在的 Dockerfile
find /home/song/workspace/chatserver -name "Dockerfile"

典型的 docker-compose.yml 文件可能包含如下内容:

yaml

version: '3.8'
services:mysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: mypasswordMYSQL_DATABASE: chatports:- "3306:3306"volumes:- mysql_data:/var/lib/mysqlredis:image: redis:alpineports:- "6379:6379"volumes:- redis_data:/datavolumes:mysql_data:redis_data:

学习 Docker 的建议路径

  1. 初级阶段:学会基本命令,运行现有容器

  2. 中级阶段:学习编写 Dockerfile,构建自定义镜像

  3. 高级阶段:掌握 Docker Compose,编排多容器应用

  4. 专家阶段:学习 Docker Swarm 或 Kubernetes,管理容器集群

总结

对于您的聊天服务器项目,使用 Docker 确实只需要在 Ubuntu 上安装 Docker 和 Docker Compose,然后运行提供的配置即可。Docker 会自动处理所有依赖服务的安装和配置,让您专注于应用程序本身的开发和测试。

Docker 的优势在于:

  1. 环境一致性:开发、测试、生产环境完全一致

  2. 快速部署:一键启动所有依赖服务

  3. 隔离性:服务之间互不干扰,也不会影响主机系统

  4. 可移植性:可以在任何支持 Docker 的系统上运行

  5. 版本控制:Dockerfile 和 docker-compose.yml 可以纳入版本控制

即使您之前没有接触过 Docker,按照上述步骤安装并使用项目提供的配置,应该能够顺利运行您的聊天服务器。Docker 的学习曲线相对平缓,一旦掌握,将极大提高您的开发效率。

http://www.xdnf.cn/news/18785.html

相关文章:

  • 【Protues仿真】定时器
  • 构建智能提示词工程师:LangGraph 的自动化提示词生成流程
  • [在实践中学习] 中间件理论和方法--Redis
  • WPF基于LiveCharts2图形库,实现:折线图,柱状图,饼状图
  • Python爬虫实战:研究开源的高性能代理池,构建电商数据采集和分析系统
  • Pycharm
  • ​告别复杂计划!日事清推出脑图视图,支持节点拖拽与聚焦模式,让项目管理更直观​
  • MySQL 入门
  • 虚幻5引擎:我们是在创造世界,还是重新发现世界?
  • 基于SpringBoot的摄影跟拍约拍预约系统【2026最新】
  • [CS创世SD NAND征文] CS创世CSNP1GCR01-AOW在运动控制卡中的高可靠应用
  • 神经网络参数量计算详解
  • 如何用企业微信AI解决金融运维难题,让故障响应快、客服专业度高
  • EB_NXP_K3XX_GPIO配置使用
  • 深入理解内存屏障(Memory Barrier):现代多核编程的基石
  • Java大厂面试实战:从Spring Boot到微服务架构的全链路技术拆解
  • 破解VMware迁移难题的技术
  • 给高斯DB写一个函数实现oracle中GROUPING_ID函数的功能
  • 性能瓶颈定位更快更准:ARMS 持续剖析能力升级解析
  • Docker Compose 使用指南 - 1Panel 版
  • NR --PO计算
  • nginx代理 flink Dashboard、sentinel dashboard的问题
  • 数据结构(时空复杂度)
  • 论文阅读(四)| 软件运行时配置研究综述
  • 推荐系统学习笔记(十四)-粗排三塔模型
  • iOS 审核 4.3a【二进制加固】
  • Web前端开发基础
  • sdi开发说明
  • Python在语料库建设中的应用:文本收集、数据清理与文件名管理
  • WebSocket简单了解