【docker入门】

在软件开发过程中,环境配置是一个至关重要的步骤,它不仅影响开发效率,也直接关联到软件的最终质量。正确的环境配置可以极大地减少开发中的潜在问题,提升软件发布的流畅度和稳定性。以下是几个关键方面,以及如何优化环境配置的策略:

在多数项目中,通常至少会设置以下几种环境:

  1. 本地开发环境:开发人员的个人计算机或者开发服务器。

  2. 测试环境:用来运行自动化测试,模拟生产环境的设置以检测问题。

  3. 预发布(Staging)环境:一个模拟真实生产环境的设置,用于最终的测试和质量保证。

  4. 生产环境:实际用户使用的环境,需要高度的稳定和安全。

目前所面临的主要挑战主要有以下几个方面:

  1. 一致性问题:保持各环境间配置的一致性是关键,尤其是从测试到生产环境的转换过程中。

  2. 环境隔离性:确保高级环境的操作不影响到生产环境,防止数据泄露或服务中断。

  3. 版本控制和依赖管理:软件依赖和第三方服务的版本不一致可能引发环境间行为差异。

  4. 依赖冲突:依赖库之间的兼容性问题,尤其是子依赖的版本冲突。

在接下来的内容我们将一步步讲解,最终引出 Docker。

虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虚拟机大致可以分为两类:

  1. 系统虚拟机:这种虚拟机提供了一个完整的系统平台,支持执行完整的操作系统。系统虚拟机可以允许多个操作系统实例同时在同一硬件上运行,彼此完全隔离。这种虚拟机的例子包括 VMware ESXi、Microsoft Hyper-V 和 Oracle VirtualBox。

  2. 进程虚拟机:这种虚拟机为单个程序提供了一个执行环境,它仿佛是在完全独立的机器上运行。进程虚拟机的一个典型例子是 Java 虚拟机(JVM),它允许运行 Java 程序,程序与底层操作系统和硬件是独立的。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

  1. 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

  2. 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

  3. 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

Linux 容器

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

  1. 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

  2. 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

  3. 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

Docker 是什么?

Docker 是一个开源的容器化平台,它允许开发者打包应用及其依赖项到一个可移植的容器中,这些容器可以在任何支持 Docker 的机器上运行,确保了环境的一致性和应用的快速部署。Docker 使用 Linux 容器(LXC)技术,但它提供了比传统 LXC 更高级、更易用的功能集合。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 镜像(Images)

Docker 镜像是构建 Docker 容器的基础,它是一个轻量级、可执行的独立软件包,包含运行某个软件所需的所有代码、运行时环境、库、环境变量和配置文件。Docker 镜像一旦创建,即处于不变状态(immutable),不会随着容器的启动和停止而改变。镜像可以被视为容器的 蓝图,每当从镜像启动容器时,Docker 会使用该镜像创建一个新的容器。

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。

Docker 的用途主要有以下几个方面:

  1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

  2. 微服务架构:Docker 非常适合微服务架构,每个服务可以独立容器化,彼此隔离而又能轻松协作。

  3. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

Docker 的这些用途使得它成为在日常软件开发中不可或缺的工具,特别是在后端,就显得更为常见了,特别是在实现快速、一致且高效的开发和部署流程方面。

Docker 镜像的核心概念主要有以下几个方面:

  1. 分层存储:Docker 镜像采用了分层存储的架构。镜像由多个只读层组成,每一层对应镜像构建过程中的一组改动。例如,安装一个软件包会创建一个新的层,更新配置文件会创建另一个新的层。这种分层架构的好处是重用和共享,不同的镜像可以共享相同的层,这不仅减少了存储空间,还可以加速镜像的下载和传输。

