禅与计算机 禅与计算机
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sharkchili

计算机禅修者
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 微服务基础

  • Nacos

  • Seata

  • Docker部署

    • 一文快速掌握docker的理念和基本使用
      • 写在文章开头
      • 为什么需要docker
      • docker解决了哪些问题?
      • docker几个核心概念
        • 镜像
        • 容器
        • 仓库
      • docker安装
      • 基于docker部署nginx代理服务
      • docker网络介绍
      • 通过端口映射修改nginx对外端口
      • 基于docker部署一个MySQL数据库
      • 关于更多docker常用命令
        • 卸载docker
        • 搜索镜像
        • 下载镜像
        • 列出镜像
        • 删除镜像
        • 新建并启动容器
        • 停止容器
        • 进入容器
        • 退出容器
        • 删除容器
        • 查看日志
        • 查看docker性能开销
      • 小结
      • docker是如何工作的
      • 参考文献
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 注册服务到nacos
    • 微服务远程调用openFeign整合
    • 微服务配置隔离
    • 整合服务网关gateway
    • 基于docker整合seata
    • 基于docker容器化部署微服务
    • 记一次Nacos容器升级调优
    • 基于压测进行Feign调优
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • 分布式微服务
  • Docker部署
sharkchili
2023-01-21
目录

一文快速掌握docker的理念和基本使用

# 写在文章开头

写于一个周末,在复盘梳理文章时候发现这一篇关于早期了解docker时记录的文档,仔细阅读了一下,为了保证文章更加清晰以便读者使用。故再次重新一次梳理一次,通过这篇文章,你将会对docker的基本理念和基础使用都有一个深刻的认识。

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili 。

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

# 为什么需要docker

  1. 快速获取开箱即用的程序:docker之间的镜像传输只需发送方将程序打包成镜像存放至码头,其他用户即可直接从码头获取,整个过程就像一只鲸鱼拖着货物来回运输一样。
  2. 修改方便:有了docker之后修改程序只需要使用一条命令就能够完成应用的快速修改,快速部署。
  3. 程序启动关闭方式统一:在使用docker之前,我们不同的程序启动命令各不相同,例如:nginx使用./nginx,tomcat使用./startup.sh,而docker将这些启动命令都封装了起来,启动程序的命令格式基本统一。
  4. 隔离:docker使用一种叫做LXC的轻量级容器化虚拟技术,通过cgroup和namespace限制进程组所用的CPU、内存等资源。而且相对于虚拟机而言,该技术创建一个隔离的空间更快、更高效。

# docker解决了哪些问题?

  1. 环境统一:就以tomcat为例,docker会把tomcat启动所需要的jdk等环境都配置好了,像一个集装箱一样打包到鲸鱼上,当我们需要tomcat时,一条命令即可获取到tomcat,然后开箱即用。

  2. 限定进程使用的内存大小:过去我们常常会遇到某个进程把内存打爆导致其他程序也崩溃的情况,有了docker之后,它会将进程非法使用内存时,将其直接杀死。

  3. 部署方便:就以tb双十一为例,在双十一这个节点时,我们可能需要搭建一个更加庞大的集群,过去搭建过程中,我们可能需要为每台服务器都配置jdk,tomcat、mysql等乱七八糟,由于集群数量庞大,手工一台台配置过去,将会耗费大量的人力物力。 我们只需基于镜像即可完成服务的部署。

# docker几个核心概念

# 镜像

镜像的英文名叫image,即我们打包好的应用镜像,本质来说就是快速构建程序的一个原料。 从本质上来说,image就是一些列文件的组合,可以包括程序运行文件,也可以包括环境配置文件等。 这里需要提到Linux的联合文件系统的概念,它使得操作系统中不同的层级的文件可以在某个统一的层级上看到。

例如我有有一个文件夹dir1里面有文件file1。还有一个文件夹dir2,里面有文件file2。通过联合文件系统我们就可以使得在最上层的文件夹dir3看到这两个文件夹的文件。

docker的镜像也是按照这种方式进行创建的,将操作系统引导、基础镜像、各种用户需要的程序进行分层,下层对于上层来说都是只读,然后加载成同一层级的目录供外界使用,这样的一个文件我们就称之为镜像。

# 容器

