【深入浅出Docker】【三】Docker容器详解

文章目录

  • 一. Docker容器简介
  • 二. Docker容器详解
    • 1. 容器vs虚拟机
      • 1.1. 虚拟机模型
      • 1.2. 容器模型
      • 1.3. 虚拟机的额外开销
    • 2. 容器启动过程描述
    • 3. 容器进程
    • 4. 容器生命周期与文件保存
    • 5. 优雅地停止容器:两阶段方式停止并删除容器
    • 6. 利用重启策略进行容器的自我修复
      • 6.1. always策略
      • 6.2. unless-stopped 策略
      • 6.3. on-failure策略
    • 7. Web服务器示例
      • 为什么需要端口映射
    • 8. 查看容器详情
  • 三. 容器命令小结

本文主要描述了如下内容

  • 对容器和虚拟机两种模型进行了比较
  • 虚拟机模型的OS tax问题,并且分析了虚拟机模型相对于物理机模型的巨大优势,以及容器模型如何能够带来更加显著的提升
  • 使用docker container run命令启动一组简单的容器,并且对比了前台和后台运行容器在交互方面的差异性。
  • 杀死容器中PID为1的进程会杀死容器。
  • 如何启动、停止以及删除容器。
  • docker container inspect命令,该命令可以查看容器元数据的细节信息。

Docker已经基本实现由OCI发布的镜像和容器标准。这意味着读者在Docker容器这里学习的内容,同样可以在其他实现了OCI标准的容器运行时上应用。

 

一. Docker容器简介

容器是镜像的运行时实例。正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核

在这里插入图片描述

相关命令

# 启动一个新的容器
# 指定了启动所需的镜像以及要运行的应用。
docker container run <image> <app>docker container run -it ubuntu /bin/bash
# -it参数可以将**当前终端**连接到容器的Shell终端之上。容器随着其中运行应用的退出而终止。# 容器的停止、启动、删除
docker container stop
docker container start
docker container rm

 

二. Docker容器详解

1. 容器vs虚拟机

容器和虚拟机都依赖于宿主机才能运行。宿主机可以是笔记本,是数据中心的物理服务器,也可以是公有云的某个实例。

Hypervisor引导程序(通常称为Hypervisor Bootloader)是一个负责启动虚拟化环境中的虚拟机(VM)或虚拟化平台的组件。它在虚拟化环境中的作用类似于传统计算机系统中的引导程序,负责加载和启动操作系统。

 

1.1. 虚拟机模型

在虚拟机模型中,首先要开启物理机并启动Hypervisor引导程序​。一旦Hypervisor启动,就会占有机器上的全部物理资源,如CPU、RAM、存储和NIC。Hypervisor接下来就会将这些物理资源划分为虚拟资源,并且看起来与真实物理资源完全一致。然后Hypervisor会将这些资源打包进一个叫作虚拟机(VM)的软件结构当中。这样用户就可以使用这些虚拟机,并在其中安装操作系统和应用。

假设需要在物理机上运行4个应用,所以在Hypervisor之上需要创建4个虚拟机并安装4个操作系统,然后安装4个应用。当操作完成后,结构如图所示。

在这里插入图片描述

 

1.2. 容器模型

在Docker世界中可以选择Linux,或者内核支持内核中的容器原语的新版本Windows。与虚拟机模型相同,OS也占用了全部硬件资源。 在OS层之上,需要安装容器引擎(如Docker)​。

容器引擎可以获取系统资源,比如进程树、文件系统以及网络栈,接着将资源分割为安全的互相隔离的资源结构,称之为容器。

如下划分出的4个容器并在每个容器中运行一个应用。
在这里插入图片描述
 

