【云原生 | Docker】Docker核心概念 应用上手最佳流程

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

核心概念

Docker 是一个开源的容器化平台,它在过去几年中取得了巨大的成功和广泛的应用。以下是 Docker 的发展历史和其使用的编程语言 Go 的相关信息:

  1. Docker 的起源:
    Docker 最初由 Solomon Hykes 在2013年创建,并在 Docker 公司(前身为 dotCloud)的支持下进行开发和推广。Docker 的设计目标是提供一种轻量级、便携式的容器化解决方案,以简化应用程序的部署和管理。

  2. Docker 的早期版本:
    Docker 最早的版本是基于 Linux 容器(LXC)技术开发的,它利用 Linux 内核的容器功能,实现了应用程序的隔离和资源管理。不过,这种实现方式存在一些限制和不足,因此 Docker 团队决定在 Docker 0.9 版本中引入自己的容器引擎,即 Docker Engine(后来被称为 Docker Daemon)。

  3. Go 语言的选择:
    Docker 团队选择使用 Go 作为开发 Docker 引擎的编程语言。Go 是由 Google 开发的一种静态类型、编译型语言,具有高效、简洁和并发编程的特性。选择 Go 作为开发语言使得 Docker 具备了良好的性能、可移植性和易于扩展的特点。

  4. Docker 的快速发展:
    Docker 在推出之后迅速获得了开发者和运维人员的关注,并在容器领域迅速崛起。Docker 引入了容器镜像和容器注册表的概念,使得应用程序的打包、分发和部署变得更加简单和可靠。Docker 提供了丰富的命令行工具和 API,以及各种生态系统工具和服务,进一步扩展了其功能和应用场景。

  5. 开源和社区发展:
    Docker 从一开始就采用了开源模式,并建立了一个活跃的社区。这使得开发者和用户能够贡献代码、提出问题、分享经验,并为 Docker 的发展做出贡献。Docker 社区不断推动技术的创新和改进,推出了许多有用的工具和项目,如 Docker Compose、Docker Swarm 和 Kubernetes 等。

  6. Docker 的生态系统:
    Docker 生态系统已经变得非常庞大和丰富,涵盖了各种工具、服务和项目。除了核心的 Docker 引擎和工具链外,还有许多第三方软件和服务提供商构建在 Docker 之上,为用户提供了更多的功能和集成选项。

以下是 Docker 的一些关键概念和组件:

  1. 镜像(Image):Docker 镜像是一个只读的模板,包含了运行应用程序所需的一切,包括代码、运行时环境、库文件、依赖项等。镜像可以用作创建容器的基础。

  2. 容器(Container):容器是从镜像创建的运行实例。每个容器都是一个隔离的环境,包含了运行应用程序所需的所有内容。容器可以被启动、停止、删除,并且可以与其他容器进行通信。

  3. Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期,包括创建、运行、停止和删除容器。它还提供了与 Docker 守护进程通信的 API。

  4. Docker Compose:Docker Compose 是一个用于定义和运行多个容器的工具。通过编写一个 YAML 文件来定义应用程序的服务、网络和卷等配置,然后使用 Docker Compose 命令来启动、停止和管理整个应用程序的容器群。

  5. Docker Hub:Docker Hub 是一个公共的 Docker 镜像仓库,可以在其中找到大量的官方和社区维护的镜像。开发者可以将自己的镜像推送到 Docker Hub 中,也可以从中拉取所需的镜像。

Docker 的优势包括:

  • 轻量级和可移植性:Docker 容器相对较小且独立于宿主操作系统,可以在不同的环境中以相同的方式运行,提供了良好的可移植性。
  • 简化部署和扩展:通过 Docker 镜像,开发者可以轻松地部署和扩展应用程序,无需担心环境差异和依赖项问题。
  • 高效资源利用:Docker 利用操作系统层的虚拟化技术,可以在单个主机上运行多个容器,并共享主机的内核,提供了更高的资源利用率。
  • 简化开发流程:开发者可以在容器中构建和测试应用程序,并将容器作为开发环境进行交付,确保开发和生产环境的一致性。

Dockfile概念

Dockerfile 是用于定义和构建 Docker 镜像的文本文件。它包含一系列指令,用于描述如何构建镜像、安装依赖、配置环境等。

以下是一些常见的 Dockerfile 指令和示例用法:

  1. FROM:指定基础镜像,即构建新镜像所基于的镜像。例如,使用 FROM ubuntu:latest 指定以最新版本的 Ubuntu 作为基础镜像。

  2. RUN:在镜像中执行命令。可以用于安装软件包、运行脚本等。例如,使用 RUN apt-get update && apt-get install -y package 安装软件包。

  3. COPY 和 ADD:用于将文件或目录复制到镜像中。COPY 用于复制本地文件或目录到镜像,而 ADD 不仅可以复制文件和目录,还可以解压压缩文件和远程 URL。例如,使用 COPY app.py /app/ 将本地的 app.py 文件复制到镜像的 /app/ 目录下。

  4. WORKDIR:设置工作目录,指定后续命令的工作路径。例如,使用 WORKDIR /app 设置工作目录为 /app。

  5. ENV:设置环境变量。可以用于配置容器的运行环境。例如,使用 ENV PATH=/usr/local/bin:$PATH 设置环境变量 PATH。

  6. EXPOSE:声明容器运行时需要监听的端口。例如,使用 EXPOSE 80 声明容器将监听80端口。

  7. CMD 和 ENTRYPOINT:设置容器启动时要执行的命令。CMD 可以设置默认的容器启动命令,而 ENTRYPOINT 则可以定义容器的入口点。例如,使用 CMD ["python", "app.py"] 设置容器默认执行的命令为运行 app.py。

