现代化应用部署工具-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镜像的地方。我们可以从仓库中获取镜像,并将本地构建的镜像推送到仓库中进行存储。

    • 仓库相关常用命令

     ```js
     docker 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配置文件,配置文件如下:

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

       ```js
       npm install
       npm run build
       cp -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镜像,最后运行起来。

       ```js
       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 
      
      • 运行结果

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

      在这里插入图片描述

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

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

      • 修改构建脚本

        将这条命令

       ```js
       docker run -d -p 80:80 --restart=always --name my_proect_container my_project:dev
       ```
      
        替换成: 
      
       ```js
       docker-compose up -d
       ```
      
      • 项目中新增docker-compose.yml文件
       ```js
       services:
           my_project:
               ports:
                   - 80:80
               restart: always
               container_name: my_proect_container
               image: my_project:dev
       ```
      
      • 运行结果:

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

在这里插入图片描述

总结

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

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

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

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

相关文章

R-Linux 免费ext2 / 3 / 4文件系统恢复软件简介(推荐)

R-Linux:只适合 3种类型的发行版使用。 R-Linux 免费ext2 / 3 / 4文件系统恢复软件简介(推荐) https://blog.csdn.net/allway2/article/details/102632495 R-Linux for Linux Technical Documentation https://www.r-studio.com/free-linux…

【docker常用命令】

1. 什么是docker Docker 是一种开源的容器化平台,用于开发、交付和运行应用程序。它允许开发人员将应用程序及其依赖项(如库、环境变量、配置文件等)打包到一个被称为容器的标准化单元中。这个容器包含了一切应用程序需要运行的所有内容&…

漫画之家”系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,…

nodejs+vue高校工作室管理系统python-flask-django-php

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校工作室管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

OpenCV4.9.0开源计算机视觉库核心功能(核心模块)

转到:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 介绍使用 下一篇:如何使用OpenCV扫描图像、查找表和时间测量 ​ OpenCV核心功能主要有以下各个:本文将开始介绍下列内容: Mat - 基…

ubuntu18安装opensips3.4,开启ws/wss/http接口模块

、如果是centos 7安装则使用yum 命令。 添加库地址注意系统类型,选择对应的系统类型和版本 curl https://apt.opensips.org/opensips-org.gpg -o /usr/share/keyrings/opensips-org.gpg echo "deb [signed-by/usr/share/keyrings/opensips-org.gpg] https:/…

client-go中ListAndWatch机制,informer源码详解

文章首发地址: 学一下 (suxueit.com)https://suxueit.com/article_detail/s9UMb44BWZdDRfKqFv22 先上一张,不知道是那个大佬画的图 简单描述一下流程 client-go封装部分 以pod为例 、先List所有的Pod资源,然后通过已经获取的pod资源的最大版…

nodejs+vue高校社团管理系统设计与实现python-flask-django-php

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想&a…

php搭建websocket

1.项目终端执行命令:composer require topthink/think-worker 2.0.x 2.config多出三个配置文件: 3.当使用php think worker:gateway命令时,提示不支持Windows。 4.打包项目为zip格式 5.打包数据库 6.阿里云创建记录 7.宝塔面板新增站点…

计算机网络⑧ —— IP地址

IP位于TCP/IP参考模型的第三层,也就是⽹络层 ⽹络层的主要作⽤:实现主机与主机之间的通信,也叫点对点通信 问题1:⽹络层(IP)与数据链路层(MAC)有什么关系呢? MAC的作⽤:实现直连的两个设备之间通信。IP的…

Stable diffusion(四)

训练自己的Lora 【DataSet】【Lora trainer】【SD Lora trainer】 前置的知识 batch size:模型一次性处理几张图片。一次性多处理图片,模型能够综合捕捉多张图片的特征,最终的成品效果可能会好。但是处理多个batch size也意味着更大的显存…

Arduino智能家居

文章目录 一、接线框图1、下载fritzing 二、Arduino IDE 下载三、实现代码 一、接线框图 1、下载fritzing https://github.com/fritzing/fritzing-app/releases打开的软件界面如下: 二、Arduino IDE 下载 官网地址 P.S. 如果upload代码过程中出现cant open de…

【boost_search搜索引擎】1.获取数据源

boost搜索引擎 1、项目介绍2、获取数据源 1、项目介绍 boost_search项目和百度那种不一样,百度是全站搜索,而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。 2、获取数据源 我们要实现一个站内搜索,我们就要有这…

SpringBoot配置JWT拦截器

目录 1.背景介绍 2.前提工作 3.具体代码 (1)相关依赖 (2)相关配置文件 (3)JwtUtils类 (4)准备好登录逻辑代码(Dao、Service、Controller) &#xff0…

MySQL B树 和B+数据的区别

MySQL B树 和B数据的区别 树分类:二叉树完全二叉树满二叉树堆红黑树 B树B树 首先我们搞清楚数据结构中的 树这个概念 树 分类: 二叉树 限定每个节点的子节点最多只有2个子节点,且有左右之分。完全二叉树 满二叉树 堆 红黑树 B树 B树 …

初识 Redis 浅谈分布式

目 录 一.认识 Redis二.浅谈分布式单机架构分布式是什么数据库分离和负载均衡理解负载均衡数据库读写分离引入缓存数据库分库分表引入微服务 三.概念补充四.分布式小结 一.认识 Redis 在 Redis 官网我们可以看到介绍 翻译过来就是:数以百万计的开发人员用作缓存、…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境,并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

【Flask】Flask数据模型关系

数据模型关系 一对多 如上所示,一个作者关联多个文章,暂时认定,一篇文章只能有一个作者。 作者以及文章的类定义如下所示: class Author(db.Model):id db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(128)…

实现登录拦截功能

1.4、实现登录拦截功能 温馨小贴士:tomcat的运行原理 当用户发起请求时,会访问我们像tomcat注册的端口,任何程序想要运行,都需要有一个线程对当前端口号进行监听,tomcat也不例外,当监听线程知道用户想要和…

Django之Celery篇(三)

一、任务交给Celery Django任务交给Celery的方法和普通使用Celery任务的调用基本无区别,只是将执行代码的放到到View视图中 而获取结果,往往并不能把结果和第1次请求一起响应,若想获取结果是通过第2次请求获取结果 代码如下: from django.http import HttpResponsefrom …