目录

前言

本章节技术栈

1.通过docker-compose实现快速环境搭建

1.1.编写docker-compose.yml

1.2.docker-compose安装与使用

1.2.1.docker-compose下载

1.2.2.docker-compose安装

1.2.3.docker-compose使用

2.Jenkins完成一键任务发布

2.1.Jenkins的安装

2.2.Jenkins的配置

2.2.1.maven环境配置

2.2.2.SSH免密登录配置

2.3.创建一个maven项目

2.3.1.配置git

2.3.2.项目构建镜像配置

2.4.镜像仓库的安装与使用

2.4.1安装镜像仓库

2.4.2.镜像仓库的使用

3.运行测试

4.大结局


前言

上一篇我们实现了通过DockerFile构建项目镜像并且启动,这只是万里长征的第一步。这里的内容比较多,一篇全部写完担心很多小伙伴没有耐心去看完,所以这里分了两个章节。

文末有工程git地址,也有微信二维码,欢迎点赞收藏

本章节技术栈

docker-compose、jenkins、ssh免密登录、docker本地镜像仓库的使用

1.通过docker-compose实现快速环境搭建

目的:因为我们要上线一个项目不可能只有一个jar包,最起码的还需要一些基础环境,例如jdk、mysql,有的还需要用到缓存redis、消息中间件等等。如果不通过docker-compose进行环境搭建的话,常规方法需要一个个下载安装包,上传至服务器,安装。但是通过docker-compose可以实现一个命令全部帮你搞定,对于部署或者迁移环境十分方便。

1.1.编写docker-compose.yml

我们可以在项目中新建一个docker-compose.yml文件,便于格式化。

目录文件如下:

文件内容如下: 解释已经非常全面了

version: "3.0"
services:mysql:# mysql版本image: mysql:5.7# 自动重启restart: always# 容器名,因为不需要每次启动都重新指定容器container_name: mysql7ports:- 3306:3306command:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1--default-time-zone=+8:00environment:# root账号密码MYSQL_ROOT_PASSWORD: "root"MYSQL_ALLOW_EMPTY_PASSWORD: "NO"# 创建的数据库MYSQL_DATABASE: "dockertest"volumes: # 数据卷挂载- "./mysql/db:/var/lib/mysql"networks: # 局域网- dockertestredis:restart: alwaysimage: redis:5.0.12container_name: redis5command: redis-server /usr/local/etc/redis/redis.confports:- "6379:6379"volumes:  # 数据卷挂载- ./redis/data:/data- ./redis/redis.conf:/usr/local/etc/redis/redis.confnetworks:- dockertestdockertest:restart: alwaysbuild: ./ports:- 8080:8080depends_on: #依赖mysql和redis- mysql- redisnetworks: # 局域网- dockertest
# 局域网设置
networks:dockertest:

主要讲一下局域网设置,因为每一个容器都相当于一台虚拟机,所以他们之间是独立的。通过设置这个局域网,能够让他们处于同一网段,这样的话我们在application配置链接数据的地方的ip就可以直接填容器名即可。如下:

spring:application:name: dockertestdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://mysql7:3306/dockertest?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8serialization:write-dates-as-timestamps: falseliquibase:change-log: classpath:db/changelog/master.xml

到这里配置就完成啦,

1.2.docker-compose安装与使用

1.2.1.docker-compose下载

这是官网的下载方法:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

但是你下载的时候你会发现速度比闪电的速度还要慢

所以我这里为大家直接准备了安装包

链接:https://pan.baidu.com/s/18fzQkB1f1LpuzspbOf9o8Q 
提取码:felp

要是我看到这么贴心的博主,反手就是一个赞。

1.2.2.docker-compose安装

  • 将下载的docker-compose拷贝到 /usr/local/bin目录下
  • 为该文件添加可执行权限
  • 查看版本号,是否成功
[root@adobe2 docker]# cd /usr/local/bin/
[root@adobe2 bin]# rz -y
[root@adobe2 bin]# ls
docker-compose
[root@adobe2 bin]# sudo chmod +x /usr/local/bin/docker-compose
[root@adobe2 bin]# docker-compose -v
docker-compose version 1.27.2, build 18f557f9

安装完成

1.2.3.docker-compose使用

首先我们创建一个docker文件夹,然后通过rz -y命令将一下几个文件都拷贝进来

  • docker-compose.yml
  • DockerFile
  • 工程jar包

如下

此时执行docker-compose up -d (注:-d的意思是后台执行,我们可以先不加,看看执行日志)

