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

聊聊 Docker

聊聊 Docker

Docker 是什么?

定义

Docker

Docker 是一款 开源的应用容器引擎。

简单来说,就是 以容器虚拟化技术为基础的软件。可以把应用程序和所依赖的包一起打包到一个可移植的镜像中,发布到 Linux 或者 Windows 上运行。(代码 + 运行环境)

虚拟机与容器技术对比

虚拟机

虚拟机 可以高效使用计算机资源(比如可以解决同一种服务端口冲突、程序依赖版本库不同、进程受限制等问题) ,常见的虚拟机有: vmware、virtualbox

虚拟机的 底层原理 是基于 hypervisor(硬件抽象层) ,也叫 虚拟机监视器(VMM)

容器技术

是一种沙盒技术,相互之间不会有任何接口。将应用运行在容器中,容器之间隔离的。

容器技术更 关注应用本身,应用和所依赖环境的共享和复用。

LXC

Linux Container (简称 LXC),是一种内核轻量级的操作系统层虚拟化技术,容器化技术就是基于 LXC 实现的。

四个维度对比

四个维度对比

由此可见,为什么容器技术会出现,为什么容器技术会那么流行,是因为虚拟机有痛点的,容器技术就是为了解决这些痛点而生的。而 Docker 就是容器化技术的代表。

Docker 的应用场景

Docker 的应用场景

Docker 的实现原理与优势

Docker 的技术架构

Docker 是由 dotCloud 公司于 2013 年推出的产品,用 GO 语言编写的。

Docker 有两种发行版本 ,分别是 CE (Community Edition,社区版)和 EE (Enterprise Edition,企业版)。

Docker 是 C/S 架构。客户端(docker cli,执行程序),通过命令行和 API 形式与守护进程(docker daemon,提供 Docker 服务)进行通讯。

C/S 架构

通讯

举个具体的例子,在常见的虚拟机实现中,我们要搭建一套 LNMP 结构的服务,我们通常会建立一个虚拟机,在虚拟机中安装上 Linux 系统,之后分别安装 Nginx、MySQL 和 PHP。

而在 Docker 里,最佳的实践是分别基于 Nginx、MySQL 和 PHP 的镜像建立三个容器,分别运行 Nginx、MySQL 和 PHP ,而它们所在的虚拟操作系统也直接共享于宿主机的操作系统。

Docker 的实现原理

Linux 三大技术

Docker 的实现,主要归结于 Linux 的三大技术:命名空间(Namespaces)、控制组(Control Groups)和联合文件系统(Union FIle System)。
Docker 的实现归结于 Linux 三大技术

命名空间(Namespaces)

在编程语言中,命名空间的主要目的就是为了集合相同模块的类,区分不同模块间的同名类。
Linux 内核的命名空间,就是 能够将计算机资源进行切割划分,形成各自独立的空间。
如 User Namespace、Net Namespace、PID Namespace、Mount Namespace 等等。

命名空间(Namespaces)

利用 PID Namespace,Docker 就实现了容器中隔离程序运行中进程隔离这一目标。

控制组(Control Groups)

资源控制组的作用就是 控制计算机资源 。CGroups 主要做的是硬件资源的隔离。 除了资源的隔离,还有资源分配这个关键性的作用。

通过 CGroups,我们 可以指定任意一个隔离环境对任意资源的占用值或占用率 ,这对于很多分布式使用场景来说是非常有用的功能。

控制组(Control Groups)

联合文件系统(Union FIle System)

一种能够 同时挂载不同实际文件或文件夹到同一目录,形成一种联合文件结构的文件系统。

联合文件系统(Union FIle System)

Docker 用它解决虚拟环境对文件系统占用过量,实现虚拟环境快速启停等问题。

Docker 大幅减少了虚拟文件系统对物理存储空间的占用。(例子:Git,Git 中每进行一次提交,Git 并不是将我们所有的内容打包成一个版本,而只是将修改的部分进行记录,这样即使我们提交很多次后,代码库的空间占用也不会倍数增加)

Docker 的优势

  1. 应用的安全性、可移植性和节约成本;
  2. 让自动化部署更简单(持续集成CI和持续部署CD,快速交付);
  3. 加速应用架构现代化进程(如微服务架构);
  4. 充分利用服务器资源;
  5. 跨平台部署和动态伸缩(如使用K8s编排工具管理)。

