现代化应用部署工具-Docker

news2024/11/10 13:00:35

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.coloradmin.cn/o/1544164.html

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

相关文章

安卓转鸿蒙竟如此丝滑

随着鸿蒙的爆火,大家都想知道鸿蒙能不能搞? 相信大家搞开发的,都多多少少的了解过鸿蒙。近几个月鸿蒙的大动作也不少,如:重庆市近20个垂域应用与鸿蒙原生合作、深圳制定鸿蒙《行动计划》、阿里再次与鸿蒙展开合作&…

学习次模函数-第1章 引言

许多组合优化问题可以被转换为集合函数的最小化,集合函数是在给定基集合的子集的集合上定义的函数。同样地,它们可以被定义为超立方体的顶点上的函数,即,其中是基集合的基数-它们通常被称为伪布尔函数[27]。在这些集合函数中&…

“大变局开启”!比特币出现“资金出逃”!以太币ETF获批“乌云重重”!

比特币(BTC)在周(24)日最低来到63772美元之后,就持续震荡上涨。今(25)晨七点左右最高更逼近67628美元。以太坊(ETH)走势与BTC接近,清晨最高触及3471美元之后有所回调。 对于比特币的疲惫走势,业内人士指出,近期比特币价格创下新高…

OSCP靶场--Cockpit--待续

OSCP靶场–Cockpit 考点(sql注入绕过sudo tar提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.10 -Pn -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 01:40 EDT Nmap scan report for 192.168.…

向上生长

(1) 我记得2010年,在中国的苹果应用商店里,充斥的App还有很多:日历App、天气App、电池省电App、记事本App…。但这已经过去了2007-2008-2009三年,这些应用仍然很欢。 我有一个朋友算是中国最早一批开发iOS …

promethus的安装使用

1、# 软件下载地址 https://prometheus.io/download/ https://grafana.com/grafana/download https://prometheus.io/download/ Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。 Prometheus 的优点 1、非常少的外部依赖,安装…

普通员工如何快速成为领导 管理与领导的区别 你有想过你缺哪?

一切为了生存。 我的总结(我居然从来没想过) 1、领袖:领人导事。规划能力,画饼,对结果赏罚。用人,什么人能放心干成。 2、管理:管人理事。对人清楚,对事清楚。 3、通用能力&#x…

今日大模型论文 || 清华微软联合打造LLMLingua2,速度提升达2.9倍

引言:探索任务无关的提示压缩技术 在大型语言模型(LLMs)的应用中,提示(prompts)的使用已成为一种常见的技术,它通过丰富而信息量大的提示来处理复杂和多样化的任务。然而,这些提示往…

STL ④ —— 哈希

1. 散列表 根据 key 计算 key 在表中的位置的数据结构;是 key 和其所在存储地址的映射关系,即 hash(key) % size index struct node{void *key;void *value;struct node *next; };2. hash函数 2.1 hash函数的特点 计算速度快强随机分布性&#xff0…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 (1)下载 (2)上传 2、通过命令操作 rz、sz (1)下载 sz (2)上传 rz 二、压缩、解压 1、tar命令 (1)压缩 &…

成为创作者的第 730 天——创作纪念日

​​ 文章目录 📨 官方致信🎯我的第一篇文章🧩 机缘与成长 🎯 成就🎯 目标 📨 官方致信 今天早上打开 CSDN 私信一看,看到了这一条消息,然后看了下日期。突然感慨到,是…

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好,我是奇兵,今天介绍一下现代化静态站点生成器!,希望能帮到大家。 3 月 21 日, 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本!它专为构建快速、以内容为中心的网站而生,能够轻…

【Redis知识点总结】(六)——主从同步、哨兵模式、集群

Redis知识点总结(六)——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步 redis的主从同步,一般是一个主节点,加上多个从节点。只有主节点可以接收写命令,主节点接收到的写命令,会同步给从节点&#…

Maven从零到放弃:文档学习

学习背景: Maven一直在使用,自己也构建过相应的项目。也对常用的配置和命令有一些了解,也处理过一些相关的问题。例如:项目缺少依赖;版本冲突或其他构建失败的问题。但是一直没有进行系统性的学习。 链接:…

Redis锁,乐观锁与悲观锁

锁 悲观锁 认为什么时候都会出问题,无论做什么都会加锁 乐观锁 很乐观,认为什么时候都不会出问题,所以不会上锁。 更新数据时去判断一下,在此期间,是否有人修改过这个数据 应用于:秒杀场景 **watch*…

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅

小白如何兼职赚得第一桶金?六大网络赚钱方式助你轻松开启副业之旅 无需担忧,以下为你精心挑选的六大线上兼职方式,将助你轻松开启副业赚钱之旅。 1,参与网络调查:市场调研公司及品牌商为洞察消费者需求,常…

第14篇:2线-4线译码器

Q:有编码器那对应的就会有译码器,本期我们来设计实现2线-4线二进制译码器 。 A:基本原理:译码器是编码器的逆过程,其功能是将具有特定含义的二进制码转换为对应的输出信号。2线-4线二进制译码器有2个输入共4种不同的组…

九州金榜|孩子产生厌学心理应该怎么办?

孩子厌学孩子在成长学习过程中的一个经历,也是家长在对孩子教育中遇到的一大挑战,孩子产生厌心理家长要怎么办呢?很多家长会对此很无奈,下面九州金榜家庭教育给几个方法,帮助家长疏导孩子厌学心理。 来百度APP畅享高清…

图像变换(python)

前言 这个Python没学过,写的是真的不方便,有很多问题还没解决,暂时不想写了,感兴趣的同学可以完善一下。设计的思路就是摆几个控件然后将对应的函数实现,这个Python的坐标放置以及控件的大小我没弄懂,算出…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中,如果你想通过命令行查询出一系列匹配某个关键词的进程,并使用xargs命令批量结束这些进程,可以按照以下步骤操作: # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者,如果…