Docker-Compose企业生产环境实战

news2024/11/25 4:25:01

1. Docker-Compose企业生产环境实战

  • Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。

2. Docker-Compose概念剖析

  • 我们知道Dockerfile 可以让用户管理一个单独的应用容器,而今天即将学习的 Compose 则是允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如:一台Web 服务容器关联后端的数据库服务容器等。
  • Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
  • 一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡
  • Docker-Compose的配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
  • 使用Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
  • Docker-Compose允许用户通过单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
  • Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

3. Docker-Compose部署安装

  • 安装Docker Compose 之前,需要先安装 Docker引擎服务,此处使用 Compose镜像方式安装Compose项目,然后执行如下命令:
//下载Docker compose脚本
[root@localhost ~]# curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

//添加脚本x权限
chmod +x /usr/local/bin/docker-compose

//查看版本信息
[root@localhost ~]# docker-compose --version
Docker Compose version v2.17.2

4. Docker-Compose命令实战

在这里插入图片描述

5. Docker-Compose常见概念

  • 服务(service)
  1. 一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目(project)
  1. 由一组关联的应用容器组成的一个完整业务单元。
  2. 一个项目可以由多个服务(容器)关联而成,Compose是面向项目进行管理。

6. Docker-Compose语法详解

  • version:指定本 yml 依从的 compose 哪个版本制定的。
  • build:指定为构建镜像上下文路径:
  • 例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3"
services:
  webapp:
    build: ./dir

  • 或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod

  • context:上下文路径。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。
  • cap_add,cap_drop
  • 添加或删除容器拥有的宿主机的内核功能。
cap_add:
  - ALL # 开启全部权限
cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限

  • cgroup_parent:为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
  • command:覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
  • container_name:指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
  • depends_on:设置依赖关系
  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

  • 注意:web 服务不会等待 redis db 完全启动 之后才启动。
  • deploy:指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
version: "3"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

  • 可以选参数:
  1. endpoint_mode:访问集群服务的方式。
endpoint_mode: vip 
  • Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
  • DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
  • labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
  • mode:指定服务提供的模式
  • replicated:复制服务,复制指定服务到集群的机器上。
  • global:全局服务,服务将部署至集群的每个节点。
  • 图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。
  • replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
  • resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
  • restart_policy:配置如何在退出容器时重新启动容器。
  • condition:可选 none,on-failure 或者 any(默认值:any)。
  • delay:设置多久之后重启(默认值:0)。
  • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
  • window:设置容器重启超时时间(默认值:0)
  • rollback_config:配置在更新失败的情况下应如何回滚服务。
  • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚
  • delay:每个容器组回滚之间等待的时间(默认为0s)
  • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)
  • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
  • update_config:配置应如何更新服务,对于配置滚动更新很有用。
  • parallelism:一次更新的容器数
  • delay:在更新一组容器之间等待的时间。
  • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在更新过程中可以容忍的故障率。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
    注:仅支持 V3.4 及更高版本。
  • devices:指定设备映射列表
devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

  • dns:自定义 DNS 服务器,可以是单个值或列表的多个值
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

  • dns_search:自定义 DNS 搜索域。可以是单个值或列表
dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

  • entrypoint:覆盖容器默认的 entrypoint
entrypoint: /code/entrypoint.sh
  • 也可以是以下格式:
entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

  • env_file:从文件添加环境变量。可以是单个值或列表的多个值
env_file: .env
  • 也可以是列表格式:
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

  • environment:添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment:
  RACK_ENV: development
  SHOW: 'true'

  • expose:暴露端口,但不映射到宿主机,只被连接的服务访问
  • 仅可以指定内部端口为参数:
expose:
 - "3000"
 - "8000"

  • extra_hosts:添加主机名映射。类似 docker client --add-host
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

  • 以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82  somehost
50.31.209.229   otherhost

  • healthcheck:用于检测 docker 服务是否健康运行
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
  interval: 1m30s # 设置检测间隔
  timeout: 10s # 设置检测超时时间
  retries: 3 # 设置重试次数
  start_period: 40s # 启动后,多少秒开始启动检测程序

  • image:指定容器运行的镜像。以下格式都可以
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

  • logging:服务的日志记录配置
  • driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file"
driver: "syslog"
driver: "none"

  • 仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小
logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10个文件
当达到文件限制上限,会自动删除旧得文件。

  • syslog: 驱动程序下,可以使用 syslog-address 指定日志接收地址
logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

  • network_mode:设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

  • networks:配置容器连接的网络,引用顶级 networks 下的条目