docker-compose up走起:日志比较多,我就简单的截取一点,如果出现这些说明启动成功,否则有问题。可以查看是否之前有镜像或者容器冲突了,或者可以扫描下面二维码,微信私聊。

[root@adobe2 docker]# docker-compose up
Pulling mysql (mysql:5.7)...   先去拉取mysq镜像
5.7: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
a023ae82eef5: Pull complete
e76c35f20ee7: Pull complete
e887524d2ef9: Pull complete
ccb65627e1c3: Pull complete
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7  拉取msyql镜像完成
Pulling redis (redis:5.0.12)...
5.0.12: Pulling from library/redis  开始拉取redis镜像
69692152171a: Already exists
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
1f499504197d: Pull complete
021b18181099: Pull complete
1fb4123902bc: Pull complete
Digest: sha256:c2b0f6fe0588f011c7ed7571dd5a13de58cff538e08d100f0a197a71ea35423a
Status: Downloaded newer image for redis:5.0.12  redis镜像拉取完成
Building dockertest  开始构建工程镜像
Step 1/7 : FROM java:8---> d23bdf5b1b1b
Step 2/7 : MAINTAINER 15705116160@163.com---> Running in 21eff71cf66f
Removing intermediate container 21eff71cf66f---> 00a2cc2b062f
Step 3/7 : VOLUME /tmp---> Running in 833e6a995dd2
Removing intermediate container 833e6a995dd2---> db85d71e6242
Step 4/7 : ADD dockertest.jar mydockertest.jar---> 4d0cb030de75
Step 5/7 : RUN bash -c 'touch /mydockertest.jar'---> Running in 87b181c09bc9
Removing intermediate container 87b181c09bc9---> 1bd22d99dea6
Step 6/7 : ENTRYPOINT ["java","-Djava.-Djava.security.egd=file:/dev/./urandom","-jar","/mydockertest.jar"]---> Running in 8394adea736c
Removing intermediate container 8394adea736c---> 7d4f56981960
Step 7/7 : EXPOSE 8080---> Running in 661f6ffbe7ce
Removing intermediate container 661f6ffbe7ce---> 4bfbf1fb68a4Successfully built 4bfbf1fb68a4
Successfully tagged docker_dockertest:latest
WARNING: Image for service dockertest was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mysql7 ... done    创建msyql容器
Creating redis5 ... done    创建redis容器
Creating docker_dockertest_1 ... done  创建荣成容器
Attaching to redis5, mysql7, docker_dockertest_1  在下面就是启动日志

这时候说明已经启动成功了,因为不是后台启动的,所以我们可以重新打开一个窗口,通过docker ps查看是否已经启动成功

[root@adobe2 docker]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
aec612ad427f   docker_dockertest     "java -Djava.-Djava.…"   7 minutes ago   Up 6 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                                  docker_dockertest_1
e5c987fe7933   mysql:5.7             "docker-entrypoint.s…"   7 minutes ago   Up 7 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                       mysql7
7bb6de3aaef6   redis:5.0.12          "docker-entrypoint.s…"   7 minutes ago   Up 7 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                  redis5
[root@adobe2 docker]#

我们可以看到已经启动成功。

为了验证一下局域网,我们可以看一下对应的数据库是否已经创建,并且第一章节里面Liquibase创建的表是否已经创建。

到这里Docker-compose就算结束了,有没有发现方便快捷很多。

例如我现在要迁移一套pre环境出来,我是不是可以快速的搞定,软件安装可以直接通过docker-compose安装,连数据库初始化脚本都不需要你手动去执行。

2.Jenkins完成一键任务发布

目的:我们如果想要发布某个工程,以前的逻辑是打包、停服务、备份上一个版本的jar包、远程拷贝新的jar包、启动服务。这样处理起来十分麻烦,服务停止的时间也过长。那么通过Jenjins可以实现可以实现一键发布,对,就是一键做完上面的所有事情。

2.1.Jenkins的安装

这里我也踩了不少坑,之前在官网上找到一些镜像,安装完成过后很多插件下载不了,最后找到一个非常棒的镜像。

#拉取Jenkins官方提供的集成blueocean插件的镜像
docker pull jenkinsci/blueocean#运行容器
docker run -d --name jenkins -u root -p 8888:8080 -p 50000:50000 --privileged=true  -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean参数说明:
-d:守护进程的方式启动容器,不打印正在运行的此容器的Docker日志。(或 -it:交互的方式启动容器,打印容器的启动日志信息,相当执行了一遍 docker logs -f jenkins )。
-p:将容器的8080端口映射到宿主机的8888端口。
-v:挂载目录(宿主机目录:容器目录);挂载后,修改宿主机的挂载目录将直接影响到容器的目录。
--name:容器的名称。
--privileged:使用该参数,container内的root拥有真正的root权限。
jenkinsci/blueocean:指定镜像名。