通过编写 Dockerfile,开发者可以定义应用程序的构建过程、运行环境和启动命令等,使得应用程序可以在不同的 Docker 环境中以相同的方式运行。使用 Dockerfile,可以实现快速、可重复和可扩展的镜像构建过程。

接着通过 Dockerfile 构建镜像并运行容器的流程如下:

  1. 编写 Dockerfile:创建一个文本文件,并命名为 Dockerfile。在 Dockerfile 中,按照一定的语法规则编写一系列指令,描述镜像的构建过程、运行环境和启动命令等。

  2. 构建镜像:使用 docker build 命令来构建镜像。在命令行中进入 Dockerfile 所在目录,并执行以下命令:

    docker build -t <image_name> .
    ```
    
    其中,`<image_name>` 是你要为镜像指定的名称,可以根据需要自定义。`.` 表示当前目录,即 Dockerfile 所在的目录。
    
    在构建过程中,Docker 将按照 Dockerfile 中的指令逐步执行,并在每个指令的基础上创建一个镜像层。每个镜像层都包含了该指令所引入的更改和新增内容。
    
  3. 运行容器:构建完成后,可以使用 docker run 命令来运行容器,并基于构建的镜像创建新的容器实例。执行以下命令:

    docker run <image_name>
    ```
    
    ``<image_name>` 是你构建的镜像的名称。
    
    运行该命令后,Docker 将创建一个新的容器实例,并在容器内部执行 Dockerfile 中指定的启动命令。
    

此外,还有许多其他的 Dockerfile 指令和用法,可以根据具体需求进行深入学习和探索。Docker 官方提供了详细的文档和示例,供开发者参考和学习使用。

Docker-compose

在Docker中使用./mysql/data:/var/lib/mysql进行挂载,可以将MySQL数据目录挂载到主机上的特定目录。这样做的好处是,即使容器被删除或重新创建,MySQL的数据仍然保留在主机上,从而实现数据的持久化。

当您使用这种方式挂载MySQL数据目录时,表数据应该是可以同步的。因为表数据实际上存储在MySQL数据目录中的文件中,而挂载操作将主机上的目录与容器中的目录关联起来。因此,对于MySQL容器中的表数据的更改将在主机上的相应文件中进行反映,反之亦然。

但是,需要注意以下几点:

  1. 确保MySQL容器和主机上的目录结构一致。如果MySQL容器内部的数据目录结构与主机上的数据目录结构不匹配,可能会导致数据同步的问题。

  2. 确保MySQL容器和主机上的目录权限正确设置。MySQL容器需要对数据目录具有适当的读写权限,以便能够正确读取和写入数据。

  3. 在将数据目录挂载到主机上之前,确保MySQL容器已经停止运行,以避免对数据目录的并发访问问题。

总的来说,通过将MySQL数据目录挂载到主机上,您可以实现数据的持久化,并且表数据应该可以在容器和主机之间同步。但是,在实际操作中,仍然需要注意目录结构和权限等方面的设置,以确保数据的正确同步和访问。

在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 下载编译 opencv4.2.0并检验

如有帮助点赞收藏关注&#xff01; 如需转载&#xff0c;请注明出处&#xff01; ubuntu 的opencv4.2.0下载与编译 下载依赖开始编译安装配置OpenCV编译环境检验* 完成 下载 首先下载opencv源码网址&#xff1a; https://opencv.org/releases/page/3/ 下载成zip后&#xff0c;…

Linux常用快捷键

1. tab 键补全 1)当我们忘记了一些指令怎么写时&#xff0c;可以双击tab键&#xff0c;查看所有指令&#xff0c;显示出来后可以按enter键往下翻&#xff0c;想要取消命令可以按ctrl c。 2)知道开头怎么写&#xff0c;后面的忘了&#xff0c;也可以双击tab键查询开头排列的指令…

Liunx系统使用超详细(三)

本篇内容开始逐渐描述有关liunx的各种命令的使用方法&#xff01; 目录 一、目录和文件区别 1.1目录&#xff1a; 1.2文件&#xff1a; 1.3总结&#xff1a; 二、Linux命令的写法 三、linux命令清屏 四、pwd命令 五、ls命令 5.1 ls&#xff1a; 5.2 ls -l&#xff1a…

HTML CSS JavaScript的网页设计

一、网页界面效果&#xff1a; 二、HTML代码&#xff1a; <!DOCTYPE html> <!-- 声明文档类型--> <html lang"en"> …

代码随想录第二十一天(一刷C语言)|回溯算法组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、回溯算法 1、种类 排列、组合、分割、子集、棋盘问题 2、回溯步骤 &#xff08;0&#xff09;回溯抽象 回溯法解决的问题均可以抽象为树形结构&#xff08;N叉树&#xff09; &…

acwing-Linux学习笔记

acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点&#xff1a; 服务质量评估标准不同&#xff1a;不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异&#xff0c;因此导致报价有所不同。一些机构可能提供全面且细致的测评服务&#xff0c;致力于提供高质量的等保测…

Nested Named Entity Recognition with Span-level Graphs

原文链接&#xff1a; https://aclanthology.org/2022.acl-long.63.pdf ACL 2022 介绍 问题 基于span的方法虽然在解决嵌套实体上存在巨大潜力&#xff0c;但存在以下问题&#xff1a; 1&#xff09;难以充分利用span的丰富语义&#xff1b; 2&#xff09;重叠较多的正负样本会…

如何使用PostMan进行并发测试?

如何使用PostMan进行并发测试&#xff1f; &#x1f440;(Postman 的 runner 实际上是串行执行的&#xff0c;因此不能作为并发测试&#xff0c; 只是批量测试&#xff0c;本文如下称为并发的是错误的) 文章目录 如何使用PostMan进行并发测试&#xff1f;POST篇流程Pre-req 脚…

c++ atmoic acquire/release

由于多核cpu缓存的存在&#xff0c;以及gcc编译优化&#xff0c;cpu指令层面的优化&#xff0c;导致程序的执行顺序可能跟你写的顺序不完全一致&#xff08;reorder&#xff09;。 但是在多线程编程中如何确保各个线程能正确的读取到各个变量呢&#xff08;而不是cache中老旧的…

做一件荒谬的事:用AI推理下一次双色球结果 v0.1

做一件荒谬的事&#xff1a;用AI推理下一次双色球结果 v0.1 引言 事情的起因是父亲被亲戚安利&#xff0c;突然喜欢上了双色球&#xff0c;连规则和开奖结果怎么看都不懂的他&#xff0c;让我研究研究这个事&#xff0c;给他选个号。他还说老家有好几个人中了几百万&#xff…

3.C程序编译步骤

目录 1 预处理 2 编译 3 汇编 4 链接 5 文件大小情况 依次执行下面4个步骤 预处理 将所有头文件展开&#xff0c;比如stdio.h等&#xff0c;展开就相当于把stdio.h中的所有代码粘贴到你的代码里。将所有的宏文件展开&#xff0c;像stdio.h是官方定义的头文件&#x…

Batch Normalization

1.是什么&#xff1f; 批量归一化&#xff08;Batch Normalization&#xff09;&#xff0c;由Google于2015年提出&#xff0c;是近年来深度学习&#xff08;DL&#xff09;领域最重要的进步之一。该方法依靠两次连续的线性变换&#xff0c;希望转化后的数值满足一定的特性&am…

Python 解析JSON实现主机管理

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本形式表示数据。JSON 是一种独立于编程语言的数据格式&#xff0c;因此在不同的编程语言中都有对应的解析器和生成器。JSON 格式的设计目标是易于理解、…

应用分发平台的重要性:构建、扩展和管理您的移动应用

在当今的数字时代&#xff0c;移动应用已经成为我们日常生活的一部分。无论是用于商业、教育、娱乐还是社交&#xff0c;应用都在我们的生活中发挥着重要的作用。然而&#xff0c;构建一个成功的应用需要更多的工作——它需要一个合适的平台来发布、管理和跟踪。这就是应用分发…

JFrog----软件的SBOM分析简介

文章目录 什么是SBOM&#xff1f;SBOM分析的重要性SBOM分析的过程结语 什么是SBOM&#xff1f; SBOM&#xff0c;全称是“软件物料清单”&#xff0c;它像是一个详尽的清单&#xff0c;列出了构成特定软件的所有组件&#xff0c;包括库、模块、包等。这就像是制造业中的物料清…

为什么要做ERP集成?ERP系统如何与其他业务应用程序集成

什么是ERP集成&#xff1f; ERP集成是指将企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;系统与其他软件应用或业务流程进行无缝连接和整合的过程。 ERP系统通常涵盖企业内部的各种功能模块&#xff0c;如财务、供应链管理、生产制造、销…

制作一个RISC-V的操作系统-环境搭建

文章目录 前言环境搭配 前言 由于之前的操作系统反馈难度太大&#xff0c;所以准备从这个RISC-V操作系统出发&#xff0c;以后知识层面更加深入再去完善。 环境搭配 按照依赖项 $ sudo apt update $ sudo apt install build-essential gcc make perl dkms git gcc-riscv64-…

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

Educational Codeforces Round 159 (Rated for Div. 2)(B 二分贪心 Cgcd D二分+前缀和 E字典树)

A - Binary Imbalance 有只要在01之间插入就能制造无限个0&#xff0c;没有0就统计0 1个数即可 #include<bits/stdc.h> using namespace std; const int N 110010,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII; const…