使用Dockerfile配置Springboot应用服务发布Docker镜像-16

创建Docker镜像

springboot-docker模块

这个应用可以随便找一个即可,这里不做详细描述了。
在这里插入图片描述

pom.xml

依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义

    <dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

application.properties配置

spring.profiles.active = dev
spring.application.name=SpringbootDocker
server.port=19508management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=alwaysspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.fail-fast=true
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

SpringbootApplication启动类

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class AlibabaSpringbootDockerServerApplication {@Value("${server.port}")private String serverPort;public static void main(String[] args) {SpringApplication.run(AlibabaSpringbootDockerServerApplication.class, args);}@GetMapping("/helloworld/{uuid}")public BaseResponse<String> helloWorld(@PathVariable  String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle this request."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}
}

创建Dockerfile文件

内容如下,详细解释可参考文章最后:

#FROM openjdk:8
#需要先通过本地maven打包具体jar包,account版本与pom中version保持一致
#该文件为部署本地docker中的配置
#使用openjdk8, 基于哪个镜像
FROM openjdk
#将target中打包的文件映射到docker中,# 拷贝文件到容器,也可以直接写成ADD microservice-discovery-eureka-0.0 .1-SNAPSHOT.jar /app.jar
ADD target/springboot-docker-*.jar /springbootDocker.jar
#查看是否存在springbootDocker.jar文件
RUN bash -c 'touch ../springbootDocker.jar'
#容器启动后执行的命令,执行java -jar运行jar包,设置环境变量,时区,jvm
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Duser.timezone=GMT+08","-Xmx256m","-Xms256m","/springbootDocker.jar"]

Build Docker镜像

执行以下命令打包

mvn -clear package
docker build -t springbootapp:lecture .
docker run -it -d -p 19508:19508 springbootapp:lecture /bin/bash
docker logs containerId

在这里插入图片描述

使用shell脚本部署Docker镜像(可选)

新增localDeployment.sh文件,负责部署build出docker镜像并启动服务(下面这个文件需要修改一些源码)

#!/bin/bash
#部署前本地先maven package打包
#本地部署到本机docker
echo ========开始执行本地Docker部署========
#version是从pom.xml中的<version>0.0.1-SNAPSHOT</version>中取出来的,所以应该是0.0.1
CURRENT_V=$(echo $line | grep 'SNAPSHOT' pom.xml | awk '{split($0,a,"-"); print a[1]}'| awk '{split($0,a,">"); print a[2]}')
echo ========当前版本$CURRENT_V========
#如果docker中已经存在该版本或者运行着的版本,停止,删除服务,删除镜像
echo ========停止以及删除旧版本========
#停止在运行的版本服务
docker stop springboot-docker-$CURRENT_V
#删除刚刚停止的服务
docker rm springboot-docker-$CURRENT_V
#删除image镜像
docker rmi springboot-docker/$CURRENT_Vecho ========开始build新版本$NEW_V========
#build出新的镜像
docker build -t springboot-docker/$CURRENT_V .echo ========开始部署新版本$NEW_V========
#启动服务
docker run -it -d springbootapp:lecture /bin/bash
echo ========本地Docker部署完成========

源码下载

涉及模块:

  • springboot-docker:19508

源码下载:

  • 基础框架源码下载
  • 使用Dockerfile配置Springboot应用服务发布Docker镜像

源码运行方法:

  • 模块详细功能说明和运行测试方法

Dockerfile详细说明

一个简单的示例如下:

FROM openjdk:laster
#将target中打包的文件映射到docker中
ADD target/springboot-docker-*.jar /springbootDocker.jar
#查看是否存在springbootDocker.jar文件
RUN bash -c 'touch ../springbootDocker.jar'
#容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Duser.timezone=GMT+08","-Xmx256m","-Xms256m","/springbootDocker.jar"]

参考文档

  • 安装:https://hub.docker.com/editions/community/docker-ce-desktop-mac
  • 帮助:https://www.runoob.com/docker/docker-tutorial.html
  • 配置:https://docs.docker.com/reference/cli/dockerd/

指令说明

设置基础镜像(必选)

  • FROM:指定基于哪个基础镜像构建,FROM必须为第一个命令,比如FROM openjdk:laster

设置镜像作者(必选)

  • MAINTAINER: 维护者信息,比如 MAINTAINER yongboy "yongboy@gmail.com"

复制文件到镜像(必选)

  • ADD:将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget
  • COPY:功能类似ADD,但是不会自动解压文件,也不能访问网络资源

设置镜像环境变量

  • ENV:设置环境变量,在后续指令中使用,比如在RUN指令中使用,比如 ENV java_home /usr/etc/java
  • ARG:与ENV作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

设置运行指令的工作目录

切换工作目录,类似于cd命令,对RUN, CMD, ENTRYPOINT指令有效,比如WORKDIR /user/etc/bin,需要注意的是 WORKDIR 指定的工作目录,必须是提前创建好的。

运行指令(必选)

  • RUN : 在 docker build 时运行,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令,通常用于安装软件使用;
RUN <command> (the command is run in a shell - `/bin/sh -c`)
RUN ["executable", "param1", "param2" ... ]  (exec form)
  • CMD : 在docker run 时运行,设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。CMD ["<可执行文件或命令>","<param1>","<param2>",...] ,比如 CMD ["flask", "run"]
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
  • ENTRYPOINT:在docker run 后运行,当指定多个时只有最后一个起效,格式ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
ENTRYPOINT command param1 param2 (as a shell)

设置镜像端口(必选)

EXPOSE <端口1> [<端口2>...],用于docker run -p 命令中的 -p 参数指定

启动挂载目录

  • VOLUME:用于指定持久化目录,即使容器中的某个目录具有存储持久化数据的能力,比如VOLUME ["<路径1>", "<路径2>"...]
    可以避免重要的数据,因容器重启而丢失,或是避免容器不断变大。

其它指令

  • LABEL:用于为镜像添加元数据,比如 LABEL version=1.0LABEL desc= this is my first docker
  • USER:指定运行容器时的用户名
  • ONBUILD:用于设置镜像触发器,即当所创建的镜像做为其它镜像的基础时,所执行的命令

另一个示例

RUN mkdir -p /var/run/sshd# 添加orache java7源,一次性安装vim,wget,curl,java7,tomcat7等必备软件
RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7# 设置JAVA_HOME环境变量
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment# 设置Tomcat7初始化运行,SSH终端服务器作为后台运行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D

# Pull base image
FROM ubuntu:13.10MAINTAINER zing wang "zing.jian.wang@gmail.com"# update source
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update# Install curl
RUN apt-get -y install curl# Install JDK 7
RUN cd /tmp &&  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz
RUN mkdir -p /usr/lib/jvm
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/# Set Oracle JDK 7 as default Java
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300   
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300   ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/# Install tomcat7
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/ENV CATALINA_HOME /opt/tomcat7
ENV PATH $PATH:$CATALINA_HOME/binADD tomcat7.sh /etc/init.d/tomcat7
RUN chmod 755 /etc/init.d/tomcat7# Expose ports.
EXPOSE 8080# Define default command.
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out

Docker简介

Docker是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并发布到任何流行的Linux或Windows操作系统的机器上。以下是关于Docker的详细介绍:

  1. 定义:Docker是一个开源的应用容器引擎,它使用沙箱机制来确保容器之间是完全隔离的,每个容器都有自己的文件系统、进程空间和网络接口,这使得Docker容器具有很高的安全性和隔离性。
  2. 组成部分:Docker由DockerClient客户端、Docker Daemon守护进程、Docker Image镜像和Docker Container容器等部分组成。Docker客户端和守护进程之间的通信可以通过UNIX套接字或网络接口实现。
  3. 特点
  • 轻量级:Docker容器利用操作系统的资源更加高效,相比于虚拟机,容器更轻量,启动更快。
  • 可移植性:Docker容器可以在任何支持Docker的环境中运行,无论是本地开发环境、云服务器还是物联网设备。
  • 隔离性:Docker容器提供了隔离的运行环境,每个容器都有自己的文件系统、进程空间和网络接口,相互之间不会互相干扰,提供了更安全的环境。
  • 简化部署:Docker容器可以通过Docker镜像进行快速部署,减少了配置和依赖的问题,提高了应用的部署效率。
  1. 起源:Docker起源于PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,其源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。Docker的设计初衷是为了解决环境管理复杂、中间件相关问题以及虚拟化手段的变化等问题,提供了一种更高效、灵活和快速的解决方案。
  2. 使用方式:使用Docker时,开发者只需要将项目打包成镜像放到Docker中,然后通过Docker镜像进行快速部署。Docker还提供了Docker Compose等客户端工具,允许用户使用由一组容器组成的应用程序。

总的来说,Docker是一个功能强大的应用容器引擎,它提供了一种高效、灵活和快速的解决方案来管理和部署应用程序。

Docker常用命令

创建和修改镜像

创建镜像

docker build -t <imageName>:<tag> <-f Dockerfile的相对位置>

docker build -t springbootDemo:v1 .  #表示用当前目录下的Dockerfile创建镜像,tag:省略则默认为`latest`

其中 -t和-f是常使用的参数,-t为指定构建镜像的名字和版本,格式为’name:tag’,-f为指定其他目录下的DockerFIle文件。

修改镜像

docker commit的前提一般是进入容器,然后在容器中修改了一些内容,然后退出后,把容器保存为一个新镜像。

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
# -m: 提交的描述信息;
# -a: 指定镜像作者;
# e218edb10161:容器ID;
# runoob/ubuntu:v2: 指定要创建的目标镜像名

镜像打标

# 设置860cc279d2fec的标签,这相当于复制一个,不是直接修改
docker tag 860c279d2fec runoob/centos:dev 

发布镜像

docker push localhost:5000/namespace/dockerName:tag

dokcer push localhost:5000/lecture/springbootDemo:0.0.1

导入和导出

  • 针对Image的操作。
    • 导出:docker save 把镜像保存成一个文件供下载
    • 导入:docker load 把镜像文件加载为一个镜像
# 将镜像 runoob/ubuntu:v3 打包为 my_ubuntu_v3.tar
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3 # 导入使用 docker save 命令导出的镜像 
docker load < my_ubuntu_v3.tar   
  • 针对Container的操作。
    • docker export containerId > fileName
    • docker import - fileName imageName:tag
# 导出容器 1e560fca3906 快照到本地文件 ubuntu.tar,文件路径默认为本地用户根目录
docker export 1e560fca3906 > ubuntu.tar# 导入本地文件到test/ubuntu:v1镜像
docker import ubuntu.tar test/ubuntu:v1

import和export是快照操作,而镜像docker save将保存完整记录。export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。所以一般会用save和load;

全局服务命令

docker info #查看docker基本信息
docker network ls #查询本机镜像网络
docker container ls -a #查看所有容器
docker images #查看所有镜像
docker ps  # 查看容器启动情况
docker login -u 用户名 -p 密码 #登陆仓库

Image 操作命令

查询远程镜像

docker search is-official=true openjdk  #查询远程镜像,is-official=true表示只查询官方镜像

拉取远程镜像到本地

docker pull redis:v2 #这里的v2其实是tag,类似版本的概念

删除本地镜像

docker rmi redis

Container 操作命令

启动新容器

docker run -it -d imageName /bin/bash

  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -v: 绑定一个卷
  • –name name:指定一个自定义的容器名字
  • –env-file=[]: 从指定文件读入环境变量;
# 在容器里执行 bin/echo "Hello world",然后输出结果
docker run ubuntu:15.10 /bin/echo "Hello world" Hello world # 主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data nginx:latest# 指定IP和端口
docker run -p 127.0.0.1:80:80 -v /data:/data nginx:latest

查看容器运行情况

# 查看容器内输出
docker logs -f containerid
# -f : 跟踪日志输出
# --since :显示某个开始时间的所有日志
# -t : 显示时间戳
# --tail :仅列出最新N条容器日志# 查看指定端口映射
docker port containerid# 查看容器内部运行的进程
docker top containerid# 查看 Docker 的底层信息
docker inspect containerid# 显示容器启动后更改了哪些原镜像的文件
docker diff containerid

重启/暂停

docker stop containerid #停止已启动的容器
docker start containerid #启动已停止的容器 
docker restart containerid #重启已启动的容器 
docker pause containerid #暂停已启动的容器
docker unpause containerid #恢复已启动的容器

删除容器

docker rm -f 1e560fca3906
# -f :通过 SIGKILL 信号强制删除一个运行中的容器。
# -l :移除容器间的网络连接,而非容器本身。
# -v :删除与容器关联的卷。# 删除所有处于终止状态容器
docker container prune

进入容器

# 进入容器
docker exec -it 243c32535da7 /bin/bash

Docker使用技巧

阿里云镜像加速

配置:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

  • 上面地址是需要申请的,每个人都不一样。

容器和主机间复制文件

# 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下
docker cp /www/runoob 96f7f14e99ab:/www/# 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中
docker cp  96f7f14e99ab:/www /tmp/

网络设置

镜像共享使用宿主主机的网络

使用固定参数--network=host,有时大多数 Docker 引擎安装时会将主机表示为默认 docker0 桥接网络上的 172.17.0.1。比如可以在容器里通过172.0.17.1:3306访问到宿主机的mysql服务器。

docker run -d --network=host my-container:latest
设置镜像中的localhost指向宿主主机

把镜像程序中的localhost 替换成 host.docker.internalhost.docker.internal 只适用于从容器内部访问宿主机。如果想要在容器之间进行通信,可以使用容器名称或 IP 地址。

使用 link 参数实现容器互通
  1. 运行第一个容器:
docker run -it --name centos-1 docker.io/centos:latest
  1. 运行第二个容器:
[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest# --link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器)
使用桥接设置Docker独享网络
  1. 运行 docker network create lcgnet 创建一个新的bridge网络,并通过 docker network ls查看是否创建成功。
  2. 通过指定网络的方式创建容器lcg。
docker run -it --name lcg --network lcgnet --network-alias lcgsky mycentos:1.3--network lcgnet :表示使用lcgnet网络
--network-alias lcgsky: 表示网络别名为lcgsky
  1. 使用相同方式创建容器lcg1
docker run -it --name lcg1 --network lcgnet --network-alias lcgsky1 mycentos:1.3
  1. 可以使用网络别名加端口号这用方式访问容器中服务。

docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>

推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip是否变动,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,隔离不同的网段。

连接宿主主机的mysql
  1. 设置Mysql访问权限
grant all privileges on . to 'root'@'%' identified by 'root' with grant option;# 上面的 on . 也可换成 on *.*

安装私有Docker仓库(本机)

-软件地址 : https://github.com/distribution/distribution

docker run -d -p 15000:15000 --restart=always --name registry2 registry:2

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

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

相关文章

[数据集][图像分类]杂草分类数据集17509张9类别

数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;17509 分类类别数&#xff1a;9 类别名称:["chineseapple","lantana","negatives","parkinsonia","part…

48-Qt控件详解:Buttons Containers2

一 Group Box:组合框 #include "widget.h"#include<QGroupBox> #include<QRadioButton> #include<QPushButton> #include<QVBoxLayout>//可以在水平方向和垂直方向进行排列的控件&#xff0c;QHBoxLayout/QVBoxLayout #include <QGridLa…

解决宝塔Nginx和phpMyAdmin配置端口冲突问题

问题描述 在对基于宝塔面板的 Nginx 配置文件进行端口修改时&#xff0c;我注意到 phpMyAdmin 的端口配置似乎也随之发生了变化&#xff01; 解决方法 官方建议在处理 Nginx 配置时&#xff0c;应避免直接修改默认的配置文件&#xff0c;以确保系统的稳定性和简化后续的维护…

大数据可视化实验三——数据可视化工具使用

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1. 下载并安装Tableau软件.. 1 2. 使用HTML5绘制Canvas图形.. 2 3. 使用HTML5编写SVG 图形... 5 4. 使用R 语言编写可视化实例.. 7 四、总结与心得体会... 7 五、思考问题... 8 一、实验目的 1&#xff…

C++-Linux工程管理

1 Makefile和CMake实践 1.1 Makefile 参考 简介&#xff1a; Makefile是一种用于自动化构建和管理程序的工具。它通常用于编译源代码、链接对象文件以生成可执行文件或库文件。Makefile以文本文件的形式存在&#xff0c;其中包含了一系列规则和指令&#xff0c;用于描述程序的…

python数据分析——seaborn绘图1

参考资料&#xff1a;活用pandas库 matplotlib库是python的和兴绘图工具&#xff0c;而seaborn基于matplotlib创建&#xff0c;它为绘制统计图提供了更高级的接口&#xff0c;使得只用少量代码就能生成更美观、更复杂的可视化效果。 seaborn库和pandas以及其他pydata库&#xf…

OpenHarmony 实战开发——移植通信子系统

通信子系统目前涉及Wi-Fi和蓝牙适配&#xff0c;厂商应当根据芯片自身情况进行适配。 移植指导 Wi-Fi编译文件内容如下&#xff1a; 路径&#xff1a;“foundation/communication/wifi_lite/BUILD.gn” group("wifi") {deps [ "$ohos_board_adapter_dir/ha…

C++基础与深度解析 | 数组 | vector | string

文章目录 一、数组1.一维数组2.多维数组 二、vector三、string 一、数组 1.一维数组 在C中&#xff0c;数组用于存储具有相同类型和特定大小的元素集合。数组在内存中是连续存储的&#xff0c;并且支持通过索引快速访问元素。 数组的声明&#xff1a; 数组的声明指定了元素的…

【数据结构】数组循环队列的实现

队列&#xff08;Queue&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循FIFO&#xff08;First In First Out&#xff0c;先入先出&#xff09;的原则。队列只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#…

python下载及安装

1、python下载地址&#xff1a; Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安装 &#xff08;1&#xff09; 直接点击下载后的可执行文件.exe &#xff08;2&…

Spring Boot项目怎么集成Gitee登录

一、背景 现在的越来越多的项目&#xff0c;需要集成第三方系统进行登录。今天我们以Spring Boot项目集成Gitee为例&#xff0c;演示一下怎么使用Oauth2协议&#xff0c;集成第三方系统登录。 不了解oauth2的&#xff0c;可以看我之前的文章。Ouath2是怎么实现在第三方应用认…

计算机毕业设计Python+Spark知识图谱课程推荐系统 课程预测系统 课程大数据 课程数据分析 课程大屏 mooc慕课推荐系统 大数据毕业设计

1 绪 论 1.1 课题研究背景 在线教育学习平台是学生用来进行校内或校外拓展课程学习的平台&#xff0c;平台需要具备在线视频观看&#xff0c;作业提交&#xff0c;形成性考核等功能。在学生学习的过程中&#xff0c;学校的管理者或负责教师需要了解学生的学习情况和学习状态&…

WWW服务器搭建(2)——Apache服务器配置与管理

一、Apache简介 1.1 关于Apache Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的Web服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。…

01-02-5

1、单链表中按位置查找 a.原理 通过传递的位置&#xff0c;返回该位置对应的地址&#xff0c;放到主函数定义的指针变量中。 我们认为位置从&#xff1a;有数据的节点开始计数 即如下结构&#xff1a; 查找位置&#xff0c;就是返回该位置对应的空间地址。 b.代码说明 Ⅰ…

H5嵌入原生----兼容安卓与ios

主要分UI展示&#xff0c;键盘&#xff0c;输入框等等。解决bug最苦恼的问题不是没有解决方案&#xff0c;而是你没有找到真正的原因。再就是现象难以重现&#xff0c;每次都要发布代码&#xff0c;然后到手机app中去测试&#xff0c;模拟。这些地方会耗费大量的精力。 一、UI…

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法&#xff08;结构化与面向对象&#xff09; 数据库 操作系统 知识产权相关的法律法规 &#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f9…

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-07-软件架构维护

文章目录 1. 软件架构知识管理1.1 概念1.2 架构知识的获取1.3 作用1.4 架构知识管理的现状 2 软件架构修改管理3 软件架构版本管理4. 示例4.1 背景4.2 数据获取4.3 数据计算4.4 结果分析4.4.1 圈复杂度 (CCN)4.4.2 扇入扇出度 (FFC)4.4.3 模块间耦合度 (CBO)4.4.4 模块的响应 (…

mysql group by 细节介绍

mysql中group by的用法是配合聚合函数&#xff0c;利用分组信息进行统计&#xff0c;语句如“select name,sum(id) from test group by name,number”。 先来看下表1&#xff0c;表名为test&#xff1a; 执行如下SQL语句&#xff1a; SELECT name FROM test GROUP BY name 你…

OFDM802.11a的FPGA实现(十四)data域的设计优化,挤掉axi协议传输中的气泡

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言 2.data域的时序要求 3.Debug 1.前言 前面12篇文章详细讲述了&#xff0c;OFDM 802.11a发射部分data域的FPGA实现和验证&#xff0c;今天对data域的设计做一个总结。在…

springboot306基于Java的民宿管理系统(源码+包运行+配套LW+技术指导)

项目描述 临近学期结束&#xff0c;开始毕业设计制作&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉的困难吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Java的民宿管理…