services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

  • aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
  • restart: “no”:是默认的重启策略,在任何情况下都不会重启容器
  • always:容器总是重新启动
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
estart: "no"
restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。
secrets
存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

  • security_opt:修改容器默认的 schema 标签
security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签

  • stop_grace_period:指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 
默认的等待时间是 10 秒。

  • stop_signal:设置停止容器的替代信号。默认情况下使用 SIGTERM
  • 以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器
stop_signal: SIGUSR1
  • sysctls:设置容器中的内核参数,可以使用数组或字典格式
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

  • tmpfs:在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run
tmpfs:
  - /run
  - /tmp
ulimits
覆盖容器默认的 ulimit。
ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

  • volumes:将主机的数据卷或着文件挂载到容器里
version: "3"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

7. Docker-Compose Nginx案例一

  • 基于docker-compose构建Nginx容器,并且实现发布目录映射,通过浏览器实现访问,操作步骤如下:

7.1. 编写docker-compose.yml文件,内容如下:

version: "3" 
services:
  nginx:
    container_name: www-nginx
    image: nginx:latest
    restart: always
    ports:
      - 80:80
    volumes:
    - /data/webapps/www/:/usr/share/nginx/html/

7.2. 创建发布目录:/data/webapps/www/,并且在发布目录新建index.html页面

mkdir -p /data/webapps/www/
echo "<h1>www.ys.com Nginx Test pages.</h1>" >>/data/webapps/www/index.html

7.3. 启动和运行docker-compose,启动Nginx容器

docker-compose up -d
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                               NAMES
cdfefbea8594   nginx:latest   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   www-nginx

7.4. 通过浏览器访问宿主机80端口,即可访问Nginx容器

在这里插入图片描述

7.5. docker-compose.yml内容剖析

指令解释
version版本号,通常写2和3版本
serviceDocker容器服务名称
container_name容器的名称
restart设置为always,容器在停止的情况下总是重启
imagedocker官方镜像上找到最新版的镜像
ports容器自己运行的端口号和需要暴露的端口号
volumes数据卷。表示数据、配置文件等存放的位置。(- . 这个表示docker-compose.yml当前目录)

8. Docker-Compose Tomcat案例二

  • 基于docker-compose构建Nginx容器和Tomcat容器,并且实现Nginx和Tomcat发布目录映射,同时实现nginx均衡tomcat服务,通过浏览器访问Nginx 80端口即访问Tomcat的8080端口,操作步骤如下:

8.1. 编写docker-compose.yml文件

version: "3"
services:
  tomcat01:
    container_name: tomcat01
    image: tomcat:latest
    restart: always
    ports:
      - 8080
  tomcat02:
    container_name: tomcat02
    image: tomcat:latest
    restart: always
    ports:
      - 8080
  nginx:
    container_name: www-nginx
    image: nginx:latest
    restart: always
    ports:
        - 80:80
    volumes:
        - ./default.conf:/etc/nginx/conf.d/default.conf
    links:
        - tomcat01
        - tomcat02


8.2. 创建nginx默认配置文件:default.conf,内容如下:

vim /data/default.conf

upstream tomcat_web {
        server tomcat01:8080 max_fails=2 fail_timeout=15;
        server tomcat02:8080 max_fails=2 fail_timeout=15;
}
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_pass http://tomcat_web;
        proxy_set_header host $host;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

8.3. 创建tomcat1和tomcat2网页文件

[root@localhost ~]# docker exec -it tomcat01 /bin/bash
root@58bcbf453d69:/usr/local/tomcat# mkdir webapps/ROOT
root@58bcbf453d69:/usr/local/tomcat# echo wo shi ys > webapps/ROOT/index.jsp

[root@localhost ~]# docker exec -it tomcat02 /bin/bash
root@c221423b1ded:/usr/local/tomcat# mkdir webapps/ROOT
root@c221423b1ded:/usr/local/tomcat# echo wo shi sxy > webapps/ROOT/index.jsp

8.4. 启动Docker-compose

