【docker入门】

news2024/11/27 18:25:09

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《窄门》读后感

《窄门》这本书是端午节期间在地铁和高铁上看完的,书的故事很简单,描绘的是一段爱而不得的感情。但是,这本书写的爱而不得和其他地方的爱而不得完全不是一码事,其他地方的爱而不得要么是“落花有意随流水,流水无意恋落…

EasyX 文本输出(自定义)函数报错

EasyX 文本输出(自定义)函数报错记录 原因:EasyX与字符串相关的函数,都有字符集问题 UNICODE 多字节字符集

java干货,spring声明式事务

文章目录 一、编程式事务1.1 什么是编程式事务1.2 编程式事务的优缺点 二、声明式事务2.1 什么是声明式事务2.2 声明式事务的优点2.3 Spring 事务管理器2.4 spring 声明式事务使用 一、编程式事务 1.1 什么是编程式事务 编程式事务是指通过手动编写程序来管理事务&#xff0c…

C#利用SignalR实现通信事例Demo

1.服务端安装SignalR的Nuget包 dotnet add package Microsoft.AspNet.SignalR --version 2.4.3 2.接下来,创建一个ChatHub类,它是SignalR通信的核心: using Microsoft.AspNetCore.SignalR;public class ChatHub : Hub {public static Dict…

苹果mac电脑救星CleanMyMac让我的电脑重获新生!

🎉 发现电脑的救星!CleanMyMac让我的电脑重获新生! CleanMyMac绿色免费版下载如下:记得保存哈,以防失效: https://pan.quark.cn/s/9b08114cf404 CleanMyMac X2024全新版下载如下: https://wm.makeding.…

awdawdad

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年6月20日 最后: 十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我: 1.一个冷知识: …

多路h265监控录放开发-(9)通过拖拽到窗口完成渲染

xcamera_widget.h class XCameraWidget :public QWidget {Q_OBJECTpublic:XCameraWidget(QWidget* p nullptr);//渲染视频void Draw();//123//清理资源,再一个窗口被覆盖后 清理之前窗口生成的资源1~XCameraWidget();//123 private:XDecodeTask* decode_ nullptr;//123XDemu…

高考填报志愿选专业,要善于发掘自身优势

每年的高考季,如何填报志愿又再成为困扰家长以及学生的难题,可能在面对大量的专业时,无论是考生还是家长都不知道应该如何选择,好的专业孩子不一定有优势,感兴趣的冷门专业又担心日后找工作难。 实际上,专业…

购买服务器,并安装宝塔

前言: 我们在开发项目时,总会遇到一个问题,就是将我们开发好的项目上传的公网中。对于中小型的项目,我们可以通过购买服务器进行项目的上线。 我们的项目一般是部署在Linux环境中。如果你不是专业的运维人员,可能对于…

『这世界上有无忧无虑的孩子,和永远焦虑的父母』

昨天,准确说是今天,凌晨两点多,被队友薅起来,严肃认真地讨论孩子的教育问题。 我们家的小神兽六岁,一年级了。从去年幼升小的阶段,我们就计划着好好培养孩子,在这一年间,给小朋友报过…

Linux下VSCode的安装和基本使用

应用场景:嵌入式开发。 基本只需要良好的编辑环境,能支持文件搜索和跳转,就挺OK的。 之所以要在Linux下安装,是因为在WIN11上安装后,搜索功能基本废了,咋弄都弄不好,又不方便重装win系统&#x…

HTTP网络协议

1.HTTP (1)概念: Hyper Text Transfer Protocol,超文本传输协议规定了浏览器和服务器之间数据传输的规则。 (2)特点 基于TCP协议:面向连接,安全基于请求-响应模型的:一次请求对应一次响应HTTP协…

2.APP测试-安卓adb抓取日志

1.打开手机的开发者模式,打开USB调试 (1)小米手机打开开发者模式: 【设置】-【我的设备】-【全部参数信息】-快速多次点击【OS版本】-进入开发者模式 (2)连接手机和电脑,手机打开USB调试 【设置…

“论软件系统建模方法”必过范文,软考高级,系统架构设计师论文

论文真题 软件系统建模(Software System Modeling)是软件开发中的重要环节,通过构建软件系统模型可以帮助系统开发人员理解系统、抽取业务过程和管理系统的复杂性,也可 以方便各类人员之间的交流。软件系统建模是在系统需求分析和系统实现之间架起的一 座桥梁,系统开发人…

Linux服务升级:Almalinux 升级 WebCatlog桌面程序

目录 一、实验 1.环境 2.Almalinux 升级 WebCatlog桌面程序 二、问题 1.Ubuntu如何升级 WebCatlog桌面程序 一、实验 1.环境 (1)主机 表1 主机 系统版本软件IP备注Almalinux9.4 WebCatlog 192.168.204.150 (2)Termi…

【物联网】NB-IoT

目录 一、什么是NBIOT 二、NB-IoT的特点 三、NBIOT的工作状态 四、移远NB-IoT模块及AT指令 一、什么是NBIOT NB-IoT(Narrow Band Internet of Things)窄带物联网,构建于蜂窝网络,所占用的带宽很窄,只需约180KHz&am…

mysql的安装和连接

一.数据库相关概 念 1.数据库 存储数据的仓库,数据是有组织的进行存储,简称DB。 2.数据库管理系统 操纵和管理数据库的大型软件,简称DBM。 3.SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。简称SQL。 二.市面上流行的数据库 1.ORACLE 2.MySQL …

定个小目标之刷LeetCode热题(27)

这道题,我们可以使用动态规划,假设数组元素范围是>0,那么递推关系式表示为 imax MAX(imax * nums[i], nums[i]),由于本题数组元素范围是整数,即存在负数,最大可能变最小,最小可能变最大,所…

指纹浏览器与虚拟机的区别及在跨境电商中的应用

在如今数字化世界中,隐私和安全变得愈发重要。许多人在网络上进行敏感操作,如网上购物、在线银行、社交媒体管理等。为了保护自己的隐私,人们常常会寻求一些额外的工具,比如指纹浏览器和虚拟机。这两种工具在保护个人隐私方面都有…

【Qt】学习Day1

文章目录 Qt简介创建第一个Qt程序创建过程介绍main函数工程文件头文件控件源文件快捷键按钮控件常用API对象树坐标系 信号和槽自定义信号自定义槽函数触发自定义的信号案例-下课后,老师触发饿了信号,学生响应信号,请客吃饭重载信号连接信号La…