一步一步带你执行:拉取镜像(docker pull jenkinsci/blueocean)

[root@adobe1 ~]# docker pull jenkinsci/blueocean
Using default tag: latest
latest: Pulling from jenkinsci/blueocean
540db60ca938: Pull complete
2a961b9363b0: Pull complete
d6a479880c83: Pull complete
8eaeff69d97a: Pull complete
351ca2eaf86b: Pull complete
f6c722701e33: Pull complete
2e4f785df836: Pull complete
d3df0c4abbde: Pull complete
bc5608b67244: Pull complete
3f8e7265de76: Pull complete
b43472033709: Pull complete
8c8d6280a0e7: Pull complete
a1ce0802fc1d: Pull complete
8fe1c5ba0c97: Pull complete
b79e1d38088e: Pull complete
ab0203034c1e: Pull complete
Digest: sha256:ca7bf6f518a5397a9b5635edcd84cf3aa9db37a9dde4db508d664be8c073ed12
Status: Downloaded newer image for jenkinsci/blueocean:latest
docker.io/jenkinsci/blueocean:latest

创建文件夹,用于数据挂载,启动容器

[root@adobe1 docker]# mkdir jenkins_home
[root@adobe1 docker]# ls
jenkins_home
[root@adobe1 docker]# docker run -d --name jenkins -u root -p 8888:8080 -p 50000:50000 --privileged=true  -v /root/docker/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
fd6eb90fa50abbb19f724ecf2e161928c76b27a5108d87fcbf0071e231238c3b
[root@adobe1 docker]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
fd6eb90fa50a   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   2 minutes ago   Up 2 minutes   0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   jenkins
[root@adobe1 docker]#

启动成功过后打开访问页面 ip:8888,

到目录中找到管理员密码,复制进去

[root@adobe1 docker]# cat jenkins_home/secrets/initialAdminPassword
4f08c861ea3c495c92da9f96d6757e2c
[root@adobe1 docker]#

直接安装推荐插件,后面有需要的我们再装

安装插件等待页面,如果有些插件安装失败,重试几次基本上就OK了。如果有个把是在安装不了就先过,里面也不一定用得到。

创建用户

2.2.Jenkins的配置

2.2.1.maven环境配置

首先到jenkins容器中安装maven

# 找到容器ID
>docker ps
# 进入容器
>docker exec -it dec76b38dd0e bash
# 到/usr/local 目录下
>cd usr/local/
# 下载maven
>wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
# tar开压缩包
>tar -xzvf apache-maven-3.3.9-bin.tar.gz
# 删除压缩包
>rm apache-maven-3.3.9-bin.tar.gz
# 查看文件夹中的文件
>ls
apache-maven-3.3.9  bin  lib  share
# 创建maven仓库文件夹
>mkdir MavenSpace
# 配置环境变量
>vi /etc/profile
# 添加到文件的最下方
#set Maven environment
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=$MAVEN_HOME/bin:$PATH# 使环境变量立即生效
>source /etc/profile
# 查看版本号,以及是否配置成功
>mvn -v# 修改setting文件
>vi apache-maven-3.3.9/conf/settings.xml
# maven仓库地址
<localRepository>/usr/local/MavenSpace</localRepository>
# 镜像地址
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

安装完后到jenkins页面进行配置,需要先安装maven插件

输入maven,选择Maven Integration 直接安装

安装完成后,回到系统管理界面,选择全局工具配置,进行maven配置,这里jdk直接选择自动安装,需要输入Oracle账号密码(自行搞定吧),下面还有一个git配置,直接选择自动安装,搞定。

2.2.2.SSH免密登录配置

回到插件管理中,下载安装插件

安装完成后前往系统配置

滑倒最下面,可以看到ssh配置的地方

回到虚拟机,配置ssh免密登录

# 回到根目录
>cd ~
# 如果配置过的话可以先删除
>rm -rf ./.ssh/
# 生成公钥私钥
>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:z1Be2+ogkQuKgXPFbMc+Q3NyuALLYq5nDyp0It4gEws root@adobe1
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|   o . .         |
|  . = B o . .    |
|Eo = + * + . o   |
|=+= . * S . . .  |
|BB + o + *   .   |
|=oB .   o + .    |
|oooo     . o     |
|+o ..       .    |
+----[SHA256]-----+
# 进入到.ssh文件夹中
>cd .ssh/
# 查看当前文件夹内容
>ls
id_rsa  id_rsa.pub
# 将id_rsa.pub内容复制到文件authorized_keys中,文件名固定
>cat id_rsa.pub > authorized_keys
# 赋操作权限(重要)
>chmod 600 authorized_keys
>chmod 700 /root/.ssh/