Docker 的安装

macos 安装

安装教程:https://www.runoob.com/docker/macos-docker-install.html

windows 安装

安装教程:https://www.runoob.com/docker/windows-docker-install.html 或者
https://blog.58heshihu.com/index.php/archives/286/

Linux 安装

centos:https://www.runoob.com/docker/centos-docker-install.html
ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html

Docker 的四大核心组成

Docker 的四大核心组成

镜像(Image)

可以理解为 一个只读的文件包,其中包含了虚拟环境运行最原始文件系统的内容。

镜像(Image)

查看镜像列表:docker images

查看镜像列表:docker images

镜像命名格式:开发者 / 镜像名字:版本号

镜像命名格式:开发者 / 镜像名字:版本号

拉取: docker pull 镜像名称

拉取: docker pull 镜像名称

搜索: docker search 镜像名称 //从docker hub搜索

镜像详细信息: docker inspect 镜像名称/ID

删除镜像: docker rmi 镜像名称/ID

容器(Container)

简介

在容器技术中, 容器就是用来隔离虚拟环境的基础设施,而在 docker 里,它也被引申为隔离出来的虚拟环境。

容器包括

  • 一个 Docker 镜像
  • 一个程序运行环境
  • 一个指令集合

容器的生命周期

  • Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态
  • Running:容器正在运行,也就是容器中的应用正在运行
  • Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态
  • Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止
  • Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除

常用命令

查看正在运行的容器列表:docker ps
所有容器:docker ps -a
创建启动容器:docker run --name redis -d redis:5.0.15
停止容器:docker stop 容器名字/ID
启动/重启容器:docker start/restart 容器名字/ID
删除容器:docker rm [-f] //-f强制,可以删除正在运行的容器
进入容器:docker exec -it redis bash //容器内部是虚拟出来的一个Linux
查看容器报错信息:docker logs 容器ID

网络(Network)

容器网络 实质上也是由 Docker 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。