Hypervisor(虚拟机监控器)和容器在虚拟化方面的区别和作用。

  1. Hypervisor(硬件虚拟化):
    它允许在物理硬件上创建和运行多个独立的虚拟机(VMs),每个虚拟机都有自己的操作系统和应用程序。Hypervisor将物理硬件资源(如CPU、内存、存储)划分为虚拟资源,从而实现资源隔离和管理。
  2. 容器(操作系统虚拟化):
  • 操作系统虚拟化:容器技术不涉及硬件虚拟化,而是利用操作系统内核的特性,将操作系统资源划分为虚拟资源,实现轻量级的隔离和部署。
  • 资源利用:容器通过共享操作系统内核和系统资源,提高了资源利用率,减少了资源消耗和启动时间。
  1. 硬件虚拟化 vs. 操作系统虚拟化
    Hypervisor通过硬件虚拟化提供底层硬件资源的隔离和管理;容器通过操作系统虚拟化实现对系统资源的划分和隔离运行在共享的内核上

 

Docker利用操作系统的内核功能(如cgroups和namespaces)来实现这种隔离:

  1. Namespaces:为每个容器提供独立的视图,隔离进程、网络、文件系统等。例如,PID namespace 隔离进程ID,Network namespace 隔离网络资源。
  2. Cgroups:控制和限制每个容器的资源使用(如CPU、内存、I/O),确保容器之间不会互相影响。 这种隔离机制允许容器在同一宿主机上独立运行,且不干扰彼此,从而实现高效的资源管理和安全性。

 

1.3. 虚拟机的额外开销

每个操作系统都需要开销

  1. 虚拟机模型将底层硬件资源划分到虚拟机当中。每个虚拟机都是包含了虚拟CPU、虚拟RAM、虚拟磁盘等资源的一种软件结构。因此,每个虚拟机都需要有自己的操作系统来声明、初始化并管理这些虚拟资源。
  2. 操作系统本身是有其额外开销的。例如,每个操作系统都消耗一点CPU、一点RAM、一点存储空间等。每个操作系统都需要独立的许可证,并且都需要打补丁升级,每个操作系统也都面临被攻击的风险。

容器具备

  1. 容器共享宿主机的一个操作系统/内核,这意味着只有一个操作系统消耗CPU、RAM和存储资源,只有一个操作系统需要授权,只有一个操作系统需要升级和打补丁。同时,只有一个操作系统面临被攻击的风险。当需要运行成百上千应用的时候,就会引起质的变化。

  2. 另一个值得考虑的事情是启动时间。 因为容器并不是完整的操作系统,所以其启动要远比虚拟机快。在容器内部并不需要内核,也就没有定位、解压以及初始化的过程——更不用提在内核启动过程中对硬件的遍历和初始化了。这些在容器启动的过程中统统都不需要!唯一需要的是位于下层操作系统的共享内核是启动了的!唯一对容器启动时间有影响的就是容器内应用启动所花费的时间。

 

2. 容器启动过程描述

docker container run -it ubuntu:latest /bin/bashUnable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
eed1663d2238: Pull complete 
Digest: sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30
Status: Downloaded newer image for ubuntu:latest# Shell提示符发生了变化,说明目前已经位于容器内部了。
# @之后的一长串数字就是容器唯一ID的前12个字符。
root@80e819b93ae8:/# 

启动过程描述

  1. Docker客户端选择合适的API来调用Docker daemon。
  2. Docker daemon接收到命令并搜索Docker本地缓存,观察是否有命令所请求的镜像。 在上面引用的示例中,本地缓存并未包含该镜像,所以Docker接下来查询在Docker Hub中是否存在对应镜像。找到该镜像后,Docker将镜像拉取到本地,存储在本地缓存当中(本地镜像缓存如何清理、如何更新镜像)。
  3. 一旦镜像拉取到本地,daemon就创建容器并在其中运行指定的应用
  4. 若尝试在容器内执行一些基础命令,可能会发现某些指令无法正常工作。这是因为大部分容器镜像都是经过高度优化的。这意味着某些命令或者包可能没有安装。下面的示例展示了两个命令——一条执行成功,一条执行失败。

 

3. 容器进程

