Docker-现代化应用部署的利器

一、容器部署的发展

今天我们来说说容器部署。我们知道容器部署的发展大致分三个阶段,下面来介绍一下不同阶段的部署方式的优缺点

物理机部署

  • 优点是可以提供更高的性能、资源控制,也可以提供更好的数据隔离和安全性,因为不同的应用程序运行在独立的物理服务器上,拥有彼此之间的资源和数据都相互隔离等优点。

  • 缺点是采用物理机部署这种方式通常不能充分的利用好硬件资源,如果应用程序的负载较轻,会浪费一定的资源。但是如果我们要将多个应用进程、数据库和缓存进程等都部署在同一台机器上,这样虽然达到了高效利用物理机的资源的目的,但是也会发生一个很重要的问题就是进程之间发生资源抢占的问题,最终导致其他进程无法提供正常服务。并且应用程序与硬件设备是绑定的,所以我们扩展起来就不太容易。

虚拟机部署

  • 优点就是通过虚拟化技术将物理机分割成多台虚拟机,每个虚拟机在物理机上预先分配了一定的计算机资源(比如:CPU、内存、磁盘空间等),多个虚拟机可以在同一台物理服务器上运行,共享硬件资源,提高了资源利用率。虚拟机部署也可以快速创建、复制和迁移虚拟机实例,为我们的扩展提供了便捷等等。

  • 缺点就是如果在大规模集群部署的情况下,虚拟机技术可能导致软件的版本和配置文件有碎片化问题。不同虚拟机中的软件版本和配置文件可能不同,这或许会使问题排查变得困难。

容器化部署

为了解决以上部署方式的痛点,容器技术就应运而生了,而Docker就是一种常见的容器化平台。

888a787a1d65db7d913c6493dcdd1a40.png
docker与虚拟机对比图

二、Docker

1. Docker简介

9f36f3ac856571c45c5a5ee979b8eb43.png

1.什么是Docker

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。

2.Docker部署的优势

通过使用Docker等容器技术,可以将应用程序及其依赖项打包成轻量级的容器,这个容器中包含了应用程序所需的所有运行环境和配置。这样一来,无论在测试还是生产环境中,都可以保证应用程序运行的一致性,并且易于部署扩展和管理。容器化技术使得应用程序在不同环境之间的迁移更加简单,并且可以高效地利用资源

2. Docker核心组件

fc1e3da71189e46b3b2041585bf57f80.png
docker基础架构图

从上图中我们可以看出,Docker 在运行时分为 Docker 引擎和客户端工具。我们使用docker命令时,就是在使用客户端工具与Docker引擎进行交互。客户端工具 我们可以从官网下载安装,我们主要来说上图中的  Images(镜像)Containers(容器) Registry(仓库) 这三个核心组件。

镜像
  1. 可以把镜像文件理解成一个进程运行所需软件的集装箱,在部署时我们每台机器都会拉取相同版本的镜像文件,进行安装生成对应的容器。所有机器使用的镜像文件全部相同,容器的软件版本也一致。即使我们修改了容器的软件版本,但要是销毁容器,软件的改动也会消失。如果需要再次部署,我们只需要使用现有的镜像文件即可,生成的容器也与之前保持一致。即使需要升级软件版本,只需要修改镜像文件,这样集群内的所有机器都会重新拉取更新后的镜像,实现软件的统一升级,解决了软件版本混乱的问题。

  2. 镜像相关常用命令

docker search 镜像名称 # 从网络上查找需要的镜像
docker pull 镜像名称 # 从Docker的仓库下载镜像到本地,镜像名称格式为名称:版本号。例如:docker pull ubuntu:latest
docker images # 查看本地镜像 , -a: 查看本地所有镜像, -q: 查看本地镜像的id
docker rmi [-f] 镜像id[镜像名称] # 删除镜像 -f表示强制删除
docker rmi -f $(docker images -qa) # 删除所有镜像, 一次性删除,且删除后无法恢复
docker build -t your-image-name . # 根据Dockerfile创建一个镜像
docker tag your-image-name your-registry/your-repository:tag  # 给镜像添加一个标签
...
容器
  1. 容器是基于 Docker 镜像创建的可运行实例。容器具有轻量级独立性可移植灵活性的重要特性。每个容器都是一个独立的运行环境并且是相互隔离的,且都拥有自己的文件系统、网络空间和进程空间,避免出现应用程序间的干扰,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。

  2. 容器相关常用命令