[root@localhost ~]# docker-compose up -d
[+] Running 9/9
 ✔ tomcat02 7 layers [⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                         264.6s
   ✔ 74ac377868f8 Pull complete                                                                                                77.7s
   ✔ a182a611d05b Pull complete                                                                                                78.9s
   ✔ ad4fe29a3001 Pull complete                                                                                               228.3s
   ✔ 9d52462c5181 Pull complete                                                                                               228.3s
   ✔ ac04a5bb8dd2 Pull complete                                                                                               228.4s
   ✔ 9477858ddf22 Pull complete                                                                                               228.9s
   ✔ cc2062ac4c6a Pull complete                                                                                               229.0s
 ✔ tomcat01 Pulled                                                                                                            264.6s
WARN[0264] Found orphan containers ([mysql-db]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
[+] Running 3/3
 ✔ Container tomcat02   Started                                                                                                 1.1s
 ✔ Container tomcat01   Started                                                                                                 1.0s
 ✔ Container www-nginx  Started

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
a6b585276f8c   nginx:latest    "/docker-entrypoint.…"   12 minutes ago   Up 12 minutes   0.0.0.0:81->80/tcp, :::81->80/tcp                      www-nginx
7d6037beb05a   tomcat:latest   "catalina.sh run"         12 minutes ago   Up 12 minutes   0.0.0.0:32769->8080/tcp, :::32769->8080/tcp            tomcat02
bb9aa0c16d9e   tomcat:latest   "catalina.sh run"         12 minutes ago   Up 12 minutes   0.0.0.0:32768->8080/tcp, :::32768->8080/tcp            tomcat01
9f0cf4b99612   mysql:latest    "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql-db

8.5. 通过浏览器直接访问Nginx容器,默认访问宿主机的80端口即可,如图所示:

在这里插入图片描述

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

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

相关文章

手把手教你如何管理进程和计划任务管理

目录一、查看和控制进程1.1查看进程1.1.1 ps 命令— 查看静态的进程统计信息1.1.2ps -elf 命令— 查看静态的进程统计信息1.1.3grep过滤查询1.1.4top命令—动态查看进程信息1.1.5pgrep命令— 根据特定条件查询进程PID信息1.1.6pstree命令—查看进程树1.2控制进程1.2.1手动启动1…

单片机--第六章中断系统--例6-3学习

单片机--第六章中断系统--例6-3学习 同6-2图&#xff0c;要求&#xff1a;使用定时器T0中断实现流水灯操作&#xff0c;流水频率为每0.5s更替一次&#xff08;假设单片机外接11.0592MHZ的晶振&#xff09;。 这个代码实现的是流水灯的效果&#xff0c;即将多个 LED 灯依次点亮并…

.net6 Program.cs 文件解析

Program.cs 是整个Web应用程序的入口文件&#xff0c;.NET6 用了极简单的风格搞定了很多事情。 Program.cs中首先注意的是&#xff1a; 1.builder.Services.AddXXX是用来添加服务的&#xff0c;builder是WebApplicationBuilder对象&#xff1b; 2.builder.Services.Configure&…

【C++】判断语句中对变量的合理定义

先总结一下这篇博客的核心&#xff1a; C中&#xff0c;不允许重复定义同一个变量&#xff0c;否则保留的初次定义的值&#xff08;虽然编译能通过&#xff09;涉及到判断的多分支时&#xff0c;应在进判断分支之前定义好变量&#xff0c;如果在分支中分别定义会出现编译错误&…

基于HashData的湖仓一体解决方案的探索与实践

2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。HashData资深解决方案架构师李俊在4月8号专题会场6-“融合应用&#xff1a;湖仓技术创新”上发表了《基于…

从零开始学JAVA(05):面向对象编程--04

一、StringBuilder StringBuilder是一个非常方便的用来处理和拼接字符串的类&#xff0c;它和string不同的是&#xff0c;它是可变的 package com.lcy.learn;public class LearnStringBuilder {public static void main(String[] args) {// StringBuilder首先是可变的// 而且对…

牛客网算法八股刷题系列(九)训练过程损失函数不下降问题

牛客网算法八股刷题系列——训练过程损失函数不下降问题题目描述正确答案&#xff1a;D\mathcal DD题目解析延伸&#xff1a;训练过程损失函数不下降的其他情况题目描述 在训练神经网络时&#xff0c;损失函数(Loss)(\text{Loss})(Loss)在最初的几个Epoch\text{Epoch}Epoch时没…

delphi 实现Ribbon风格的窗体

随着office2007的兴起&#xff0c;微软让我们看到了Ribbon风格的窗体&#xff0c;现在很多软件也都开始使用Ribbon风格。 那么我们如果要自己开发&#xff0c;应当怎么做呢&#xff1f;本文就是为大家解开这个疑团的。 首先&#xff0c;Delphi本身并没有Ribbon风格的窗口可以直…

epoll为什么用红黑树?

网络编程的时候有没有碰到过 Socket 对象&#xff1f;或者在配置代理的时候&#xff0c;有没有碰到配置 Socket 地址&#xff1f;当你看到服务端 Socket、客户端 Socket 等名词时&#xff0c;是否可以明确理解这些概念&#xff1f; 学习好这些知识有一条主线&#xff0c;就是抓…

Dockerfile构建镜像缓慢解决方案总结

分几种不同的情况&#xff0c;不断更新中 1、Dockerfile apk add 下载更新软件时&#xff0c;比较慢&#xff0c;如何解决 例子如下&#xff1a; 更好一下仓库源 RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories或者改成科大的镜像 RUN…

android核心架构Framework组件介绍

作为一个android开发者&#xff0c;核心架构是必须要了解的。只有了解每个核心层的作用&#xff0c;才能更深入的理解和学习。本篇主要讲解Java Framework层核心代码流程。 文章目录一&#xff0c;Android系统架构1.System Apps2.Java Framework3.系统运行库层4.硬件抽象层&…

Matplotlib库的简单用法

Matplotlib库的简单用法 Matplotlib是python科学计算中最基础、最重要的绘图库&#xff0c;是Python中最流行的数据可视化库之一&#xff0c;它提供了大量的绘图函数和工具&#xff0c;可以让用户创建各种类型的图表和图形&#xff0c;一般使用matpltlib完全可以满足我们绘图需…

“成功学大师”杨涛鸣被抓

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 4月15日&#xff0c;号称帮助一百多位草根开上劳斯莱斯&#xff0c;“成功学大师”杨涛鸣机其团队30多人已被刑事拘留&#xff0c;培训课程涉嫌精神传销&#xff0c;警方以诈骗案进行立案调查。 …

基于4412的dm9000驱动移植

1 概述 以太网高速稳定的特性比Wifi无线传输有一定的优势&#xff0c;当无线传输无法满足一些智能设备&#xff0c;需要开发设计以太网模块。Linux支持以太网系统&#xff0c;结合4412开发板&#xff0c;重点学习dm9000驱动的设计与实现。 2 硬件资源分析 2.1 4412开发板以太网…

【Python】Python中的列表,元组,字典

文章目录列表创建列表获取元素修改元素添加元素查找元素删除元素列表拼接遍历列表切片操作元组创建元组元组中的操作字典创建字典添加/修改元素删除元素查找字典的遍历合法的key类型列表 列表是一种批量保存数据的方式&#xff0c;列表使用[]表示 创建列表 创建两个空列表 …

nginx优化及配置

nginx隐藏版本号 查看方法 浏览器F12 看network头部看server curl -i 192.168.232.7 获取头部&#xff08;查版本号&#xff09; 配置文件改 添加server_tokens off 改源码 cd /src/core vim nginx.h 修改 修改的IIS为window常用的软件服务 重新编译安装 cd nginx_1.2…

【C++】while 循环应用案例 - 猜数字游戏

目录 1、缘起 2、案例描述 3、代码 4、相关知识点 4.1、rand() 函数 4.2、srand() 函数 5、总结 1、缘起 猜数字游戏是一种简单而又有趣的游戏&#xff0c;在这个游戏中&#xff0c;计算机会生成一个随机数字&#xff0c;玩家需要通过不断猜测来猜出这个数字。在本篇博…

使用docker搭建lnmp环境+redis服务

lnmp搭建过程&#xff0c;前文已经写了传送门&#xff0c;本文主要写一下运行redis容器和php-fpm容器内安装redis扩展 redis 1.创建宿主机配置和数据文件夹 [rootlocalhost ~] mkdir -p /lnmp/redis/{data,conf}2.放置/lnmp/redis/conf/redis.conf文件 点我下载 3.启动容器 …

k8s+kubeedge+sedna安装全套流程+避坑指南+解决办法

最近在学习边缘计算要用到kubeedge&#xff0c;安装了好多次总会遇到各种各样的问题&#xff0c;因此在这里一一列出&#xff0c;以方便下次安装。则里面可能出错的地方太多&#xff0c;如果有问题&#xff0c;请私信联系。 一、环境准备 节点IP环境软件云端节点172.23.70.23…

Python|矿产卫片Excel经纬度坐标数据转换为shp点数据——OGR库实现

1.实验需求 基于Excel表格里面的经纬度坐标数据,自动生成点shp矢量文件,并添加属性信息。 2.编程思路详解 ①使用Pandas库读取原始矿产图斑列表表格; xlsx_path = uC:\\Users\\YaoJun\\Desktop\\矿产图斑列表.xlsx #sheet_name默认为0,即读取第一个sheet的数据 df = pd.…