【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: mongocontainer_name: mongodbcommand: mongod --authports:- "27017:27017"environment:MONGO_INITDB_ROOT_USERNAME: adminMONGO_INITDB_ROOT_PASSWORD: soravideorestart: "always"minio:image: minio/miniovolumes:- data:/data- config:/root/.minioports:- "9000:9000"- "9001:9001"environment:MINIO_ROOT_USER: momentMINIO_ROOT_PASSWORD: moment666command: server /data --console-address ":9001"healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3volumes:mongodata:data:config:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个简单的Mybatis插件

1.编写一个类,实现Intercepter这个接口 2.完成这个类的方法,并通过注解Intercepts来告诉Mybatis这个插件拦截哪个类和哪个方法 3.在Mybatis的全局配置文件里注册这个插件,让插件生效 4.玩一个实际功能的插件

MySQL 示例数据库大全

前言: 我们练习 SQL 时,总会自己创造一些测试数据或者网上找些案例来学习,其实 MySQL 官方提供了好几个示例数据库,在 MySQL 的学习、开发和实践中具有非常重要的作用,能够帮助初学者更好地理解和应用 MySQL 的各种功…

树莓派4B学习笔记8:开机自启动Python脚本_kill关闭后台脚本

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

使用MyBatisPlus让数据库和实体类字段自动映射

文章目录 使用MyBatisPlus让数据库和实体类字段自动映射需求场景假如没有映射把映射放到sql语句中使用MyBatisPlus提供的注解简化映射 使用MyBatisPlus让数据库和实体类字段自动映射 需求场景 数据库表中的字段名字,与实体类中的属性名字不一致,我们想…

【Linux】进程间通信2——命名管道

1. 命名管道(FIFO) 1.1. 基本概念 简单,给匿名管道起个名字就变成了命名管道 那么如何给 匿名管道 起名字呢? 结合文件系统,给匿名管道这个纯纯的内存文件分配 inode,将文件名与之构建联系,关键点在于不给它分配 D…

618数码好物清单,这些好物你不容错过

每次的618大促中,有各类数码产品纷纷亮相,让人眼花缭乱,而且打折的力度都很高,那么在这个充满诱惑的购物季里,哪些电子数码好物值得你入手呢?今天,我就一起给题主盘点那些实用至上、绝对不吃灰的…

RT-Thread-Nano使能动态内存Heap后,程序无法运行

RT-Thread-Nano移植 1. 动态内存堆1.1 问题1.2 解决 3. 问题根源 1. 动态内存堆 1.1 问题 按照官方文档:在 RT-Thread Studio 上使用 RT-Thread Nano,新建nano工程后,可以正常运行。 但是开启内存管理后,系统无法正常启动&…

Docker高级篇之轻量化可视化工具Portainer

文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用,它提供了图形化界面,用于方便管理Docker环境,包括单机环境和集成环境。 2. Portainer安装 官网:https://www.portainer.io 这里我们使用docker命令安装&…

三分钟了解链动3+1模式

在电商领域的营销策略中,链动31模式以其独特的魅力和优势,吸引了众多商家的目光。下面,我们将对这一模式进行深度剖析,并探讨其相较于链动21模式的优势所在。 一、身份设置与奖励机制 链动31模式在身份设置上分为三种&#xff1…

C#观察者模式应用

目录 一、什么是观察者模式 二、C#中观察者模式的实现 三、两种实现的用法 1、事件与委托 2、IObserver和IObservable 四、参考文献 一、什么是观察者模式 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当…

C++: shared_ptr是线程安全的吗

导读 C面试中有时会有这样一个问题,shared_ptr是线程安全的吗?对此问题,我们需要从三个并发场景进行考虑,拷贝shared_ptr的安全性、对shared_ptr赋值的安全性和读写shared_ptr指向内存区域的安全性。 对于以上问题,首…

python flask配置数据库并进行orm操作 flask_sqlalchemy

🌈所属专栏:【Flask】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

Java——IO流(一)-(4/8):前置知识-字符集、UTF-8、GBK、ASCII、乱码问题、编码和解码等

目录 常见字符集介绍 标准ASCII字符集 GBK(汉字内码扩展规范,国标) Unicode字符集(统一码,万国码) 小结 字符集的编码、解码操作 方法 实例演示 常见字符集介绍 标准ASCII字符集 ASCll(American St…

YOLOv10改进 | 注意力篇 | YOLOv10改进CA注意力机制

1.CA介绍 摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。 在本文中,我们通过将位置信息嵌入到通道注意力中,提出了一种新颖的移动…

伊拉克目的港清关严控,所有管控范围内的产品务必申请COC证书

伊拉克目的港清关严控,所有管控范围内的产品务必申请COC证书,COC/COI 伊拉克使馆认证,欢迎随时咨询小詹 近期,伊拉克海关扩大了进口产品管控品类,从产品的12大类700多种商品拓宽到800多种商品, 伊拉克海关…

Nature发文介绍使用ChatGPT帮助学术写作的三种方式

文章链接:https://www.nature.com/articles/d41586-024-01042-3 一、介绍 这篇文章是由Dritjon Gruda撰写的,讨论了生成性人工智能(AI)在学术写作、编辑和同行评审中的三种应用方式。Gruda认为,尽管学术界对聊天机器…

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束,转战Ubuntu。我之所以写这篇文章,是因为我…

shell函数

shell函数 定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。 函数的格式&…

小规模自建 Elasticsearch 的部署及优化

本文将详细介绍如何在 CentOS 7 操作系统上部署并优化 Elasticsearch 5.3.0,以承载千万级后端服务的数据采集。要使用Elasticsearch至少需要三台独立的服务器,本文所用服务器配置为4核8G的ECS云服务器,其中一台作为 master + data 节点、一台作为 client + data 节点、最后一…

闲鱼平台与宝藏详情API接口

一、闲鱼平台简介 闲鱼,是我国知名二手交易平台,成立于2015年,隶属于阿里巴巴集团。联讯数据用户可以在闲鱼上买卖二手商品,实现闲置物品的流通与再利用。随着我国互联网经济的快速发展,闲鱼平台用户规模不断扩大&…