现代化应用部署工具-Docker

Docker

  1. 简介
    1. 什么是Docker

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

    1. Docker部署的优势

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

  2. Docker核心组件

    在这里插入图片描述

    1. 从上图中我们可以看出,Docker 在运行时分为 Docker 引擎和客户端工具。我们使用docker命令时,就是在使用客户端工具与Docker引擎进行交互。客户端工具 我们可以从官网下载安装,我们主要来说上图中的 Images(镜像)Containers(容器) Registry(仓库) 这三个核心组件。
    镜像
    • 可以把镜像文件理解成一个进程运行所需软件的集装箱,在部署时我们每台机器都会拉取相同版本的镜像文件,进行安装生成对应的容器。所有机器使用的镜像文件全部相同,容器的软件版本也一致。即使我们修改了容器的软件版本,但要是销毁容器,软件的改动也会消失。如果需要再次部署,我们只需要使用现有的镜像文件即可,生成的容器也与之前保持一致。即使需要升级软件版本,只需要修改镜像文件,这样集群内的所有机器都会重新拉取更新后的镜像,实现软件的统一升级,解决了软件版本混乱的问题。

    • 镜像相关常用命令

    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  # 给镜像添加一个标签
    ...
    
    容器
    • 容器是基于 Docker 镜像创建的可运行实例。容器具有轻量级独立性可移植灵活性的重要特性。每个容器都是一个独立的运行环境并且是相互隔离的,且都拥有自己的文件系统、网络空间和进程空间,避免出现应用程序间的干扰,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。

    • 容器相关常用命令

      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[容器名称] # 强制停止容器
      ...
      
    仓库
    • Docker仓库主要是用来存储和共享Docker镜像的地方。我们可以从仓库中获取镜像,并将本地构建的镜像推送到仓库中进行存储。

    • 仓库相关常用命令

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

    在这里插入图片描述

    1. 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
        

        在这里插入图片描述

        在这里插入图片描述

        7fdd2f5f7e0874e619914632f819b0dfa5aa594fe3d2056bbd22b99da3e3d1be 就是我们的容器Id

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

       ```jsuser 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目录下

       ```jsnpm installnpm run buildcp -r dist/* /Users/xxxx/home/nginx/html```
      
      • 运行结果

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

        在这里插入图片描述

      1. 采用Dockerfile方式部署前端项目
      • 项目中新增Docker文件夹

        在这里插入图片描述

      • Dockerfile文件

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

       ```js# 拉取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镜像,最后运行起来。

       ```jsnpm installnpm run buildcp -r dist Docker/cd Dockerdocker build -f Dockerfile -t [镜像名称] . --no-cachedocker run -d -p 80:80 --restart=always --name [容器名称] [镜像名称]````d839a08958cdbf47747870f737da4e6e3b76668913781cd517a0f03d799973b6` 就是我们的容器Id 
      
      • 运行结果

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

      在这里插入图片描述

      1. 采用DockerFile+DockerCompose方式部署项目

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

      • 修改构建脚本

        将这条命令

       ```jsdocker run -d -p 80:80 --restart=always --name my_proect_container my_project:dev```替换成: ```jsdocker-compose up -d```
      
      • 项目中新增docker-compose.yml文件
       ```jsservices: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.rhkb.cn/news/285830.html

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

相关文章

构建品牌故事:Kompas.ai在叙事营销中的应用

引言 在数字化和全球化的浪潮中,品牌建设已经从单一的产品竞争演变为品牌故事的较量。叙事营销,作为一种通过讲述故事来传递品牌价值和理念的策略,已经成为连接品牌与消费者情感的桥梁。本文将深入探讨叙事营销的重要性,详细介绍K…

路由 (hash模式和history模式)

首先我们了解一下资源请求: 1.什么是资源 在浏览器需要某一个数据或文件进行解析或者浏览器在解析某个脚本的时候需要数据进行DOM渲染等工作,那么这个数据或文件就是浏览器的资源 2.资源怎么获取 浏览器的资源都必须通过资源请求的方式或从缓存中调出…

【Java程序设计】【C00371】基于(JavaWeb)Springboot的社区防疫物资申报系统(有论文)

TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…

MapReduce配置和Yarn的集群部署

一、集群环境,还是如下三台服务器 192.168.32.101 node1192.168.32.102 node2192.168.32.103 node3 二、YARN架构 YARN,主从架构,有2个角色 主(Master)角色:ResourceManager从(Slave&#x…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(三)—— 随机梯度下降

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 这篇文章中,咱们将使用Keras和TensorFlow…

看似简单的SQL,实则就是简单

加班遇到一个SQL问题,本想把别人的SQL改下成SparkSQL,在YARN上运行,然而数据一直对不上。 原SQL ⚠️说明:a.id,b.id没有空的,数据1:1,b.name可能存在空的 select a.id,b.id,b.name from tab…

JDK1.6、1.7、1.8内存区域的变化?

JDK1.6、1.7/1.8内存区域发生了变化,主要体现在方法区的实现: JDK1.6使用永久代实现方法区: JDK1.7时发生了一些变化,将字符串常量池、静态变量,存放在堆上 在JDK1.8时彻底干掉了永久代,而在直接内存中划出…

【每日八股】Java基础经典面试题4

前言:哈喽大家好,我是黑洞晓威,25届毕业生,正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结🥰。 本篇文章记录的Java基础面试题,如果你也在复习的话不妨…

阿里的库存秒杀是如何实现的?

一、阿里的库存秒杀的实现 阿里有很多业务,几十上百个业务线,各自都有一些需要做抢购、秒杀、热点扣将的场景。他们都用哪些方案呢? 我看了很多资料,也找了很多人做交流,最终得到的结论是啥都有,主要总结几个主流的&…

Linux离线部署gitLab及使用教程

一、下载gitLab的linux系统rpm包 地址:Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 找到这个最新版 点击下载 二、上传到linux系统 笔者是在windows系统下的vmware虚拟机中部署安装的,虚拟机中安装了cent…

《C++ Primer 第五版 中文版》第12章 动态内存【阅读笔记 + 个人思考】

《C Primer 第五版 中文版》第12章 动态内存【阅读笔记 个人思考】 12.1 动态内存与智能指针12.1.1 shared_ptr类 静态内存包括:初始化只读数据段,初始化读写数据段,未初始化数据和常量数据段。 详细在下面博客总结: Linux系统下…

商家如何自己零成本免费制作点餐小程序项目完整源码

现在点餐小程序成为餐饮店的标配,顾客只要扫码,即可进入小程序点餐。顾客付款后,后厨自动打印出订单并开始制作。整个过程非常方便流畅,甚至还可以免去收银(或服务)人员。那么,这种餐饮小程序要…

STM32—控制蜂鸣器(定时器)

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c tim_irq.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 定时器中断是利用定时器的计数功能(向上计数或向下计…

ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程

原文链接:ChatGPTGPT4科研应用、数据分析与机器学习、论文高效写作、AI绘图技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx2&sn014f5ae90306a3b1e8fd87ab58561411&chksmfa820329cdf58a3f72799a43016b223057fd1bd02284…

算法系列--动态规划--子序列(1)

💕"深思熟虑的结果往往就是说不清楚。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

某蓝队面试经验

背景 据小道消息说今年的国护疑似提前到了五月份,所以最近也是HW面试的一个高峰期啊,这里分享一下上次长亭的蓝队面试问题(附本人的回答,仅供参考) 面试问答 1、谈谈作为蓝队护网过程使用过厂商的设备 这里我回答的…

Spring Boot整合Spring Security

Spring Boot 专栏:Spring Boot 从零单排 Spring Cloud 专栏:Spring Cloud 从零单排 GitHub:SpringBootDemo Gitee:SpringBootDemo Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术…

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本: HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前,需要首先启动Hadoop,然后再启动HBase,并且启动HBase Shell,进入Shell命令提示符状态,具体命令如下: $ cd /usr/local…

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork:创建一个子进程 为什么要创建子进程? fork的原理: 进一步了解fo…