ps -elf命令在容器内部查看存在的进程。按下Ctrl-Q组合键则会退出容器但并不终止容器运行。这样做会切回到Docker主机的Shell,并保持容器在后台运行。

查看容器列表

docker container ls CONTAINER ID   IMAGE                              COMMAND                   CREATED       STATUS                   PORTS                NAMES
8cdbf1e2555e   nginx:latest                       "/docker-entrypoint.…"   8 weeks ago   Up 4 minutes             0.0.0.0:80->80/tcp   docker-nginx-1
ff4ad6aedc59   langgenius/dify-api:0.6.11         "/bin/bash /entrypoi…"   8 weeks ago   Up 4 minutes             5001/tcp             docker-worker-1

进入到容器内部

docker container exec -it 8cdbf1e2555e bash root@8cdbf1e2555e:/# ls
bin  boot  dev docker-entrypoint.d  docker-entrypoint.sh  etc home  lib  media  mnt  opt  proc  root run  sbin  srv sys  tmp  usr  varroot@8cdbf1e2555e:/# whereis nginx 
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

停止和删除容器

docker container stop 3027eb64487
docker container rm 3027eb64487

 

4. 容器生命周期与文件保存

本节主要关注容器的生命周期——从创建、运行、休眠,直至销毁的整个过程。

新建一个容器,并在这个容器中创建一个文件


$ docker container run --name percy -it ubuntu:latest /bin/bash
root@9cb2d2fd1d65:/#
root@9cb2d2fd1d65:/# cd tmp
root@9cb2d2fd1d65:/tmp# echo "DevOps FTW" > newfile
root@9cb2d2fd1d65:/tmp# cat newfile
DevOps FTW

停止然后重启,看到文件存在

docker container stop percy 
docker container ls -a docker container start percy
# percy
docker container exec -it percy bash root@41ea8da1ab68:/# cd /tmp
root@41ea8da1ab68:/tmp# ls
newfile
root@41ea8da1ab68:/tmp# cat newfile 
DevOps FTW

上面说明了容器的持久化特性,但是卷(volume)才是在容器中存储持久化数据的首选方式。

docker container  stop percy   
docker container rm percy 
docker container ls -a  |grep percy 

直至明确删除容器前,容器都不会丢弃其中的数据。

 

5. 优雅地停止容器:两阶段方式停止并删除容器

当使用docker container rm <container> -f来销毁运行中的容器时,不会发出任何告警,来不及做任何事情。

先通过:docker stop,再rm
docker container stop命令向容器内的PID 1进程发送了SIGTERM这样的信号,会为进程预留一个清理并优雅停止的机会。如果10s内进程没有终止,那么就会收到SIGKILL信号。

 

6. 利用重启策略进行容器的自我修复

重启策略是容器一种自我修复能力,通常建议在运行容器时配置好重启策略,可以在指定事件或者错误后重启来完成自我修复。重启策略应用于每个容器,可以作为参数被强制传入docker-container run命令中,或者在Compose文件中声明​。

目前容器支持的重启策略包括always、unless-stopped和on-failed。

6.1. always策略

除非容器被明确停止(docker container stop),否则该策略会一直尝试重启处于停止状态的容器。

如下示例

# 我们在命令中指定运行Shell进程。当容器启动的时候,会登录到该Shell。
# 退出Shell时会杀死容器中PID为1的进程,并且杀死这个容器。
# 但是因为指定了--restart always策略,所以容器会自动重启。$ docker container run --name neversaydie -it --restart always alpine sh//等待几秒后输入exit/# exitdocker container ls
CONTAINER ID    IMAGE     COMMAND     CREATED           STATUS
0901afb84439    alpine    "sh"        35 seconds ago    Up 1 second#运行docker container ls命令,就会看到容器的启动时间小于创建时间。docker container stop neversaydie
neversaydiedocker container ls -a  |grep neversaydie
7e3c5c2cef3e   alpine                             "sh"                      5 minutes ago   Exited (137) 2 seconds ago                        neversaydie