网络(Network)

  • 沙盒(Sandbox)提供了容器的虚拟网络栈,也就是之前所提到的端口套接字、IP 路由表、防火墙等的内容。其实现隔离了容器网络与宿主机网络,形成了完全独立的容器网络环境

  • 网络(Network)可以理解为 Docker 内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker 的这种虚拟网络也是于宿主机网络存在隔离关系的,其目的主要是形成容器间的安全通讯环境

  • 端点(Endpoint)是位于容器或网络隔离墙之上的洞,其主要目的是形成一个可以控制的突破封闭的网络环境的出入口。当容器的端点与网络的端点形成配对后,就如同在这两者之间搭建了桥梁,便能够进行数据传输了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuxNurAy-1692625431644)(http://flt-pan.58heshihu.com/blog/typecho/llkx21og.png)]

Docker 容器网络一共有 5 种网络驱动 ,网络驱动,分别是: Bridge Driver(网桥 默认)、Host Driver、Overlay Driver(集群)、MacLan Driver、None Driver。

Docker 容器网络一共有 5 种网络驱动

容器之间以及宿主机与容器之间可以通过端口来进行访问。

常用命令

查看网络列表:docker network ls
容器加入网络:

docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes --network network_name mysql:5.7
docker run -d --name php --link mysql --network network_name php:latest

端口映射:

docker run -d --name nginx -p 8080:80 nginx:1.12 //80为容器的端口,8080可为宿主机或别的容器的端口

数据卷(Volume)

在 Docker 中,通过 bind mount、volume、tmpfs mount 这几种方式进行数据共享或持久化的文件或目录,我们都称为数据卷 (Volume)。

数据卷(Volume)

Docker 的数据卷一共 有 3 中挂载方式 ,分别是: Bind Mount、Volume、Tmpfs Mount

  • Bind Mount 能够直接将宿主操作系统中的目录和文件挂载到容器内的文件系统中,通过指定容器外的路径和容器内的路径,就可以形成挂载映射关系,在容器内外对文件的读写,都是相互可见的

  • Volume 也是从宿主操作系统中挂载目录到容器内,只不过这个挂载的目录由 Docker 进行管理,我们只需要指定容器内的目录,不需要关心具体挂载到了宿主操作系统中的哪里

  • Tmpfs Mount 支持挂载系统内存中的一部分到容器的文件系统里,不过由于内存和容器的特征,它的存储并不是持久的,其中的内容会随着容器的停止而消失

bind mount方式:

docker run -d --name nginx_test -v /nginx/html:/usr/share/nginx/html nginx

查看容器挂在文件:

docker exec nginx_test ls /usr/share/nginx/html

利器 docker-compose

docker-compose 是用于定义和运行多容器 Docker 应用程序的工具(集成部署),使用 docker-compose 可以高效管理容器。

使用步骤:

1、Dockerfile 定义应用程序的环境(定制自己的镜像源)
2、docker-compose.yml 定义构成应用程序的服务,多个容器一起执行
3、docker-compose up 启动并运行整个应用程序
备注:Linux需单独安装docker-compose,macos和windows已经集成

实战案例 - 搭建 LNMP 环境

源码下载: https://github.com/zhangdejian/docker_lnmp.git

请参考我的另外一篇博客: https://learnku.com/articles/39417 (Dockerfile 方式定制 lnmp 环境)

Docker 的不足

  1. 必须在64位机器上运行,目前仅支持x86_64和AMD64;
  2. 系统的Linux内核必须是3.8或者更新;
  3. 内核必须支持cgroups和命名空间;
  4. docker对disk的管理比较有限;
  5. 网络管理相对简单,主要是机遇namespace隔离;
    6.container随着用户进程的停止而销毁,container中的log等用户数据不方便收集。

Docker 的学习资源

官网: https://docs.docker.com/engine/reference/run/
中文手册: https://docker_practice.gitee.io/zh-cn/basic_concept/image.html
菜鸟教程: https://www.runoob.com/docker/docker-tutorial.html
掘金社区: https://juejin.cn/tag/Docker
开源中国: https://www.oschina.net/question/tag/docker
SegmentFault: https://segmentfault.com/t/docker
推荐入门书籍: 《Docker 技术入门与实战》 、 《Docker 进阶与实战》华为团队
看云:《Docker — 从入门到实践》
优秀文章:
CentOS 安装 docker
Dockerfile 方式定制 lnmp 环境
Docker 搭建 Jenkins 实现自动部署
Docker+LNMP+Jenkins+ 码云实现 PHP 代码自动化部署
Docker 操作命令大全

相关文章:

聊聊 Docker

聊聊 Docker Docker 是什么? 定义 Docker 是一款 开源的应用容器引擎。 简单来说,就是 以容器虚拟化技术为基础的软件。可以把应用程序和所依赖的包一起打包到一个可移植的镜像中,发布到 Linux 或者 Windows 上运行。(代码 运…...

运行软件mfc140u.dll丢失怎么办?mfc140u.dll的三个修复方法

最近我在使用一款软件时遇到了一个问题,提示缺少mfc140u.dll文件。。这个文件是我在使用某个应用程序时所需要的,但是由于某种原因,它变得无法正常使用了。经过一番搜索和了解,我了解到mfc140u.dll是Microsoft Visual Studio 2015…...

神经网络基础-神经网络补充概念-54-softmax回归

概念 Softmax回归(Softmax Regression)是一种用于多分类任务的机器学习算法,特别是在神经网络中常用于输出层来进行分类。它是Logistic回归在多分类问题上的推广。 原理 Softmax回归的主要思想是将原始的线性分数(得分&#xf…...

米尔瑞萨RZ/G2L开发板-02 ffmpeg的使用和RTMP直播

最近不知道是不是熬夜太多,然后记忆力减退了? 因为板子回来以后我就迫不及待的试了一下板子,然后发现板子有SSH,但是并没有ffmpeg,最近总是在玩,然后今天说是把板子还原一下哇,然后把官方的固件…...

基于swing的在线考试系统java jsp线上试卷问答mysql源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于swing的在线考试系统 系统有2权限:管…...

C# 读取pcd点云文件数据

pcd文件有ascii 和二进制格式,ascii可以直接记事本打开,C#可以一行行读。但二进制格式的打开是乱码,如果尝试程序中读取,对比下看了数据也对不上。 这里可以使用pcl里的函数来读取pcd,无论二进制或ascii都可以正确读取…...

.NET CORE Api 上传excel解析并生成错误excel下载

写在前面的话: 【对外承接app API开发、网站建设、系统开发,有偿提供帮助,联系方式于文章最下方 】 因业务调整,不再需要生成错误无excel下载,所以先保存代码,回头再重新编辑 #region Excel校验部分if (f…...

数据结构,二叉树,前中后序遍历

二叉树的种类 最优二叉树 最优二叉树画法 排序取最小两个值和,得到新值加入排序重复1,2 前序、中序和后序遍历是树形数据结构(如二叉树)中常用的遍历方式,用于按照特定顺序遍历树的节点。这些遍历方式在不同应用中有不…...

项目实战笔记2:硬技能(上)

序: 本节串讲了项目管理硬技能,有些术语可以结合书或者网上资料来理解。没有想书上讲的那样一一列举。 做计划 首先强调为什么做计划? 计划就是各个角色协同工作的基准(后面做风险监控、进度的监控),贯穿于…...

神经网络基础-神经网络补充概念-59-padding

概念 在深度学习中,“padding”(填充)通常是指在卷积神经网络(Convolutional Neural Networks,CNNs)等神经网络层中,在输入数据的周围添加额外的元素(通常是零)&#xf…...

【开源免费】ChatGPT-Java版SDK重磅更新收获2.3k,支持插件模式、实现ChatGpt联网操作。

everybody 七夕来了还单着么&#xff1f; 一、简介 ChatGPT Java版SDK开源地址&#xff1a;https://github.com/Grt1228/chatgpt-java&#xff0c;目前收获将近2200个star&#x1f31f;。 最新版&#xff1a;1.1.1-beta0 <dependency><groupId>com.unfbx</g…...

情报与GPT技术大幅降低鱼叉攻击成本

邮件鱼叉攻击&#xff08;spear phishing attack&#xff09;是一种高度定制化的网络诈骗手段&#xff0c;攻击者通常假装是受害人所熟知的公司或组织发送电子邮件&#xff0c;以骗取受害人的个人信息或企业机密。 以往邮件鱼叉攻击需要花费较多的时间去采集情报、深入了解受…...

Swift 周报 第三十五期

文章目录 前言新闻和社区五天市值蒸发 2000 亿美元&#xff0c;苹果公司怎么了&#xff1f;在你的 App 中帮助顾客解决账单问题需要声明原因的 API 列表现已推出 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十五…...

uni-app + SpringBoot +stomp 支持websocket 打包app

文章目录 一、概述&#xff1a;二、配置&#xff1a;1. 后端配置2. uni-app(app端)3. 使用 一、概述&#xff1a; websocket 协议是在http 协议的基础上的升级&#xff0c;通过一次http 请求建立长连接&#xff0c;转而变为TCP 的全双工通信&#xff1b;而http 协议是一问一答…...

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…...

idea插件grep console最佳实践

首发博客地址 https://blog.zysicyj.top/ 参考博客&#xff1a;https://blog.csdn.net/ayunnuo/article/details/123997304 效果 配置 具体颜色 日志级别前景色背景色Error#FF0000#370000Warn#FFC033#1A0037Info#00FFF3无Debug#808080无 本文由 mdnice 多平台发布...

Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

Android 12 源码分析 —— 应用层 二&#xff08;SystemUI大体组织和启动过程&#xff09; 在前一篇文章中&#xff0c;我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础&#xff0c;希望读者能尽量掌握。 本篇文章&#xff0c;将会介绍SystemUI的大概…...

【C#】通用类型转换

【C#】通用类型转换 自动类型转换&#xff08;隐式类型转换&#xff09;强制类型转换&#xff08;显式类型转换&#xff09;通过函数进行转换&#xff08;通过方法进行类型转换&#xff09;使用 as 操作符转换通用类型转换方法实现 数据类型转换就是将数据&#xff08;变量、数…...

传统DNS、负载均衡服务发现框架与专业服务发现框架(Eurek、nacos)分析

1、DNS 服务器 DNS 服务器可以在一定程度上用作服务发现的机制&#xff0c;以下是其冲动服务发现的一些利弊 优势 广泛性&#xff1a; DNS是互联网的标准协议之一&#xff0c;已经广泛地被支持和使用。因此&#xff0c;使用DNS作为服务发现的机制可以借助现有的网络基础设施…...

js中数组常用操作函数

js数组经常会用到&#xff0c;当涉及到 JavaScript 数组的函数&#xff0c;有许多常用的函数可用于对数组进行操作和转换。以下是一些常见的数组函数的讲解 splice() splice() 函数用于修改数组&#xff0c;可以删除、插入或替换数组中的元素。 var fruits [apple, banana,…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...