配置完成后,将id_rsa中的内容拷贝贴到jenkins配置中,配置如下,点击按钮Test Configuation测试成功。后面就可以直接些shell操作宿主机了,棒不棒。

2.3.创建一个maven项目

回到首页,点击新建任务,创建一个maven任务

2.3.1.配置git

填写git上工程的地址,以及你的git账号密码

这里需要在下载一个插件,为了再构建选择分支更方便

下面配置分支

配置完分支后可以再项目管理页面点击Build with Parameters可以查看已经有一个master分支了

2.3.2.项目构建镜像配置

首先我们需要配置一下打包命令,注意一下自己的pom文件所在的位置

#  -Dmaven.test.skip=true是为了跳过测试,因为我们在链接数据的时候使用的是局域网,mysql7
clean package spring-boot:repackage -Dmaven.test.skip=true

下面我们需要将代码打包、构建镜像、将镜像备份至本地镜像仓库

我们先编写打包镜像命令,我们是先构建不带项目版本号的镜像,然后为该镜像复制一个带有版本号的副本为了上传至镜像仓库(后面会提到镜像仓库安装与使用)。这么做的目的是镜像仓库里面的版本可用于出现异常情况进行回滚,不带版本号的镜像我们就正常创建容器,启动。写的还是挺详细的。


# 获取版本号
VERSION=${POM_VERSION}
# 服务名称
APPLICATION=dockertest
# 版本包类型,jar或者war
PTYPE=jar
# 拼接镜像地址
REPOSITORY=192.168.44.132:5000/$APPLICATION:$VERSION
# 编写dockerfile
cat > Dockerfile << EOF
FROM java:8
# 作者
MAINTAINER 15705116160@163.com
# copy files to working folder
COPY docker/target/$APPLICATION-$VERSION.$PTYPE .
# set working folder
WORKDIR .
RUN chmod +x $APPLICATION-$VERSION.$PTYPE
ENTRYPOINT ["java","-jar","./$APPLICATION-$VERSION.$PTYPE"]
EOF# 创建镜像
docker build -t $APPLICATION .
echo "=========build image success ============="# 重命名镜像
docker tag $APPLICATION $REPOSITORY
echo "=========rename image success ============="# 上传镜像
docker push $REPOSITORY
echo "=========push image success ============="# 如果有同名镜像,先删除
IMAGEID=`docker images | grep "/$REPOSITORY " | grep "$VERSION" | awk '{ print $3 }'`
if [ $IMAGEID>0 ]
thendocker rmi $IMAGEID
fi
echo "=========del image success ============="

下一步是在构建前执行,我们需要先将容器停掉,再将该容器删除,最后删掉对应的镜像

#!/bin/bash
result=$(docker ps| grep "dockertest")
if [[ "$result" != "" ]]
then
echo "================docker stop dec-netty================"
docker stop dockertest
fi
result1=$(docker ps -a | grep "dockertest")
if [[ "$result1" != "" ]]
then
echo "================docker rm dec-netty================"
docker rm dockertest
firesult2=$(docker images | grep "dockertest")
if [[ "$result2" != "" ]]
then
echo "================docker rmi dec-netty:0.0.1================"
docker rmi dockertest:latest
fi

下面这步是在构建后执行,构成成功后,我们需要将镜像启动

# 运行容器
# --network images_dockertest 这是局域网,我们可以通过docker network ls 进行查看
docker run -d -p 8081:8080 --name dockertest --network images_dockertest --restart=always dockertest:latest

暂时我们先不启动,因为我们还没有创建本地镜像仓库,我们先创建镜像仓库,最后运行看效果

2.4.镜像仓库的安装与使用

2.4.1安装镜像仓库

# 拉取镜像
>docker pull registry
# 启动镜像仓库
>docker run -d -p 5000:5000 --restart always --name registry --privileged -v ./images:/var/lib/registry registry:latest# 修改daemon.json 文件,将本机的ip地址配置进去
>nano daemon.json
{"registry-mirrors": ["https://ok6qwbjg.mirror.aliyuncs.com"],"insecure-registries": ["192.168.44.132:5000"]
}#重启docker,镜像仓库安装完成
>service docker restart

2.4.2.镜像仓库的使用