我们通过镜像创建的进程即称之为程序。我们完全可以把docker想象成一个虚拟机,唯一不同的时docker的文件系统是分层的,除了最上层的是可写的以外,其他层都是只读的。这就使得我们需要修改镜像文件时,它会把所需文件拷贝到最上层进行操作。 而docker进行容器构建时则是通过复制文件到最上层生成,这使得镜像不会被改变,这也是为什么我们可以很方便的通过一个镜像生成多个容器。

# 仓库

我们需要的镜像肯定都保存在某个仓库中,每次运输镜像都需要从这个仓库里查找,国内比较有名的大概就是网易蜂巢提供的镜像仓库,地址如下:

https://c.163yun.com/hub#/m/home/ (opens new window)

# docker安装

由于笔者使用centos进行安装,所以在安装前确认你的centos内核高于3.10,具体可以键入如下命令进行确认

uname -r 
1

以笔者为例,可以看到输出的版本为4,所以符合docker安装条件

4.19.91-24.1.al7.x86_64

1
2

在安装前我们需要确保移除旧依赖(卸载干净),首先杀次所有的docker进程:

ps -ef | grep docker
kill -9 pid
1
2

执行如下命令删除所有docker相关的目录:

rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker
1
2
3
4

再查找docker相关安装包并使用yum -y remove移除

yum list installed | grep docker
1

然后我们可以开始docker的安装步骤了,首先安装docker需要的依赖:

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
1
2
3

然后设置仓库地址:

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
1
2
3

最后就是键入yum命令安装docker了:

yum install docker-ce docker-ce-cli containerd.io
1

通过上述的步骤我们完成docker的安装后,即启动docker了:

# 启动
systemctl start docker
1
2

为了方便后续的使用,我们可以通过systemctl设置启动并加入开机启动:


#设置为开机启动
systemctl enable docker
1
2
3

很多读者在这一步很可能会出现下面这些错误:

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
1

这里我们按照要求键入status命令查看一下输出:

systemctl status docker.service

1
2

若你和笔者一样键入查看docker状态的命令后输出下面的结果的话,你就可以和笔者一样步骤进行修复,反之则需自行百度:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2023-12-16 07:42:02 EST; 8s ago
     Docs: http://docs.docker.com
# 略

Dec 16 07:42:02 MiWiFi-R1D-srv dockerd-current[29413]: Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer ...bled=false)
1
2
3
4
5
6
7

很明显报错原因是我们的Linux服务器的内核中的SELinux不支持 overlay2 graph driver ,所以我们需要修改docker配置避免这个校验:

vim /etc/sysconfig/docker
1

从下图可以看出,笔者将--selinux-enabled=false

完成之后再次启动docker就可以正常启动了。

然后再修改docker的源地址,改为阿里云,方便我们后续可以快速获取自己需要的镜像,首先我们需要编辑daemon.json(若不存在则新建):

vim /etc/docker/daemon.json
1

加入如下内容:

{
"registry-mirrors": ["https://fy707np5.mirror.aliyuncs.com"]
}
 

1
2
3
4
5

完成后重启docker

systemctl daemon-reload
systemctl restart docker
1
2

我们分别键入docker version和run命令,如果都有输出结果则说明本次docker安装配置成功了,以下这段输出就是运行docker run hello-world,成功的输出结果:


Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 基于docker部署nginx代理服务

首先我们得打开网易蜂巢镜像中心 https://c.163yun.com/hub#/m/home/ (opens new window)

进入网站后,搜索nginx镜像

如下图所示,最上方就是最新的,我们点进去复制拉取命令进行镜像拉取

点击复制:

回到输入docker pull 并粘贴刚刚复制的地址

docker pull hub.c.163.com/library/nginx:latest
1

完成后键入如下命令查看是否有nginx镜像:

docker images

1
2

可以看到笔者已经成功安装拉到nginx镜像了:

完成后我们即可启动nginx了,下面是前台运行的方式,笔者不建议使用,这里只做个展示

docker run hub.c.163.com/library/nginx
1

我们添加-d 进行后台启动

docker run -d hub.c.163.com/library/nginx
1

键入下面这个指令查看nginx是否运行成功

 docker ps
1

可以看到笔者的nginx已经成功运行了