有一个有意思的现象:
新创建一个容器并指定--restart always策略,然后通过docker container stop命令停止该容器。当重启Docker daemon,当daemon启动完成时,该容器也会重新启动。

 

6.2. unless-stopped 策略

always和unless-stopped的最大区别,处于Stopped (Exited)状态的容器,不会在Docker daemon重启的时候被重启。

 

6.3. on-failure策略

on-failure策略会在退出容器并且返回值不是0的时候,重启容器。就算容器处于stopped状态,在Docker daemon重启的时候,容器也会被重启。

 

Docker Compose中配置如下

version: "3.5"
services:myservice:<Snip>restart_policy:condition: always | unless-stopped | on-failure

 

7. Web服务器示例

在该示例中,会使用到我用于Pluralsight视频教程网站中的一个镜像。这个镜像会在8080端口启动一个相当简单的Web服务。

$ docker container run -d --name webserver -p 80:8080 \nigelpoulton/pluralsight-docker-ciUnable to find image 'nigelpoulton/pluralsight-docker-ci:latest' locally
latest: Pulling from nigelpoulton/pluralsight-docker-ci
a3ed95caeb02: Pull complete
3b231ed5aa2f:  Pull complete
7e4f9cd54d46:  Pull complete
。。。
Digest: sha256:7a6b0125fe7893e70dc63b2...9b12a28e2c38bd8d3d
Status: Downloaded newer image for nigelpoulton/plur...docker-ci:latest
6efa1838cd51b92a4817e0e7483d103bf72a7ba7ffb5855080128d85043fef21

启动命令解释:

  1. docker container run会启动一个新容器,
  2. -d表示后台模式,告知容器在后台运行。这种后台启动的方式不会将当前终端连接到容器当中。
  3. –name为容器命名
  4. -p 80:8080:指定端口,并将Docker主机的端口映射到容器内。它将宿主机的端口 80 映射到容器的端口 8080。换句话说,当你访问宿主机的端口 80 时,Docker 会将流量转发到容器的端口 8080。
    这常用于将容器中的服务暴露到主机上的端口,以便外部访问。

 

查看当前运行的容器以及端口的映射情况

$ docker container ls
CONTAINER ID  COMMAND         STATUS       PORTS               NAMES
6efa1838cd51  /bin/sh -c...   Up 2 mins  0.0.0.0:80->8080/tcp  webserver# 注意:
# 端口信息按照host-port:container-port的格式显示

在浏览器中指定Docker主机的IP地址或DNS名称,端口号是80。
 
在这里插入图片描述

 

为什么需要端口映射

直接访问容器的端口(如 8080)通常需要在容器内执行,或者使用 Docker 网络模式使容器直接暴露端口。

但在默认的桥接网络模式下,外部流量无法直接访问容器的端口,必须通过宿主机的端口进行转发。通过 -p 选项进行端口映射,确保外部可以访问到容器内部的服务。如果容器直接运行在宿主机上,使用宿主机的 IP 和指定端口是更常用的做法。

 

8. 查看容器详情

docker image inspect 38532784de04 > /Users/lianggao/Downloads/11.log..."Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"5001/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","LANG=C.UTF-8","GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D","PYTHON_VERSION=3.10.14","PYTHON_PIP_VERSION=23.0.1","PYTHON_SETUPTOOLS_VERSION=65.5.1","PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/dbf0c85f76fb6e1ab42aa672ffca6f0a675d9ee4/public/get-pip.py","PYTHON_GET_PIP_SHA256=dfe9fd5c28dc98b5ac17979a953ea550cec37ae1b47a5116007395bfacff2ab9","FLASK_APP=app.py","EDITION=SELF_HOSTED","DEPLOY_ENV=PRODUCTION","CONSOLE_API_URL=http://127.0.0.1:5001","CONSOLE_WEB_URL=http://127.0.0.1:3000","SERVICE_API_URL=http://127.0.0.1:5001","APP_WEB_URL=http://127.0.0.1:3000","TZ=UTC","COMMIT_SHA=12c815c597b121357151c798aae6580304416937"],"Cmd": null,"ArgsEscaped": true,"Image": "","Volumes": null,"WorkingDir": "/app/api","Entrypoint": ["/bin/bash","/entrypoint.sh"],

 