docker ps # 查看正在执行的容器
docker ps # 查看所有正在运行的容器, -a: 包括运行中和已停止的 
docker run 参数
#参数说明:
#-i:保持容器运行。通过和-t同时使用。加入-it这两个参数以后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭。
#-t:为容器重新分配一个伪输入终端,通常和-i同时使用。
#-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。
#-it:创建的容器一般称为交互式容器。
#-id:创建的容器一般称为守护式容器、
#--name:威创建的容器命名。
#-p:映射端口 外部端口:容器内部暴露的端口
docker exec -it 容器id[容器名称] /bin/bash # 进入容器
docker rm 容器id[容器名称] # 删除容器
docker kill 容器id[容器名称] # 强制停止容器
...
仓库
  1. Docker仓库主要是用来存储和共享Docker镜像的地方。我们可以从仓库中获取镜像,并将本地构建的镜像推送到仓库中进行存储。

  2. 仓库相关常用命令

docker login you-registry.com # 登录docker仓库
docker logout you-registry.com # 从Docker仓库注销
be8a2f998792153b5d8abeba86d3919e.png

3. Docker部署案例

在执行以下命令前,请确保已经安装Docker环境了

下边三个案例分别采用:替换dist、采用Dockerfile方式、采用Dockerfile+docker-compose的方式进行部署并运行项目,您可以自行选择自己想要部署的项目进行操作。

1.部署nginx

  • 控制台输入如下命令,docker run 通过nginx:alpine镜像创建一个新的容器并运行,容器名称为nginx_demo,容器设置成自动重启,映射容器80、443端口到主机80、443,绑定nginx相关配置等卷挂载路径。

docker run -d \
--name nginx_demo --restart always \
-p 80:80 \
-e "TZ=Asia/Shanghai" \
-v /Users/xxx/nginx/home/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/xxx/nginx/home/nginx/logs:/var/log/nginx \
-v /Users/xxx/nginx/home/nginx/html:/usr/share/nginx/html \
nginx:alpine
517c73a42a8e6adc3bea893bb5ea4541.png
nginx目录
cd256da9867670e61be96aa956b55dbe.png

7fdd2f5f7e0874e619914632f819b0dfa5aa594fe3d2056bbd22b99da3e3d1be 就是我们的容器Id

  • 容器运行后修改nginx.conf配置文件,配置文件如下:

user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections  1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';sendfile on;keepalive_timeout 65;server{listen 80;server_name host.docker.internal;index index.html;root  /usr/share/nginx/html/dist;  #dist上传的路径# 避免访问出现 404 错误location / {try_files $uri $uri/ @router;index  index.html;}location @router {rewrite ^.*$ /index.html last;}}
}
  • 构建打包->部署

在前端项目中,安装依赖,执行打包命令生成dist文件夹,将打包好的dist文件夹拷贝到nginx目录下