我们都知道nginx默认端口是80,所以在浏览器键入ip地址能看到下图所示的页面说明docker部署nginx成功了

使用docker ps查看nginx进程id号

 docker ps|grep nginx

1
2

拿着CONTAINER ID运行命令docker exec -it 你的nginx CONTAINER ID bash,如下所示:

docker exec -it 5a2438be1163  bash

1
2

可以看到,我们就像进入一个新的操作系统一样操作的nginx容器

使用ps -ef确认nginx是否在这容器中运行,需要注意的是容器内部可能没有ps命令,我们需要使用如下两条命令安装一下

apt-get update
 
apt-get install procps
1
2
3

完成后我们再次键入ps -ef即可看到nginx是否在运行了

同样的,我们还可以使用which命令看看nginx位置

which nginx

1
2

我们可以使用exit退出容器

如下所示,键入exit即可回到操作系统的终端界面

exit
1

停止nginx

有了上文的基础,相信读者也对docker操作有所感觉,停止也很简单,使用docker ps找到对应容器id,使用stop命令即可,如下所示

docker ps
1

停止

 docker stop 5a2438be1163
1

使用docker ps可以看出nginx已经成功停止了

# docker网络介绍

我们都知道docker的隔离性,网络也是个隔离性的一部分,Linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.

  1. docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式(可以理解为虚拟机的那种桥接模式)。

因为Bridge使用的独立的network-namespace,这就我们需要使用桥接的方式的服务器和docker容器的端口构成映射关系确保外部用户可以通过映射端口来访问docker容器。

  1. 还有一种类型是Host模式(仅主机模式),如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的。

  2. 还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯。

# 通过端口映射修改nginx对外端口

docker run -d -p 8081:80 hub.c.163.com/library/nginx

1
2

可以看到8081也可以正常访问

这里补充一下docker也支持随机分配映射端口,使用-P即可

docker run -d -P hub.c.163.com/library/nginx
1

# 基于docker部署一个MySQL数据库

  1. 拉MySQL镜像到本地
 docker pull hub.c.163.com/library/mysql:latest
1
  1. 键入run命令运行MySQL
 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=XXXX hub.c.163.com/library/mysql

1
2
  1. 查看mysql对应容器id
docker ps |grep mysql
1
  1. 进入容器内部进行配置
docker exec -it f17636c0e3f2  bash
1
  1. 配置账户密码对外放权限,首先我们需要输入下面这段命令登录MySQL,密码为启动时设置的密码
mysql -u root -p
1

设置用户权限

# 使用MySQL
use mysql;

# 查询user表
select host,user from user;
# 修改root用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
# 刷新
flush privileges;
1
2
3
4
5
6
7
8
9

创建一个名为test的数据库,并创建account表,语句如下:

CREATE DATABASE test;


-- create table `account`
# DROP TABLE `account` IF EXISTS
CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `money` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'aaa', '1000');
INSERT INTO `account` VALUES ('2', 'bbb', '1000');
INSERT INTO `account` VALUES ('3', 'ccc', '1000');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. 本地尝试连接MySQL数据库

这里笔者遇到了一个坑,不知道为什么本地连接不到mysql上,明明将虚拟机的防火墙也关了为什么还连接不上呢? 在经过确认ip地址准确,防火墙也是绝对肯定关闭的情况下,这就说明我们的设置没有问题,但肯定是哪个配置出问题了,于是笔者使用telnet进行确认

telnet 192.168.0.128 3306
1

果然有问题,于是我们就需要再次通过搜素引擎解决问题了,但是我们该如何使用搜素引擎呢? 笔者认为面对这种问题,都需要对问题的现象关键字加以搜索例如

centos 关闭防火墙 无法访问
1

于是笔者找到了这篇文章 linux关闭防火墙了,但端口还是访问不了 (opens new window)

真相大白了,centos即使关闭了防火墙,也只能使用22端口连接ssh,别的端口还是不能用,所以我们需要开启防火墙手动设置要分开的端口,就以mysql为例,我们需要这样做。

  1. 先开启firewalld:
systemctl start firewalld
1
  1. 放通端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent

1
2
  1. 重新加载配置文件
firewall-cmd --reload
1

尝试本地连接到docker上的数据库,如果可以查询到数据则说明MySQL部署成功了

# 关于更多docker常用命令