就好像我们的房子,共用一个地基,但是每一层都是可以装修成不一样的风格。

  1. 联合文件系统(Union File System):联合文件系统是支持镜像分层的技术。它允许将多个不同的文件系统挂载到同一个工作目录,使得它们看起来像是一个单一的文件系统。这样,Docker 可以将各个层叠加起来,形成最终的文件系统。

  2. 镜像标签(Tags):Docker 镜像可以通过标签进行标识,这类似于软件版本号。标签允许开发者发布镜像的不同版本,便于管理和选择特定的版本进行部署。

20240423163420

Dockerfile 文件

Dockerfile 是一个文本文件,其中包含了一系列的指令和参数,这些指令和参数被 Docker 用来自动化地构建 Docker 镜像。每一个 Dockerfile 指令都会在镜像中创建一个新的层,这些层一起定义了镜像的最终内容和配置。

它描述了镜像构建的完整过程,包括基础镜像的选择、在构建过程中执行的命令(如安装软件、复制文件等)、设置的环境变量、暴露的端口等。

Dockerfile 和 Docker 镜像(image)之间的关系非常紧密,可以理解为 Dockerfile 是构建 Docker 镜像的“配方”或“蓝图”。

当我们在运行 docker build 命令并执行一个包含 Dockerfile 的目录时,Docker 会读取这个 Dockerfile,并按照里面定义的指令逐步构建一个新的 Docker 镜像。

因此,Dockerfile 和 Docker 镜像的关系可以总结为:Dockerfile 是镜像的构建脚本,而镜像是这个脚本的最终产物。

Dockerfile 和 Node.js 的 package.json 文件虽然用途不同,但确实有一些相似之处,特别是在自动化和标准化配置的方面。

它们的共同点主要有以下几个方面:

  1. 两者都用于自动化环境的搭建,Dockerfile 自动化容器的构建,而 package.json 自动化 Node.js 项目的依赖安装。

  2. 配置标准化:两者都通过文本文件定义项目或环境的配置,确保了不同环境下的一致性。

  3. 重复使用:通过版本控制,这些文件可以在不同项目中重用,减少了配置工作并提高了效率。

Dockerfile 的基本结构和指令

FROM 指令定义了镜像的基础,即使用哪个现有镜像作为起点。通常,这是一个已经包含了操作系统基础设施和一些预安装软件的镜像。

FROM ubuntu:18.04

RUN 指令用来执行命令行命令。它在当前镜像层上执行命令,并创建新的层。这常用于安装软件包、修改文件和其他构建任务。

RUN apt-get update && apt-get install -y nginx

CMD 指令提供了容器启动时默认执行的命令。如果 Docker 容器启动时没有指定其他命令,那么就会执行 CMD 指令中的命令。一个 Dockerfile 中只能有一个 CMD 指令。

CMD ["nginx", "-g", "daemon off;"]

EXPOSE 指令用于指定容器在运行时监听的端口。

EXPOSE 80

ENV 指令用于设置环境变量。这些环境变量可以在构建过程中使用,也会被嵌入到构建的镜像中,可用于运行时配置。

ENV NGINX_VERSION 1.14

ADD 和 COPY 是用来从构建环境复制文件到镜像中的。COPY 通常用于复制本地文件到镜像中,而 ADD 有额外的功能,比如自动解压压缩文件和从 URL 下载文件。

COPY ./app /usr/src/app
ADD http://example.com/big.tar.xz /usr/src/thirdparty

ENTRYPOINT 指令用于为容器配置一个容器启动时默认执行的命令,它可以与 CMD 指令搭配使用,以定义可传递给 ENTRYPOINT 的默认参数。

ENTRYPOINT ["nginx", "-g", "daemon off;"]
CMD ["-c", "/etc/nginx/nginx.conf"]

WORKDIR 指令用于设置在 Docker 容器内的工作目录。后续的 RUN, CMD, ENTRYPOINT, COPY, ADD 指令都会在这个目录下执行。

WORKDIR /usr/src/app

USER 指令用于指定运行容器内进程的用户身份。

USER nginx

VOLUME 指令用于在镜像中创建一个挂载点,用来挂载外部卷。

VOLUME /var/log/nginx