三. 容器命令小结

docker container run创建容器。
docker container run -it ubuntu /bin/bash命令会在前台启动一个Ubuntu容器,并运行Bash Shell。
Ctrl-Q会断开Shell和容器终端之间的链接,并在退出后保持容器在后台处于运行(UP)状态。
docker container ls用于列出所有在运行(UP)状态的容器。如果使用-a标记,还可以看到处于停止(Exited)状态的容器。
docker container exec -it <c-name\id> bash在容器内部启动一个Bash Shell进程,并连接到该Shell。为了使该命令生效,用于创建容器的镜像必须包含Bash Shell。
docker container stop命令会停止运行中的容器,并将状态置为Exited(0)。该命令通过发送SIGTERM信号给容器内PID为1的进程达到目的。如果进程没有在10s之内得到清理并停止运行,那么会接着发送SIGKILL信号来强制停止该容器。
docker container rm会删除停止运行的容器。
docker container inspect命令会显示容器的配置细节和运行时信息。

 

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

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

相关文章

SpringBoot依赖之Spring Data Redis实现位图Bitmap

Spring Boot 项目中使用 Spring Data Redis 实现位图Bitmap 暂未发表&#xff0c;记录于20240820 概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous,…

学习 node.js 六 Markdown 转为 html,zlib

目录 Markdown 转为 html 安装 ejs语法 标签含义 1. 纯文本标签 2. 输出经过 HTML 转义的内容 3. 输出非转义的内容(原始内容) marked browserSync zlib gzip deflate gzip 和 deflate 区别 http请求压缩 Markdown 转为 html 什么是markdown&#xff1f; Markdo…

分享思源笔记的几个骚操作

文章目录 思维导图复习法效果视频制作过程使用方法 大纲复习方法制作过程 人工智能简易使用效果制作过程 思维导图复习法 效果视频 bandicam20240817222246034.mp4 制作过程 首先下载【写味】主题或者是[自定义块样式]插件 他两个的区别是 思维导图以列表形式写出来 选择转…

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/19 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为单选&#xff0c;自我评价题&#xff0c;编程题 单选和自我评价这里不再介绍&#xff0c;4399的编程题一如既往地抽象&#xff…

redis AOF机制

在redis运行期间&#xff0c;不断将redis执行的写命令写到文件中&#xff0c;redis重启之后&#xff0c;只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中&#xff0c;因此其执行效率高于RDB&#xff0c;开启AOF即使Redis发生故障&#xff0…

前端使用miniO上传文件

项目背景:vue2&#xff0c;前提是请先安装miniO,若安装引入时报错&#xff0c;那就是版本不对&#xff0c;通常指定版本安装即可。 页面样式&#xff1a; 前端vue页面代码&#xff1a; //<el-form>表单中:<el-form-item label"文件" prop"fileIds&q…

TY6802 同步整流PCB设计注意事项

TY6802 系列是一款用于反激式电源次级同步整流芯片&#xff0c;TY6802能可靠支持包括 DCM、CCM和准谐振模式。TY6802 集成了一个 100V 功率 MOSFET&#xff08;TY6802A&#xff1a;100V15mR; TY6802B&#xff1a;100V10mR; TY6802C&#xff1a;100V7.5mR;) &#xff0c;可以取代…

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及&#xff0c;网络安全问题日益严峻&#xff0c;API&#xff08;应用程序接口&#xff09;已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁&#xff0c;其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

JavaScript(25)——BOM、延迟函数、JS执行机制

BOM BOM是浏览器对象模型 window对象是一个全局对象&#xff0c;也就是JavaScript中的顶级对象所有通过var定义的全局作用域中的变量&#xff0c;函数都会变成window对象的属性和方法window对象下的属性和方法调用的时候可以省略window 延时函数 let a setTimeout(回调函数…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

