docker学习快速入门

news/2024/4/16 3:03:38

目录

        • Linux下安装docker
        • 配置阿里云镜像加速
        • docker命令
        • 部署安装Tomcat、ES
        • 容器数据卷
        • DockerFile
        • docker网络
        • 制作tomcat镜像
        • Redis集群部署
        • SpringBoot微服务打包docker镜像
        • 拓展

什么是Docker

Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务器的性能可以被压榨到极致。Docker是基于Go语言开发的,开源项目。

镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,镜像=>run=>容器,通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除。

仓库(repository):
仓库就是存放镜像的地方。

官网:https://www.docker.com/
文档地址:https://docs.docker.com/
Doker镜像仓库地址:https://hub.docker.com/

Linux下安装docker

1、需要的安装包

yum install -y yum-utils

2、设置镜像的仓库

yum config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、更新yum软件包索引。

yum makecache

4、安装

yum install docker-ce docker-ce-cli containerd.io

5、启动docker

systemctl start docker`

6、使用docker version查看是否安装成功

docker run hello-world

配置阿里云镜像加速

登录阿里云,找到容器服务。找到镜像加速地址,配置使用。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json   <<-'EOF'
{
"registry-mirrors": ["https://xxx.xxx.xxx.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker命令

docker --help 帮助

docker version 版本

docker info 详细信息

docker stats实时查看容器运行情况

docker history IMAGEID查看镜像构建记录

镜像命令

docker images [-a所有镜像,-q只要镜像ID]查看本机镜像

docker tag 镜像id 新镜像名:tag标签 克隆命名新的镜像

docker search xxx 搜素镜像

docker search mysql --filter=STARS=3000

[root@CentOS7 docker]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source… 14616 [OK]
mariadb MariaDB Server is a high performing… 5573 [OK]

docker pull xx 下载镜像,默认最新版(分层下载,节省开销,加快速度)

指定版本下载:docker pull mysql:5.7

docker rmi [-f] 镜像名/镜像ID 删除镜像

删除所有镜像 文件: docker rmi -f $(docker images -aq)

生成镜像

docker commit 容器id xx镜像名,根据容器的changes生成一个镜像,-a,作者名;-m,信息。

docker build [options] 生成路径path,根据dockerfile生成镜像。

docker build [选项] 镜像名[:标签]或者上下文路径或者URL 所执行目录(.表示在当前目录执行)

例:docker build -f mydockerfile -t mytomcat .

上传提交镜像

docker push [OPTIONS] NAME[:TAG],上传一个镜像到远程仓库。

Options:
-a, --all-tags,将所有版本的镜像提交。
–disable-content-trust 忽略镜像提示。
-q, --quiet ,简洁生成。

上传到dockerhub

1)在hub.docker.com创建账号

2)登录账户:docker login -u xxx -p

3)上传镜像

docker push 镜像:tag

上传到阿里云

1)登录到阿里云,找到容器镜像服务

2)创建命名空间

3)创建容器镜像仓库

4)查看仓库基本信息,获取ip地址,按照操作指南执行

5)比如登录:

sudo docker login --usename xxx registry.cn-beijing.aliyuncs.com

容器命令

有了镜像才能创建容器。

运行容器

docker run [options] 镜像 ,创建容器运行镜像

--name, 命名容器,Repository:Tag

--rm,退出时删除容器

-d ,以后台方式运行,若容器不向客户端提供服务则停止运行

-it ,交互方式运行,启动进入容器查看内容

exit或ctrl+d退出停止运行;ctrl + p + q退出不停止

-p ,指定容器端口,主机端口:容器端口

例1:交互式运行centos

docker run -it centos /bin/bash #会进入容器的交互终端

docker run -itd centos /bin/bash #以后台交互方式运行容器,不会进入容器

后面的/bin/bash的作用是表示运行bash ,docker中必须要保持一个进程的运行,这个/bin/bash就表示启动容器后启动bash。

例2:以脚本方式运行centos镜像,每隔1秒启动容器。

docker run -d centos /bin/bash -c "while true;do echo xxx;sleep 1 ; done"

例3:以后台方式创建容器运行nginx镜像,并向外开放3344端口

docker run -d --name nginx01 -p 3344:80 nginx

查看容器

docker ps [options],查看正在运行的容器

-a查看运行记录,-n=?显示最近运行的容器,-q显示ID

docker container ls

删除容器

docker rm 容器id,删除容器;-f,强制删除

例:删除所有容器

docker rm -f $(docker ps -aq)

启动和停止容器

docker start 容器id

docker restart 容器id

docker stop 容器id

docker kill id,强制停止运行

(生成)镜像

docker container commit 容器id xx镜像名-a,作者名,-m,信息。

docker build [options] 生成路径path,根据dockerfile生成镜像。

docker build [选项] 镜像名[:标签]或者上下文路径或者URL 所执行目录(.表示在当前目录执行)

-f指定dockerfile文件,-t命名镜像

例1:提交容器3fdf3rfe4生成镜像tomcat01

docker commit -a="xxx" -m="xxx" 3fdf3rfe4 tomcat01:1.0

例2:根据dockerfile生成镜像保存到当前目录

docker build -f /home/dockerfile -t myimage:1.0 .

其他命令:

docker logs [options] 容器id,查看日志

Options:
–details,显示详细信息
-f, --follow ,实时输出日志
–since ,显示在某个时间后的日志
-n, --tail ,展示最后n行日志
-t, --timestamps ,显示时间
–until ,显示一个时间前的日志

docker top 容器id,查看正在运行的容器中的进程

docker inspect 容器id,查看容器的元数据(返回的JSON格式)

docker exec -it 容器id /bin/bash,以新终端进入正在运行的容器

docker attach 容器id,进入容器正在运行的终端

docker cp 容器id:文件绝对路径 主机目的路径,从容器中拷贝文件到主机

docker pause 容器id 悬挂中断

docker unpause 容器id

部署安装Tomcat、ES

tomcat

1、下载镜像

docker pull tomcat:9.0

2、启动镜像

docker run -d --name tomcat01 -p 3355:8080 tomcat:9.0

3、进入tomcat容器中,配置/usr/local/tomcat/webapps目录

docker exec -it tomcat01 /bin/bash

cp -r webapps.dist webapps

4、访问测试

docker ps

curl localhost:3355

ES

docker run -d --name es01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.0

容器数据卷

让容器内的文件数据与linux主机或容器之间同步互通,形成共享,修改容器配置文件时可直接在主机服务器上修改,不需要进入容器,实现容器数据持久化。

方式一、-v卷挂载命令

例:docker run -it -v 主机路径:容器内路径 centos /bin/bash

在主机上通过docker inspect 容器,查看mount挂载情况。

例:安装mysql同步数据

docker pull mysql:5.7

docker run -d -p 3304:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql_01 mysql:5.7

参数说明:-d后台运行,-p端口映射,-v卷映射,-e环境配置。

容器启动成功后在本地连接3304端口连接数据库。

匿名挂载:-v 容器内路径

docker run -d -p --name nginx01 -v /etc/nginx nginx

具名挂载:-v 卷名:容器内路径

docker run -d -p --name nginx01 -v nginx_01:/etc/nginx nginx

默认卷挂载到本地的/var/lib/docker/volumes/

指定路径挂载:-v 本地路径:容器路径

docker run -d -p --name nginx01 -v /home/nginx01/:/etc/nginx nginx

卷管理

docker volume [options],管理数据卷,参数说明:

create ,创建一个卷;
inspect,查看卷详细信息;
ls,列出所有卷;
prune,删除未使用的本地卷;
rm,删除卷

方式二、dockerfile

1、创建一个dockerfile文件

vim dockerfile

2、编写dockerfile

FROM centos
VOLUME ["volume01"]
CMD echo "----end----"
CMD /bin/bash
#解释
FROM 镜像名:标签 #FROM指定基础镜像,其必须为Dcokerfile中第一条指令
RUN 命令   #在该镜像中执行命令,如果执行多个命令用 &&连接起来

3、docker build 生成镜像文件

docker build -f /home/dockerfile -t 镜像名(repo):版本标签(tag) .

方式三、容器之间–volumes-from

创建一个容器docker02与其他容器共享数据。

docker run -it --name docker02 --volumes-from docker01 nginx

删除容器docker01数据依旧存在,因为它的数据在本地/var/lib/docker/volume下。

DockerFile

dockerfile用来构建镜像文件,命令脚本。

dockerfile指令

FROM #基础镜像
MAINTAINER #维护者,姓名+邮箱
RUN #镜像构建时需要运行的命令
ADD #添加文件,若是压缩包则自动解压
WORKDIR #镜像工作目录
VOLUME #挂载目录
EXPOSE #保留端口配置
CMD #指容器启动需要运行的命令,只有最后一个生效,追加命令会覆盖
ENTRYPOINT #指定容器运行时需要的命令,可以docker run时追加命令
ONBUILD #当构建一个被继承的dockerfile时触发onbuild指令
COPY #将主机文件拷贝到制作的镜像中
ENV #构建时设置环境变量

例:编写一个mycentos镜像文件,生成镜像

vim mydockerfile-centos

FROM centos
MAINTAINER z<zzh@163.com>
ENV MYWORKPATH /usr/local
WORKDIR $MYWORKPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYWORKPATH
CMD echo "---end---"
CMD /bin/bash

docker build -f mydockerfile-centos -t mycentos:1.0 .

CMD与ENTRYPOINT比较

相同点:

1、只能写一条,如果写了多条,那么只有最后一条生效

2、容器启动时才运行,运行时机相同

不同点:

ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖,如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效。

docker网络

docker网络是一种虚拟网络,网络为成对的bridge桥接模式。主机可与创建的容器进行通信,但是容器之间通信需要额外的操作。docker默认给容器分配一个虚拟内部ip地址,网络为docker0。

例:docker exec -it tomcat01 ping tomcat01

无法ping通,因为容器在docker0网络,无法通过容器名ping通。

ping不同的另一种原因:

OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown

以上报错是因为docker创建的容器相当于一个miniLinux,很多命令和软件没有安装,包括network这一网络工具都没有。下载软件包只能通过apt-get或wget和curl命令。

docker network网络管理

docker network [options],options如下:

connect,连接容器到网络

create,创建网络

inspect ,查看网络

ls ,列出所有网络

rm ,删除网络

–link实现单向通信

运行tomcat02容器,使其能够与tomcat01通信。原理是在容器的/etc/hosts文件中配置了主机名与ip地址映射。

docker run -d --name tomcat02 --link tomcar01 tomcat

自定义网络

自定义网络支持通过容器名通信,创建一个自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 Mynet

–net指定网络

使用自定义网络创建容器,在该网络中为容器分配ip:

docker run -d --name tomcat02 --net Mynet tomcat

在该网络中的容器可以相互通信,可ping tomcat02。

容器-网络连接

如何让一个容器连接到另一个网络或者与另一个网络中的容器通信,可使用docker network connect,原理是将容器添加到该网络中。

docker network connect [OPTIONS] NETWORK CONTAINER

Options:
–alias 为网络添加作用范围scope
–driver-opt 选择网络模式driver
–ip 指定一个容器ip地址
–link list 添加到另一个容器的连接
–link-local-ip 为容器添加一个本地ip地址

docker network connect Mynet tomcat02,将tomcat02挂到Mynet网络。

可使用docker network inspect 查看网络中有哪些容器。

实战

如何使用docker制作tomcat镜像并上传至阿里云,部署redis和springboot项目。

制作tomcat镜像

通过dockerfile制作一个tomcat镜像并发布到阿里云镜像仓库。

1、在用户工作的主目录中创建一个build/tomcat文件夹

2、准备tomcat和jdk安装包上传到该文件夹下

3、在文件夹下创建一个README.txt文件并编写Dockerfile文件

touch README.txt

vim Dockerfile

FROM centos#本地基础镜像docker images查看是否有该镜像否则将失败
MAINTAINER zzh<xxxx@qq.com>
COPY README.txt /usr/local/
ADD /root/build/tomcat/apache-tomcat-8.5.94.tar.gz /usr/local/
ADD /root/build/tomcat/jdk-8u151-linux-x64.tar.gz /usr/local/RUN yum -y install vim
RUN yum -y install net-toolsENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools/jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.94
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.94
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-8.5.94/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.94/logs/catalina.out

4、构建diytomcat镜像

docker build -t diytomcat .

5、创建容器运行

docker run -d -p 3355:8080 --name mytomcat01 -v /root/build/tomcat/test:/usr/local/apache-tomcat-8.5.94/webapps/test -v /root/build/tomcat/logs:/usr/local/apache-tomcat-8.5.94/logs diytomcat

6、测试运行

在linux主机测试:curl localhost:3355或直接访问。

7、上传至阿里云镜像仓库

docker login --username=xxx registry.cn-shanghai.aliyuncs.com

#重命名镜像

docker tag 镜像 registry.cn-shanghai.aliyuncs.com/命名空间/仓库名:tag

docker push registry.cn-shanghai.aliyuncs.com/命名空间/仓库名:tag

Redis集群部署

1、创建网络

docker network create redis --subnet 172.17.0.0/16

2、通过脚本创建redis配置

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file node.conf
cluster-node-timeout 5000
cluster-announce-ip 172.17.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
donedocker run -p 637${port}:6379 -p 16371:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.17.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

3、查看redis容器,进入容器

docker ps

docker exec -it redis-1 /bin/sh

3、创建redis集群

redis-cli --cluster create 172.17.0.11:6379 172.17.0.12:6379 172.17.0.13:6379 172.17.0.14:6379 172.17.0.15:6379 172.17.0.16:6379 --cluster-relicas 1

4、查看集群

redis-cli -c

cluster info

cluster nodes

SpringBoot微服务打包docker镜像

1、将springboot项目打包为xxx.jar

2、编写Dockerfile文件

FROM java:8
MAINTAINER z<xx@qq.com>COPY *.jar  /app.jar
EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]

3、构建镜像

docker build -t myApp .

4、发布镜像,下载镜像运行

docker push myApp

docker pull myApp

docker run -d -p 8080:8080 --name X-WEB-APP myApp

5、测试

curl localhost:8080

拓展

compose、swarm、Jenkins


http://www.ppmy.cn/news/1364204.html

相关文章

【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)

背景需求 上学期的周安排里&#xff0c;每班每周的自主游戏会轮到多个不同的内容 因此在每周的自主游戏观察有2次记录&#xff0c;观察的项目可以写不一样的&#xff0c; 如一位老师写沙水游戏&#xff0c;另一位写表演游戏 本学期&#xff0c;中班的自主游戏全部是户外的&am…

java面试:分布式事务理论基础(CAP原理、BASE理论、本地事务)

文章目录 引言I 基础知识1.1 事务(Transaction)1.2 本地事务1.3 分布式事务II 分布式理论2.1 CAP原理2.2 BASE理论2.3 刚柔事务2.4 解决分布事务模型2.5 2PC2.6 3PC2.7 TCC(Try-Confirm-Cancel)补偿事务引言 分布式事务:实现跨服务事务回滚,需要用到分布式事务。

RabbitMQ 网络分区处置策略配置

概述 集群成员之间的网络连接故障会影响客户端操作的数据一致性和可用性&#xff08;如CAP定理&#xff09;。 由于不同的应用程序对一致性有不同的要求 并且可以容忍不同程度的不可用&#xff0c;可以使用不同的分区处理策略。 检测网络分区 节点确定其对等节点是否关闭&am…

计网Lesson15 - TCP可靠传输

文章目录 1. 停止等待ARQ协议2. 连续ARQ协议与滑动窗口协议 1. 停止等待ARQ协议 ARQ&#xff08;Automatic Repeat–reQuest&#xff09;自动重传请求 几种重传情况 发送端丢失 发送方过久没有接收到接收方的确认报&#xff0c;这种情况会触发超时重传机制&#xff0c;发送方…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…

【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析

Elasticsearch&#xff0c;作为当今最流行的开源搜索和分析引擎&#xff0c;以其分布式、可扩展和高可用的特性赢得了广大开发者的青睐。在Elasticsearch的分布式架构中&#xff0c;集群的稳健性和高可用性很大程度上依赖于其Master节点的选举机制。本文将深入剖析Elasticsearc…

(202402)多智能体MetaGPT入门1:MetaGPT环境配置

文章目录 前言拉取MetaGPT仓库1 仅仅安装最新版2 拉取源码本地安装MetaGPT安装成果全流程展示 尝试简单使用1 本地部署大模型尝试&#xff08;失败-->成功&#xff09;2 讯飞星火API调用 前言 感谢datawhale组织开源的多智能体学习内容&#xff0c;飞书文档地址在https://d…

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …

openssl3.2 - exp - buf to bio

文章目录 openssl3.2 - exp - buf to bio概述笔记bio_get_length调用端代码函数实现bio_to_buffer END openssl3.2 - exp - buf to bio 概述 不想让程序调用openssl API时, 有文件落地的动作. 如果程序有配置文件要用, 也是自己读文件到buffer, 然后转成BIO给openssl的相关有…

【Python编程+数据清洗+Pandas库+数据分析】

数据分析的第一步往往是数据清洗&#xff0c;这个过程关键在于理解、整理和清洗原始数据&#xff0c;为进一步分析做好准备。Python 语言通过Pandas库提供了一系列高效的数据清洗工具。接下来&#xff0c;该文章将通过一个简单的案例演示如何利用 Pandas 进行数据清洗&#xff…

MySQL之大表删除(基于硬链接方式)

在DROP TABLE的时候&#xff0c;所有进程不管是DDL还是DML都被HANG起&#xff1b;直到DROP结束才继续执行&#xff1b;这是因为INNODB会维护一个全局独占锁&#xff08;在table cache上面&#xff09;&#xff0c;直到DROP TABLE完成才释放。在我们常用的ext3,ext4&#xff0c;…

adb pull 使用

adb pull 是 Android Debug Bridge (ADB) 工具提供的一个命令&#xff0c;用于将设备上的文件拷贝到计算机上。通过 adb pull 命令&#xff0c;实现从 Android 设备上获取文件并保存到本地计算机上。 使用 adb pull 命令的基本语法如下&#xff1a; adb pull <设备路径>…

在 Ubuntu 中, 使用 fsck 命令来修复磁盘文件系统

在 Ubuntu 中&#xff0c;可以使用 fsck 命令来修复磁盘文件系统。fsck 是用于检查和修复文件系统的工具。 使用 fsck 命令修复磁盘文件系统的步骤如下&#xff1a; 首先&#xff0c;您需要在命令行终端窗口中以 root 用户身份登录。 使用 fdisk -l 命令列出所有磁盘设备。 …

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL&#xff0c;前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板&#xff0c;虽然有RT-Thread 集成好的LVGL 环境&#xff0c;只需要几个步骤就能成功把lvgl 的示例运行起来&#xff0c;对于爱折腾的我来说&#xff0c;过于简单也并…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下&#xff1a; N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

用39块钱的全志V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

用39块钱的V851se视觉开发板做了个小相机。 可以进行物品识别、自动追焦&#xff01; 这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频&#xff0c;并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能…并最终…

Github 2024-02-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目4Python项目3TypeScript项目1HTML项目1Dart项目1Rust项目1 从零开始构建你喜爱的技术 创建周…
最新文章