docker-compose

docker-compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 docker-compose,你可以通过一个单独的 docker-compose.yml 文件来配置你的应用服务。这让部署多容器应用变得更加简单和便捷。

它是一个使用 yaml 文件编写的,其定义了所有相关的服务、网络和卷。在这个文件中,你可以配置多个容器和它们之间的依赖关系、共享数据卷和网络设置。每个服务可以基于 Dockerfile 构建,或者直接使用现成的 Docker 镜像。

它的核心概念和组件主要有以下几个方面:

  1. 服务(Services):在 docker-compose.yml 中,服务代表一个应用容器。实际上,每个服务都定义了运行一个镜像的配置。如果你有一个复杂的应用,比如一个前端服务器、一个后端服务器和一个数据库,每个部分都可以被定义为一个服务。

  2. 网络(Networks):Docker Compose 允许你定义和使用自己的网络,以便容器间可以轻松通信。Compose 默认为你的应用程序设置一个网络,所有配置的服务都连接到这个网络。

  3. 卷(Volumes):卷用于数据持久化和数据共享。在 docker-compose.yml 文件中定义卷可以确保数据不会随着容器的停止而丢失,并且可以在多个容器之间共享数据。

接下来我们就用 docker-compose 来编写一个简单的示例,里面包括了 MongoDB 和 minio 服务:

version: "3.9"

services:
  mongo:
    image: mongo
    container_name: mongodb
    command: mongod --auth
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: soravideo
    restart: "always"

  minio:
    image: minio/minio
    volumes:
      - data:/data
      - config:/root/.minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: moment
      MINIO_ROOT_PASSWORD: moment666
    command: server /data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

volumes:
  mongodata:
  data:
  config:

docker-compose 是一个工具,它通过一个简单的 YAML 文件来管理和部署多容器应用。这个工具使得配置、部署和扩展应用变得更加简单和一致,特别是在涉及多服务架构的开发和测试过程中。它提高了项目的可移植性和维护效率,确保了开发和生产环境的一致性。

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

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

相关文章

网上预约就医取号系统

摘 要 近年来,随着信息技术的发展和普及,我国医疗信息产业快速发展,各大医院陆续推出自己的信息系统来实现医疗服务的现代化转型。不可否认,对一些大型三级医院来说,其信息服务质量还是广泛被大众所认可的。这就更需要…

如何制定新版FMEA培训后的知识应用考核机制?

随着新版FMEA的推出,如何确保培训后的知识能够得到有效应用,并转化为实际工作中的能力,成为了企业关注的焦点。本文,深圳天行健企业管理咨询公司将分享如何制定一套科学、实用的新版FMEA培训后知识应用考核机制,以助力…

四、SpringMVC实战:构建高效表述层框架(二)

二、SpringMVC接收数据 2.1 访问路径设置 RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。 SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求…

第六十六天打卡 | 卡码网101 孤岛的总面积、卡码网102 沉没孤岛、卡码网103 水流问题、卡码网104 建造最大岛屿

卡码网101 孤岛的总面积 这一题在昨天的基础上,将比较得出最大孤岛面积的逻辑改为统计所有孤岛面积之和的逻辑即可。 最近做项目的时候也发现,很多时候代码逻辑能够复用最好就不要再自己写,防止出错,当然刷代码题的时候不…

环境配置04:Pytorch下载安装

说明: 显存大于4G的建议使用GPU版本的pytorch,低于4G建议使用CPU版本pytorch,直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持,需要先安装CUDA,即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…

基于DPU的云原生裸金属网络解决方案

1. 方案背景和挑战 裸金属服务器是云上资源的重要部分,其网络需要与云上的虚拟机和容器互在同一个VPC下,并且能够像容器和虚拟机一样使用云的网络功能和能力。 传统的裸金属服务器使用开源的 OpenStack Ironic 组件,配合 OpenStack Neutron…

Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘)