【Python零基础学习】字典

文章目录 前言一、简单字典示例二、使用字典三、字典遍历四、嵌套总结 前言 Python 字典 是一种非常强大且灵活的数据结构&#xff0c;它允许你通过键&#xff08;key&#xff09;来存储和检索值&#xff08;value&#xff09;。想象一下&#xff0c;字典就像一个巨大的电话簿…

8月21日微语报,星期三,农历七月

8月21日微语报&#xff0c;星期三&#xff0c;农历七月十八&#xff0c;工作愉快&#xff0c;生活喜乐&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、今日出发&#xff01;中国体育代表团将分两批出征巴黎残奥会。 2、股价再创新高&#xff01;工商银行市值…

suricata编译安装和运行

目录 编译安装 运行 调试 编译安装 apt -y install autoconf automake build-essential cargo \ libjansson-dev libpcap-dev libpcre2-dev libtool \ libyaml-dev make pkg-config rustc zlib1g-dev apt-get install libpcre3-dev wget https://www.openin…

项目实战--SpringBoot整合EasyExcel实现数据导入导出

SpringBoot整合EasyExcel实现数据导入导出 一、前言二、实践2.1 实体类注解方式2.2 动态参数化导出导入 一、前言 在公司业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出是个非常常见的需求。 最近公司的项目采用EasyPoi来实现的&#xff0c;但是在数据量大的情…

GPT-SoVITS

文章目录 model archS1 ModelS2 model model arch S1 model: AR model–ssl tokensS2 model: VITS&#xff0c;ssl 已经是mel 长度线性相关&#xff0c;MRTE(ssl_codes_embs, text, global_mel_emb)模块&#xff0c;将文本加强相关&#xff0c;学到一个参考结果 S1 Model cla…

Linux进程间通信——SystemV消息队列与信号量

文章目录 消息队列信号量同步互斥原语、原子性信号量多线程并发访问锁 消息队列 SystemV除了共享内存之外&#xff0c;还有一个进程间通信的方式&#xff0c;是消息队列 我们说一切进程间通信的方式本质其实就是让不同进程看到同一份资源 这个消息队列的本质其实就是让两个进…

十二步:像玩游戏一样搞量化,量化交易不是“黑神话”

十二步&#xff1a;像玩游戏一样搞量化&#xff0c;量化交易不是“黑神话” 1、定义您的目标2、数据收集和清理3、构思4、模型开发5、回测6、风险管理7、交易成本分析 (TCA)8、模拟交易9、优化10、执行11、监控和维护12、记录和审查结论 《黑神话&#xff1a;悟空》今日上线了&…

OSPF-基础多区域实验

1.ENSP下载 阿里云盘分享 ⭐/*无需密钥 免费下载 安装不成功&#xff0c;可关注并私信博主*/ 2.OSPF的基础需求和规则 实验规则&#xff1a; 1.接口地址→XY.XY.XY.R /24 X:两者之间最小的 Y:两者之间最大的 R:谁的接口就是谁的编号 以R1和R2之间的连接为例&#xff0…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(中)

目录 一.Nginx版本和安装方式:源码编译安装 1.验证版本及编译参数 2.使用安装完成的二进制文件nginx 3.Nginx 启动文件 二.平滑升级和回滚 三.全局配置 实现 nginx 的高并发配置 四.核心配置&#xff1a;新建一个 PC web 站点 五.核心配置&#xff1a;location的详细使用…

GlobalMapper-大疆的航点kmz转航线文件展示空间轨迹

0序&#xff1a; 在大疆遥控器或者司空2中设置航线&#xff0c;都是一个个的航点&#xff0c;如果把航点转为航线&#xff0c;在三维地球中显示其空间效果。用于分析和实际物体的距离&#xff0c;或者展示该航线都做了哪些方面的考虑。 如何把一堆点连城一条线&#xff1f; 本…