npm install
npm run build
cp -r dist/* /Users/xxxx/home/nginx/html
  • 运行结果

执行完以上操作,我们可以直接访问本地 http://127.0.0.1:80 来查看结果

7645974c2305d05125288c6d0bd85b5a.png
运行结果
  1. 采用Dockerfile方式部署前端项目

  • 项目中新增Docker文件夹

0bacb35d76d4e3b24ddd6897d84fae2f.png
项目目录
  • Dockerfile文件

Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

# 拉取nginx基础镜像
FROM nginx:1.21.1# 维护者信息
MAINTAINER xxxx# 将dist文件中的内容复制到 `/usr/share/nginx/html/dist` 这个目录下面
COPY dist  /usr/share/nginx/html/dist
# 用本地配置文件来替换nginx镜像里的默认配置
COPY nginx/nginx.conf /etc/nginx/nginx.conf# 对外暴露的端口号
EXPOSE 80# 启动nginx容器
CMD ["nginx", "-g", "daemon off;"]
  • 修改nginx.conf文件与上方 案例1 中的nginx.conf配置文件保持一致即可

  • 构建打包-部署

在前端项目中,安装依赖,打包生成dist文件夹,将dist文件夹复制到Docker文件夹中,进行docker build命令打包docker镜像,最后运行起来。

npm install
npm run build
cp -r dist Docker/
cd Docker
docker build -f Dockerfile -t [镜像名称] . --no-cache
docker run -d -p 80:80 --restart=always --name [容器名称] [镜像名称]

d839a08958cdbf47747870f737da4e6e3b76668913781cd517a0f03d799973b6 就是我们的容器Id

13cc2289c0d24419b913246c0f2d6a2b.jpeg
  • 运行结果

执行完以上操作,我们可以直接访问本地 http://127.0.0.1:80 来查看结果

2b87ade7eed42cb5160acd92e4af3eb4.png
运行结果
  1. 采用DockerFile+DockerCompose方式部署项目

Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。Dockerfile可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目)。

  • 修改构建脚本

将这条命令

docker run -d -p 80:80 --restart=always --name my_proect_container my_project:dev

替换成:

docker-compose up -d
  • 项目中新增docker-compose.yml文件

services:my_project:ports:- 80:80restart: alwayscontainer_name: my_proect_containerimage: my_project:dev
  • 运行结果:

执行完以上操作,我们同样可以直接访问本地 http://127.0.0.1:80 来查看结果

三、结束

使用Docker部署应用带来了很多好处。开发人员可以在测试环境中构建Docker容器,测试通过后就可以将Docker容器轻松地部署到沙箱环境、生产环境中,而无需担心测试、沙箱环境和生产环境之间的配置差异问题。在这种情况下,应用程序在任何运行环境中都能保持一致,无需重新部署整个环境,减少了出错的可能性。同样Docker这种一致性和可移植性,也使得开发团队能够更加专注于应用本身的开发和优化,不需要花费大量时间来处理环境配置和兼容性问题。此外,Docker的轻量级特性意味着它可以更高效地利用系统资源,提供快速的启动时间和部署过程,从而加速开发周期并实现持续集成和持续部署等等。

总之,使用Docker部署应用可以简化开发流程、提高部署效率,并确保应用在不同环境中的一致性,为开发团队带来了极大的便利和效益。

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

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

相关文章

从0开始图形学(光栅化)

前言 说起图形学,很多人就会提到OpenGL,但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本,使得一些原理并不直观。可能你知道向量,矩阵,纹理,重心坐标等概念,但就是不知道这些概…

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子,父盒子加了固定定位,需要子盒子上下都有要边距,用margin或者padding挤开时,会出现缝隙是子盒子背景颜色的。 测试过了,有些手机型号有,有些没有,微信小程序同移…

vscode +git +gitee 文件管理

文章目录 前言一、gitee是什么?2. Gitee与VScode连接大概步骤 二、在vscode中安装git1.安装git2.安装过程3.安装完后记得重启 三、使用1.新建文件夹first2.vscode 使用 四、连接git1.初始化仓库2.设置git 提交用户和邮箱3.登陆gitee账号新建仓库没有的自己注册一个4…

绕过安全狗

本节我们想要绕过的安全狗版本为v4.023957 ,它是网站安全狗的Apache版。 首先搭建环境。渗透环境选用DVWA漏洞集成环境,下载地址 为http://www.dvwa.co.uk/ 。DVWA是一款集成的渗透测试演练环境,当刚刚入门 并且找不到合适的靶机时&#xff…

视觉开发板—K210自学笔记(二)

视觉开发板—K210 一、开发之前的准备 工欲善其事必先利其器。各位同学先下载下面的手册: 1.Sipeed-Maix-Bit 资料下载:https://dl.sipeed.com/shareURL/MAIX/HDK/Sipeed-Maix-Bit/Maix-Bit_V2.0_with_MEMS_microphone 2.Sipeed-Maix-Bit 规格书下载&…

vue3 之 商城项目—登陆

整体认识 登陆页面的主要功能就是表单校验和登陆登出业务 路由配置 模版 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 class"logo"&g…

在Ubuntu上部署Stable Video Diffusion动画制作

Stable Diffusion团队推出的开源模型Stable Video Diffusion&#xff0c;支持生成约3秒的视频&#xff0c;分辨率为5761024。通过测试视频展示了其令人瞩目的性能&#xff0c;SVD模型是一个生成图像到视频的扩散模型&#xff0c;通过对静止图像的条件化生成短视频。其特点主要包…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

无人机图像识别技术研究及应用,无人机AI算法技术理论,无人机飞行控制识别算法详解

在现代科技领域中&#xff0c;无人机技术是一个备受瞩目的领域。随着人们对无人机应用的需求在不断增加&#xff0c;无人机技术也在不断发展和改进。在众多的无人机技术中&#xff0c;无人机图像识别技术是其中之一。 无人机图像识别技术是利用计算机视觉技术对无人机拍摄的图像…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

第7章 智能租房——首页

学习目标 掌握房源总数展示功能&#xff0c;能够实现将统计的房源总数在首页中展示 掌握最新房源数据展示功能&#xff0c;能够实现将查询的最新房源数据在首页中展示 掌握热点房源数据展示功能&#xff0c;能够实现将查询的热点房源数据在首页中展示 了解智能提示搜索框的功…

Apache Paimon 文件操作

本文旨在澄清不同文件操作对文件的影响。 本页面提供具体示例和实用技巧&#xff0c;以有效地管理这些操作。此外&#xff0c;通过对提交&#xff08;commit&#xff09;和压实&#xff08;compact&#xff09;等操作的深入探讨&#xff0c;我们旨在提供有关文件创建和更新的见…

STM32 定时器

目录 TIM 定时器定时中断 定时器外部时钟 PWM驱动LED呼吸灯&#xff08;OC&#xff09; PWM控制舵机 PWMA驱动直流电机 输入捕获模式测频率&#xff08;IC&#xff09; 输入捕获模式测占空比 编码器接口测速(编码器接口) TIM 通用定时器 高级定时器 定时器定时中断 Ti…

springboot项目热部署实现(Spring Boot DevTools方式)

文章目录 Spring Boot DevTools简介Spring Boot DevTools原理spring Boot Devtools优缺点Spring Boot DevTools集成步骤第一步&#xff1a;添加maven依赖第二步&#xff1a;IDEA热部署配置 Spring Boot DevTools简介 Spring Boot DevTools是Spring Boot提供的一个开发工具&…

Vue事件中如何使用 event 对象

在Vue中&#xff0c;事件处理函数常常需要获取事件触发时的相关信息&#xff0c;比如鼠标位置、按键信息等。而要获取这些信息&#xff0c;就需要使用event对象。那么在Vue的事件中如何正确使用event对象呢&#xff1f;接下来就来详细介绍一下。 首先&#xff0c;在Vue的事件中…

JSP编程

JSP编程 您需要理解在JSP API的类和接口中定义的用于创建JSP应用程序的各种方法的用法。此外,还要了解各种JSP组件,如在前一部分中学习的JSP动作、JSP指令及JSP脚本。JSP API中定义的类提供了可借助隐式对象通过JSP页面访问的方法。 1. JSP API的类 JSP API是一个可用于创建…

专业145+总分400+合肥工业大学833信号分析与处理综合考研经验电子信息通信,真题,大纲,参考书

今年专业课145总分400&#xff0c;我总结一下自己的专业课合肥工业大学833信号分析与处理和其他几门的复习经验。希望对大家复习有帮助。 我所用的教材是郑君里的《信号与系统》&#xff08;第三版&#xff09;和高西全、丁玉美的《数字信号处理》&#xff08;第四版&#xff…

堆排序----C语言数据结构

目录 引言 堆排序的实现**堆的向下调整算法** 对排序的时间复杂度建堆的时间复杂度&#xff1a;排序过程的时间复杂度&#xff1a;总体时间复杂度&#xff1a; 引言 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;利用堆的数据结构来实现。它的…

备战蓝桥杯---动态规划之背包问题引入

先看一个背包问题的简单版&#xff1a; 如果我们暴力枚举可能会超时。 但我们想一想&#xff0c;我们其实不关心怎么放&#xff0c;我们关心的是放后剩下的体积。 用可行性描述即可。 于是我们令f[i][j]表示前i个物品能否放满体积为j的背包。 f[i][j]f[i-1][j]||f[i-1][j-v…

C++ 内存管理(newdelete)

目录 本节目标 1. C/C内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placem…