day-01 Docker
一、docker简介
Docker 是一种开源的容器化平台,它可以帮助开发人员将应用程序及其依赖项打包成一个独立的、可移植的容器,而无需担心环境差异和依赖问题。通过使用 Docker,您可以更轻松地创建、分发和运行应用程序,无论是在开发、测试还是生产环境中。
Docker 利用了 Linux 内核的特性,如 cgroups 和命名空间,来提供轻量级、隔离和可移植的容器。每个容器都是一个独立的运行时环境,具有自己的文件系统、进程空间和网络接口。这使得多个容器可以在同一台主机上同时运行,而互相之间不会产生冲突。
使用 Docker,我们可以通过 Docker 镜像来定义应用程序的运行环境。镜像是一个只读的模板,它包含了运行应用程序所需的所有组件,包括操作系统、软件库和应用程序代码。可以基于现有的镜像构建自己的镜像,也可以将镜像上传到 Docker Hub 或私有的 Docker 仓库进行共享和发布。
除了提供容器化的运行环境,Docker 还提供了一套强大的命令行工具和 API,用于管理和操作容器。您可以使用这些工具来创建、启动、停止、删除和监控容器,以及管理应用程序的网络和存储等方面。
总而言之,Docker 提供了一种便捷、可靠和高效的方式来打包、交付和运行应用程序,使得开发人员能够更加专注于应用程序的开发和部署,而无需担心环境配置和依赖问题。
1.docker与虚拟机的区别
Docker 和传统虚拟机之间有以下几个主要区别:
-
架构差异:传统虚拟机使用 Hypervisor 在物理硬件上创建多个虚拟环境,并在每个虚拟机中运行完整的操作系统。而 Docker 则利用宿主机操作系统的内核来实现容器化,容器共享宿主机的操作系统,避免了运行多个完整操作系统的开销。
-
资源消耗:由于传统虚拟机需要运行完整的操作系统,因此每个虚拟机都需要独立分配一定的内存和计算资源。相比之下,Docker 容器直接运行在宿主机上,共享宿主机的资源,使得容器更加轻量级且资源消耗更少。
-
启动时间:传统虚拟机的启动时间较长,通常需要几分钟的时间来启动一个虚拟机。而 Docker 容器可以在几秒钟内启动,因为容器只需加载应用程序及其依赖项即可,无需启动操作系统。
-
部署速度:由于 Docker 容器具有轻量级和快速启动的特点,可以提供更快的应用程序部署速度。容器可以更快地部署、升级和扩展,从而提高了应用程序的迭代和交付效率。
-
系统隔离:传统虚拟机通过 Hypervisor 实现硬件级别的隔离,每个虚拟机都有自己独立的内核和资源。而 Docker 容器使用 Linux 内核的命名空间和 cgroups 功能来实现轻量级隔离,使得容器之间相互隔离但仍共享宿主机的内核。这种隔离方式在安全性和性能方面提供了一定的平衡。
综上所述,Docker 和虚拟机在架构、资源消耗、启动时间、部署速度和系统隔离等方面存在较大区别(优势)。Docker 更加轻量级、快速和灵活,适合于应用程序的打包、交付和部署;而传统虚拟机则提供了更高的隔离性和多样化的操作系统支持,适合于运行不同操作系统的应用程序。根据具体需求,可以选择使用 Docker 或传统虚拟机来满足不同的场景和要求。
2.docker的组成
Docker 由以下几个核心组件组成:
-
Docker Engine:Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期、构建和运行容器。它包括三个主要部分:Docker 守护进程(
dockerd
),API 接口和命令行工具(docker
)。 -
Docker 镜像(Docker Images):Docker 镜像是用于创建容器的模板,包含了一个完整的文件系统,包括代码、运行时环境、系统工具、库文件等。可以通过 Dockerfile 或从 Docker Hub 等镜像仓库中获取现有的镜像,也可以自己构建定制化的镜像。
-
Docker 容器(Docker Containers):Docker 容器是基于 Docker 镜像创建的运行实例。每个容器都是独立且隔离的运行环境,包含了运行应用程序所需的所有依赖项。容器可以启动、停止、重启,并且可以与其他容器进行通信和交互。
-
Docker 仓库(Docker Registry):Docker 仓库用于存储和分享 Docker 镜像。Docker Hub 是最常用的公共 Docker 仓库,其中包含了大量的官方和社区维护的镜像供用户使用。除了公共仓库外,还可以搭建私有仓库,用于本地镜像的存储和管理。
-
Docker Compose:Docker Compose 是一个用于定义和运行多个容器应用的工具。通过编写一个 YAML 文件来定义多个容器之间的关系和配置,然后使用
docker-compose
命令进行一键式部署、启动和停止。 -
Docker Swarm:Docker Swarm 是 Docker 官方提供的容器集群管理工具,用于在多个主机上创建和管理容器集群。它可以将多个 Docker 主机组合成一个虚拟的计算资源池,自动调度和管理容器的部署和扩缩容。
除了以上核心组件外,还有一些辅助工具和服务,如 Docker Machine(用于在虚拟机或云端创建和管理 Docker 主机)、Docker Network(用于容器之间的网络连接)和第三方的监控和日志工具等,进一步增强了 Docker 的功能和生态系统。
综上所述,Docker 的主要组成部分包括 Docker 引擎、镜像、容器、仓库、Compose 和 Swarm 等。这些组件共同构成了 Docker 的基础架构,并提供了便捷、可移植和高效的容器化解决方案。
3.docker运行流程
Docker 的运行流程可以简要概括为以下几个步骤:
-
编写 Dockerfile:Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。在 Dockerfile 中,你可以指定基础镜像、添加和配置应用程序所需的依赖项、设置环境变量、复制文件等操作。
-
构建镜像:使用 Docker 命令行工具执行
docker build
命令,根据 Dockerfile 构建镜像。该命令会按照 Dockerfile 中的指令逐步执行,并生成一个新的镜像。在构建过程中,Docker 会下载所需的基础镜像和依赖项,并在每一步骤生成一个中间镜像。 -
运行容器:使用
docker run
命令来运行容器。该命令需要指定要运行的镜像名称或 ID,并可以通过参数设置容器的名称、端口映射、环境变量、挂载数据卷等配置选项。在运行时,Docker 会基于镜像创建一个新的容器实例,并启动其中的应用程序。 -
应用程序执行:一旦容器启动,Docker 将在容器内部运行应用程序。容器中的应用程序将具有自己的文件系统、进程空间和网络接口,与宿主机和其他容器隔离开。应用程序可以执行任何操作,运行所需的服务或应用逻辑。
-
交互和管理:Docker 提供了一系列命令和工具,用于与容器进行交互和管理。你可以使用
docker exec
命令在运行中的容器内执行命令,使用docker logs
查看容器的日志输出,使用docker stop
命令停止容器的运行等。同时,也可以使用 Docker Compose、Docker Swarm 等工具来管理多个容器的部署和协调。 -
停止和清理:当不再需要运行的容器时,可以使用
docker stop
命令停止容器的运行。如果需要移除容器,可以使用docker rm
命令将其删除。对于不再使用的镜像,可以使用docker rmi
命令进行清理。
总结起来,Docker 的运行流程包括编写 Dockerfile 定义镜像构建过程、使用 Docker 命令行工具构建镜像、运行容器、应用程序执行、交互和管理容器,最后停止和清理容器和镜像。这个流程使得 Docker 提供了一种便捷、可移植和轻量级的容器化解决方案。
4.docker数据卷
Docker 数据卷(Docker Volumes)是用于在容器和宿主机之间持久化存储数据的一种机制。它允许容器中的数据在容器生命周期内保留,并且独立于容器的停止和删除操作。
使用 Docker 数据卷的主要优势包括:
-
数据持久化:容器中的数据可以在容器终止、重启或删除后仍然保留,这样可以确保数据的持久性存储,不会因为容器的状态改变而丢失数据。
-
数据共享:多个容器可以共享同一个数据卷,使得容器之间可以交换和共享数据。这对于需要共享配置文件、日志目录或其他共享数据的应用程序非常有用。
-
数据备份和迁移:通过将数据卷映射到宿主机上的特定路径,可以轻松将数据从一个容器迁移到另一个容器或备份到宿主机的本地文件系统或远程存储等。
-
容器间通信:如果多个容器共享同一个数据卷,它们可以通过数据卷中的文件进行相互通信和数据交换。这在微服务架构和分布式应用程序中特别有用。
以下是几种创建和使用 Docker 数据卷的方式:
-
docker run
命令:可以使用-v
或--volume
参数来创建一个数据卷,并将其映射到容器中的指定路径。例如:docker run -v /path/on/host:/path/in/container image_name
。 -
Docker Compose:可以通过编写
docker-compose.yml
文件,在服务定义中指定volumes
字段来创建和管理数据卷。这样可以实现多个容器之间的共享数据卷。 -
Dockerfile:在 Dockerfile 中使用
VOLUME
关键字可以指定将哪些目录作为数据卷,例如:VOLUME ["/var/data"]
。当镜像被用于创建容器时,该目录会自动转换为数据卷。 -
匿名数据卷:如果不指定数据卷的路径,Docker 会自动生成一个匿名数据卷,并将其挂载到容器中的随机路径上。这种类型的数据卷通常用于临时或临时性数据。
-
具名数据卷:可以使用
docker volume create
命令手动创建一个具名数据卷,并将其映射到容器中。这样可以更加灵活地管理数据卷的生命周期和配置。
总之,Docker 数据卷提供了一种方便的方式来持久化存储容器中的数据,并实现容器间的数据共享和通信。通过合理地使用数据卷,可以使得容器应用程序更加灵活、可移植和可靠。
二、docker的简单使用
镜像相关指令:
docker pull <镜像名称>
: 从镜像仓库中拉取一个镜像到本地。docker images
: 显示本地已经下载的镜像列表。docker build <选项> <上下文路径>
: 根据 Dockerfile 构建一个自定义镜像。docker push <镜像名称>
: 将本地的镜像推送到镜像仓库。docker rmi <镜像名称>
: 删除本地的一个镜像。docker tag <源镜像名称>:<标签> <目标镜像名称>:<标签>
: 给本地镜像打标签。
容器相关指令:
docker run <选项> <镜像名称>
: 在容器中运行一个镜像。docker ps
: 显示正在运行的容器列表。docker start <容器ID>
: 启动已停止的容器。docker stop <容器ID>
: 停止运行中的容器。docker restart <容器ID>
: 重启容器。docker rm <容器ID>
: 删除已停止的容器。docker exec <选项> <容器ID> <命令>
: 在运行中的容器中执行命令。docker logs <容器ID>
: 查看容器的日志输出。docker inspect <容器ID>
: 查看容器的详细信息。
网络和存储指令:
docker network ls
: 显示 Docker 网络列表。docker network create <网络名称>
: 创建一个自定义的 Docker 网络。docker volume ls
: 显示 Docker 数据卷列表。docker volume create <卷名称>
: 创建一个 Docker 数据卷。docker volume rm <卷名称>
: 删除一个 Docker 数据卷。
其他常用指令:
docker-compose up
: 在当前目录中使用 Docker Compose 启动容器。docker-compose down
: 在当前目录中使用 Docker Compose 停止容器并删除相关资源。docker version
: 显示 Docker 的版本信息。docker info
: 显示 Docker 的系统信息。
三、dockerfile文件的编写
Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。通过编写 Dockerfile,可以指定基础镜像、添加和配置应用程序所需的依赖项、设置环境变量、复制文件等操作。以下是 Dockerfile 常见的指令和使用方法:
-
FROM
:指定基础镜像,格式为FROM <image>[:<tag>]
。例如:FROM ubuntu:latest
。 -
LABEL
:给镜像添加元数据,格式为LABEL <key>=<value>
。可以用来提供作者信息、版本号、描述等信息。 -
RUN
:在镜像中执行命令或脚本,格式为RUN <command>
。例如:RUN apt-get update && apt-get install -y curl
。 -
COPY
和ADD
:将文件从构建上下文复制到镜像中。COPY
指令格式为COPY <src> <dest>
,ADD
指令格式为ADD <src> <dest>
。其中<src>
是构建上下文中的文件或目录路径,<dest>
是目标镜像中的路径。 -
WORKDIR
:设置工作目录,格式为WORKDIR <path>
。后续的命令会在该路径下执行。 -
ENV
:设置环境变量,格式为ENV <key>=<value>
。例如:ENV JAVA_HOME=/usr/lib/jvm/java-11
。 -
EXPOSE
:声明容器运行时要监听的端口号,格式为EXPOSE <port> [<port>/<protocol>...]
。例如:EXPOSE 8080/tcp
。 -
CMD
和ENTRYPOINT
:设置容器启动后执行的命令或脚本。CMD
格式为CMD ["<executable>", "<param1>", "<param2>", ...]
,ENTRYPOINT
格式为ENTRYPOINT ["<command>", "<param1>", "<param2>", ...]
。可以使用多个CMD
或ENTRYPOINT
,但最终只有最后一个指令生效。
以上是 Dockerfile 中常用的指令,还有其他一些指令和参数可供使用,可以根据实际需求进行查阅和使用。编写完 Dockerfile 后,可以使用 docker build
命令根据 Dockerfile 构建镜像,例如:docker build -t my-image:tag .
,其中 .
表示当前目录是构建上下文。
在构建过程中,Docker 会按照 Dockerfile 中的指令逐步执行,并生成一个新的镜像。每个指令都会在前一个指令的基础上进行修改,形成一条镜像层的链条。这种分层的结构使得镜像的构建和管理更加高效和灵活。
总之,Dockerfile 是用于定义 Docker 镜像构建过程的重要工具,通过编写指令来配置镜像的组件、配置和应用程序等。正确编写和使用 Dockerfile 可以大大简化镜像构建的流程,并提供可重复和可扩展的容器化解决方案。
相关文章:

day-01 Docker
一、docker简介 Docker 是一种开源的容器化平台,它可以帮助开发人员将应用程序及其依赖项打包成一个独立的、可移植的容器,而无需担心环境差异和依赖问题。通过使用 Docker,您可以更轻松地创建、分发和运行应用程序,无论是在开发、…...

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)
1.目标: a.数码管显示相同的值 0000 1111 ......9999; b.数码管显示不同的值 1234; 2.分析m74hc595芯片内部框图; 真值表: 3.代码; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…...

思路灰度传感器及红外传感器线序
四路红外传感器 黑线读取数据为0 白线读取数据为1 四路灰度传感器 黑线读取数据为1 白线读取数据为0...

squid服务器
目录 squid初识 安装squid代理 常用命令 主要配置文件 正向代理 环境配置 linux服务器设置 windows客户端设置 反向代理 环境配置 在web服务器配置服务 linux服务器配置 squid初识 含义:squid cache是一个流行的自由软件(GNU通用公共许可证…...

spring的后置处理器BeanPostProcessor
什么是BeanPostProcessor 是spring IOC容器给我们提供的一个扩展接口在调用初始化方法前后对bean进行额外加工,ApplicationContext会自动扫描实现了BeanPostProcessor的bean,并注册这些bean为后置处理器是bean的统一前置后置处理而不是基于某一个bean 执…...

vue、uniapp中动态添加绑定style、class 9种方法实现
9种方法介绍 直接使用静态class和style属性: 使用场景:当class和style属性是固定不变的时候,可以直接在模板中写死。优点:简单直接,没有额外的计算和逻辑。缺点:无法根据条件动态修改class和style。 使用v…...

【CicadaPlayer】seek :SeekInCache(int64_t pos)的实现
SuperMediaPlayer::SeekInCache(int64_t pos) 的实现 seek的pos就是pts值。缓冲是list,那么插入的包是按照到达的顺序插入到list的,也就是无排序的。包的pts 正常应该单调连续,即使不单调连续,缓存也不在意。seek的操作主要是先比较pos与mCurrentPos ,pos 比 mCurrentPos …...

【C/C++】x -x 的含义
1、含义 -x 的值,其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得(C语言中,-x实现是用取反1实现)也就是说:x & -x x & (~x 1) 2、x 为偶数 当一个奇数 1时,表示…...

[ZenTao]源码阅读:加载自定义任务类型
www/index.php config/config.php framework/base/router.class.php tmp/model/common.php module/common/model.php framework/router.class.php...

hive分区表 静态分区和动态分区
一、静态分区 现有数据文件 data_file 如下: 2023-08-01,Product A,100.0 2023-08-05,Product B,150.0 2023-08-10,Product A,200.0 1、创建分区表 CREATE TABLE sales (sale_date STRING,product STRING,amount DOUBLE ) PARTITIONED BY (sale_year INT, sale_mon…...

java八股文面试[多线程]——ThreadLocal底层原理和使用场景
源码分析: ThreadLocal中定义了ThreadLocalMap静态内部类,该内部类中又定义了Entry内部类。 ThreadLocalMap定了 Entry数组。 Set方法: Get方法: Thread中定义了两个ThreaLocalMap成员变量: Spring使用ThreadLocal解…...

Android hid发送apdu格式数据
在 Android 中,如果你想通过 HID(Human Interface Device)发送 APDU 格式的数据,通常会涉及 USB HID 设备或蓝牙 HID 设备。HID 协议通常用于键盘、鼠标和其他输入设备,而不是直接与智能卡进行通信。然而,如…...

Unity碰撞检测(3D和2D)
Unity碰撞检测3D和2D 前言准备材料3D2D 代码3D使用OnCollisionEnter()进行碰撞Collider状态代码 使用OnTriggerEnter()进行碰撞Collider状态代码 2D使用OnCollisionEnter2D()进行碰撞Collider2D状态代码 使用OnTriggerEnter2D()进行碰撞Collider2D状态代码 区别3D代码OnCollisi…...

android:控件TextView
一、系统学习Android控制键TextView,我的笔记里面有尝试学着使用自定义控件。 二、具体内容 1.如果在代码中给textView赋值,在xml中也给textView赋值了最后运行出来的结果显示代码中赋的值。因此得出结论,代码中的赋值会覆盖xml所附的值。 …...

3D风速仪 Gill Instruments Limited_R3-50 R3-100 and R3A -100 Manual
R3测量超声波脉冲从上部换能器到相反的下部换能器所花费的时间,并将其与脉冲从下部换能器到上部换能器的时间进行比较。 同样,在其他上下换能器之间比较时间。 如图1所示,每对换能器之间沿轴的空气速度可以从每条轴上的飞行次数计算出来。 …...

深度学习怎么学?
推荐这本小白看的《深度学习:从基础到实践(上下册)》。 深度学习:从基础到实践(上下册) 深入浅出的讲述了深度学习的基本概念与理论知识,不涉及复杂的数学内容,零基础小白也能轻松掌…...

WPF 数据验证
WPF提供了能与数据绑定系统紧密协作的验证功能。提供了两种方法用于捕获非法值: 1、可在数据对象中引发错误。 可以在设置属性时抛出异常,通常WPF会忽略所有在设置属性时抛出的异常,但可以进行配置,从而显示更有帮助的可视化指示…...

IDEA的maven想显示层级关系,而非平级
新版和旧版的IDEA的位置不一样,2023.2.1的版本在右上角的“” 这个位置 如图所示: 然后点击按模块分组:...

(八)k8s实战-身份认证与权限
一、认证 User AccountsService Accounts Service Account 自动化: Service Account Admission ControllerToken ControllerService Account Controller 1、Service Account Admission Controller 通过 Admission Controller 插件来实现对 pod 修改,…...

数学建模:TOPSIS分析
🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 TOPSIS分析法 算法流程 假设有m个评价对象,n个评价指标,首先需要进行指标的正向化: 极大型极小型单点型区间型 然后对正向化后的矩阵进行标准化,得到 Z Z Z…...

【Qt学习】10 利用QSharedMemory实现单例运行
问题 让应用程序只有一个运行实例 QSharedMemory除了可以完成进程间通信,还可以实现应用程序单例化。 解法 首先,看看QSharedMemory的几个函数: 1、QSharedMemory(const QString &key, QObject *parent Q_NULLPTR)构造函数 该构造函数…...

FPGA应用于图像处理
FPGA应用于图像处理 FPGA(Field-Programmable Gate Array)直译过来就是现场可编程门阵列。是一种可以编程的逻辑器件,具有高度的灵活性,可以根据具体需求就像编程来实现不同的功能。 FPGA器件属于专用的集成电流中的一种半定制电…...

vscode python 无法引入上层目录解决
在vscode 中.vscode 配置如下 { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid830387 “version”: “0.2.0”, “configurati…...

[开发|java] java list 取某个属性最大的项
示例代码: import java.util.*;class Person {private String name;private int age;public Person(String name, int age) {this.name name;this.age age;}public int getAge() {return age;} }public class Main {public static void main(String[] args) {List<Person…...

关闭浏览器的跨域校验
首发博客地址 问题描述 当你访问资源失败,并遇到以下类似提示时: Access to script at 资源路径 from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrom…...

USRP 简介,对于NI软件无线电你所需要了解的一切
什么是 USRP 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发,被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&…...

RTE_Driver驱动框架和Keil下开发需要支持的xxx_DFP软件包分析
1.RTE_Driver驱动框架 RTE_Driver代表"Run-Time Environment Driver",是Keil MDK(Microcontroller Development Kit)中的一个概念。Keil MDK是一种用于嵌入式系统开发的集成开发环境,提供了开发、编译、调试等一系列工具…...

ImportError: Cannot load dynamic library. Did you compile LSD?
1、问题描述 >>> import pylsd2 Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/data/data/wangzy-p-wangzy-p3-volume-pvc-0fee40a7-7013-49b4-8cfb-b4ab0394165b/.conda/envs/paddle/lib/python3.8/sit…...

音频应用编程
目录 ALSA 概述alsa-lib 简介sound 设备节点alsa-lib 移植编写一个简单地alsa-lib 应用程序一些基本概念打开PCM 设备设置硬件参数读/写数据示例代码之PCM 播放示例代码值PCM 录音 使用异步方式PCM 播放示例-异步方式PCM 录音示例-异步方式 使用poll()函数使用poll I/O 多路复用…...

软件测试/测试开发丨Python 学习笔记 之 链表
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/26458 链表与数组的区别 复杂度分析 时间复杂度数组链表插入删除O(n)O(1)随机访问O(1)O(n) 其他角度分析 内存连续,利用CPU的机制࿰…...