问题描述 使用 view-ui-plus 加 vue3 开发项目,本地启动项目正常,但其他人将代码拉下来,启动项目时报错 Uncaught TypeError: Cannot read properties of null (reading isCE): 原因分析: 尝试将 mode_nodules 文件删…

量子计算:1 从薛定谔的猫开始

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技(Mamba,xLSTM,KAN)则…

C++ 编程技巧分享

侯捷 C 学习路径:面向对象的高级编程 -> STL库 -> C11新特性 -> cmake 1.1. C 与 C的区别 在C语言中,主要存在两大类内容,数据和处理数据的函数,二者彼此分离,是多对多的关系。不同的函数可以调用同一个数据…

【Linux进程】手把手教你如何调整----进程优先级(什么是优先级?为什么要有优先级?)

目录 一、前言 二、优先级的基本概念 🥝 什么是优先级? 🍍 为什么要有优先级? 三、如何查看并修改 --- 进程优先级 🍇 PRI and NI 🔥PRI🔥 🔥NI🔥 &#x1f3…

亿发开启极速开单新纪元,解锁业务新速度,提升企业竞争力

我们不断追求卓越,致力于通过技术革新,为客户带来更快捷、更智能、更全面的进销存管理体验。立即更新,享受更高效的业务处理流程。

A股3000点失守是出局还是机会?

今天的大A失守300点,那么A股3000点失守是出局还是机会? 1、今天两市低开,盘中一度跌破3000点,最低回踩到了2985点,盘面出现了两个罕见现象,意味着即将探底回升。 2、盘面出现两个罕见现象: 一是…

【嵌入式开发】UART

目录 一、概述 1.1 常见的通信类别/特点 1.2 常见几种通信 二、UART通信协议 2.1 UART通信介绍 2.2 UART通信协议 物理连接示意图: 三、STM32的UART接口 3.1 STM32的UART特点 3.2 STM32的UART框图分析 3.3 UART初始化步骤 3.4 STM32中UART使用 一、概述…

代码随想录第30天|贪心算法

122.买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得…

Java项目:基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城【ssm+B/S架构+源码+数据库+答辩PPT+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的绿色农产品推广应用网站果蔬商城水果商城蔬菜商城 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能…

kettle无法启动问题_PENTAHO_JAVA_HOME

1,遇到spoon.bat启动报错:先增加pause看清错误信息 1.1,错误信息 1.2,因为本地安装jdk1.6无法支持现有版本kettle。只能手动执行kettle调用的java路径;如下 系统--高级系统设置--高级--环境变量 启动成功

【CMake】CMake从入门到实战系列(十七)—— CMake添加环境检查

🔥博客简介:开了几个专栏,针对 Linux 和 rtos 系统,嵌入式开发和音视频开发,结合多年工作经验,跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏:C/C、Linux、rtos、嵌入式…

【无线传感网】LEACH路由算法

1、LEACH路由算法简介 LEACH协议,全称是“低功耗自适应集簇分层型协议” (Low Energy Adaptive Clustering Hierarchy),是一种无线传感器网络路由协议。基于LEACH协议的算法,称为LEACH算法。 2、LEACH路由算法的基本思想 LEACH路由协议与以往的路由协议的不同之处在于其改变…

C#.net6.0语言+前端Vue,Ant-Design开发的智慧医院手术室麻醉管理平台源码 什么是手术麻醉临床信息管理系统?

C#.net6.0语言前端Vue,Ant-Design开发的智慧医院手术室麻醉管理平台源码 什么是手术麻醉临床信息管理系统? 手术麻醉临床信息管理系统涵盖了手术进程管理、自动排班、手术记录、术前评估与麻醉记录等功能,强调了系统如何通过技术架构和数据集成提高工作…

python代码生成可执行文件

以下面转换图片尺寸的代码resize_images.py为例: 代码功能:原始图片放在img文件夹中,然后运行代码可以转换成指定分辨率,保存在同一目录下的新生成的文件夹中 import os import sys import cv2 from datetime import datetime f…