# 卸载docker

  1. 卸载docker软件包
yum -y remove docker-engine
1
  1. 若需要删除镜像、容器、卷以及自定义配置文件,可执行以下命令
rm -rf /var/lib/docker
1

# 搜索镜像

例如我们想搜索java相关的镜像

docker search java

1
2

可以得到这样的结果。每一列的意思分别是 NAME:镜像仓库名称 DESCRIPTION:镜像仓库描述 STARS:收藏数 OFFICIAL:表这个仓库是否是官方仓库,若显示ok则说明是官方创建和维护的

NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
node                                 Node.js is a JavaScript-based platform for s…   11312     [OK]

1
2
3

# 下载镜像

 docker pull java
1

# 列出镜像

使用这条命令就可以知晓我们之前所下载的镜像

docker images

1
2

下图列意依次为:

  1. REPOSITORY:镜像所属仓库
  2. TAG:镜像标签,默认lastest,即最新版
  3. IMAGE ID:镜像id
  4. CREATED:镜像创建的时间
  5. SIZE:镜像大小

# 删除镜像

如下所示,即意为删除java的镜像

docker rmi java
1

# 新建并启动容器

使用docker run即可创建并启动一个容器,这是最常用的一个命令,他还有很多的选项如下所示

-d 表示后台运行
-P 随机端口映射
-p 指定端口映射,有以下四种格式
	ip:hostPort:containerPort
	ip::containerPort
	containerPort


--network选项:指定docker的网络模式,该选项有以下几个参数
--network=bridge 连接默认网桥
--network=host 仅主机
--network=container:Name_or_I:这种就是格式docker让新建的容器使用已有容器的网络配置
--network=none 无网络配置
1
2
3
4
5
6
7
8
9
10
11
12
13

例如: 使用映射端口的形式运行nginx

docker pull nginx
 docker run -d -p 91:80 nginx
1
2

# 停止容器

  1. 找到运行容器的id
 docker ps
1

如下图所示,可知nginx的container id为c93a0e0ac108

  1. 运行stop命令
docker stop c93a0e0ac108
1

再次使用docker ps可以看到这个容器已经被关闭了

当然如果我们需要再开启还可以使用docker start 容器id启动

docker start c93a0e0ac108
1

# 进入容器

docker exec -it 容器id bash
1

# 退出容器

键入命令exit即可退出容器,回到终端界面

# 删除容器

docker rm 容器id
1

# 查看日志

docker logs 容器id
1

# 查看docker性能开销

docker stats
1

# 小结

# docker是如何工作的

对应docker我们常用3个命令:

  1. docker build
  2. docker run
  3. docker pull

先来说说docker build,它会根据我们定义好的Dockerfile 读取相应的文件生成镜像存储到镜像库中,假如我们需要让这个镜像运行,只需用docker run命令指定这个程序,docker就会从注册表提取镜像,然后创建一个新的容器,并为这个容器创建读写文件系统,然后分配网络再启动,这个容器也就是一个docker进程。 假如我们希望获得别人的镜像文件,例如nginx官网提供的nginx镜像,我们就可以用docker pull从docker注册表中获取对应的镜像信息,然后拉取镜像存储到我们自己的镜像库。

我是 sharkchili ,CSDN Java 领域博客专家,开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili 。 因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

# 参考文献

docker入门利用docker部署web应用):http://t.csdn.cn/PYAr8 (opens new window)

只需三步,完美卸载Docker:https://blog.csdn.net/wangerrong/article/details/126750198 (opens new window)

解决docker启动报错“Error starting daemon: SELinux is not supported with the overlay2 graph driver on this:https://blog.csdn.net/haoding205/article/details/82492263 (opens new window)

Docker 是怎么工作的?:https://mp.weixin.qq.com/s/TA9oDm6_BqBShgVkAOVx3A (opens new window)

编辑 (opens new window)
上次更新: 2026/03/26, 01:05:31
深度剖析Seata源码
使用docker编排容器

← 深度剖析Seata源码 使用docker编排容器→

最近更新
01
基于EasyExcel实现高效导出
03-25
02
从开源框架中学习那些实用的位运算技巧
03-25
03
浅谈分布式架构设计思想和常见优化手段
03-25
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Evan Xu | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
×