将镜像打标记,并上传至镜像仓库
    docker tag 51e0db6d58d2 192.168.44.132:5000/dockerTag:0.0.1
    docker push 192.168.44.132:5000/dockerTag:0.0.1
    查看镜像仓库
    curl -XGET http://192.168.44.132:5000/v2/_catalog
    查看某个镜像的版本
    curl -XGET http://192.168.44.132:5000/v2/dockertest/tags/list
    拉取镜像
    docker pull 192.168.44.132:5000/dockertest:0.0.1

3.运行测试

全部配置完成,回到工程页面进行构建

构建完成后我们可以查看,按照预想应该是有一个不到版本号的镜像,项目的容器已经启动,并且镜像仓库中有带版本号的镜像

访问页面

4.大结局

这篇全是图片,感觉写的有点乱,但是步骤应该是没有落下的。基本上的坑我都替大家踩完 了,大家如果看完有问题的话,欢迎留言或者添加我的微信一起讨论。

最后附上工程git地址,大家可以下载下来参考参考。

git地址:https://gitee.com/adobepzf/docker-test.git

微信:

Docker实现SpringBoot项目的快速构建(二)相关推荐

  1. Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo

    Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo 最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4. ...

  2. 使用Docker部署SpringBoot项目(避坑+超级详细版本)

    使用Docker部署SpringBoot项目(避坑+超级详细版本) 首先呢,非常感谢我们一起相遇在这个地方,想必此刻的你也是在一个学习求知的过程,我们一样,我们都是在求知的路上匍匐前进!看到这篇文章, ...

  3. Docker 部署SpringBoot项目不香吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...

  4. 《SpringBoot揭秘:快速构建微服务体系》—第1章1.2节微服务因何而生

    本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第1章,第1.2节微服务因何而生,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公 ...

  5. 如何使用Docker发布SpringBoot项目

    1.目标 Dockerfile文件用来构建Docker镜像,它由一系列命令和参数构成,接下来演示一下如何使用Docker发布SpringBoot项目. 2.准备 a.SpringBoot项目 该项目名 ...

  6. 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*

    本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第2章,第2.4节本章小结*,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

  7. 又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式

    又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式 部署思路: 具体步骤: 1.打成jar 2.上传到服务器 3.启动JDK容器 4.进入JDK 容器 启动 项 ...

  8. 《SpringBoot揭秘:快速构建微服务体系》—第3章3.5节本章小结

    本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第3章,第3.5节本章小结,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...

  9. 使用IDEA集成docker部署springboot项目及bug解决并连同redis、MySQL

    流程介绍 安装docker(windows) 配置docker源加速 docker安装redis IDEA集成docker # IDEA连接docker 配置springboot项目 打包成docke ...

最新文章

  1. Android Studio安装配置、环境搭建详细步骤及基本使用
  2. centos nginx不是命令_Nginx 在CentOS 6/7 上的安装与使用
  3. 后台开发经典书籍--Linux多线程服务端编程:使用muduo C++网络库
  4. 2021中国互联网大会正式发布阿里云《云采用框架白皮书》
  5. mysql 二进制转字符串_MySql字符转义 | 学步园
  6. 命中率_数据说话!詹姆斯的“皇家射手团”命中率为近十年最低
  7. 虚拟机和linux的安装
  8. PHP验证码常用的函数记录
  9. 分享清华大学鲁志教授实验室生物信息学教程
  10. Spring-context-ApplicationContextInitializer接口TODO
  11. 自定义git忽略规则
  12. iPhone企业应用实例分析之三:程序框架分析
  13. sed替换html标签,sed多次替换
  14. zip分卷压缩的步骤_rar分卷压缩的步骤详解【图文步骤】
  15. IEEE的论文哪里可以下载?
  16. 微信小程序实战之 goods(订餐页)
  17. 树莓派4支持多大tf卡_树莓派入门指南(Raspberry Pi)
  18. 关于这个开源项目 from VIP Lab
  19. bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队
  20. 文件管理-----操作系统

热门文章

  1. FireFox插件 - Greasemonkey
  2. Win10 21H2 19044+vs2019 WDK驱动开发,错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息
  3. ubuntu 18.04网络图标消失不见解决方法
  4. 第一批90后30岁了,该有多少存款?
  5. Android适配器作用
  6. java fushubaioshi_java – AI如何为战列舰建立遗传规划模型
  7. PHP artisan命令
  8. c语言中组件出现错误,错误消息:无法载入文件或组件 或其相依性的其中之一。 找到的组件资讯清单定义与组件参考不符。 (发生例外状况于 HRESULT: 0x80131040)...
  9. mysql 学习记录 全文本搜索
  10. SQL实现一对多、多对多建表与查询