文章目录

  • 一、docker是什么
  • 二、为什么用docker
  • 二、不用dockers前
  • 三、用Docker后,一次镜像,处处使用,一个模子里出来的
  • 四、Docker 的基本组成
    • 1.Docker客户端和服务器
    • 2. Docker镜像
    • 3.Registry
    • 4.Docker容器
  • 五、Docker引擎
  • 六、Docker构架
  • 七、核心概念
    • 1.镜像(image)
    • 2.仓库(repository)
    • 3.容器(container)
  • 八、镜像常用命令
    • 1.docker images #查看镜像
    • 2.docker search 镜像名称 #查找镜像
    • 3.docker pull 镜像名称:标签 #下载镜像
    • 4.docker push 镜像名称:标签 #上传镜像
    • 5.docker save centos:latest -o /root/centos.tar #将镜像导出到本机
    • 6.docker load -i /root/centos.tar #将镜像导入
    • 7.docker rmi 镜像名称:标签 #删除镜像
    • 8.docker history 镜像名称:标签 #查看镜像制作历史
    • 9.docker inspect 镜像名称:标签 #查看镜像的信息
    • 10.docker tag 镜像名称:标签 新镜像名称:新标签 #复制镜像并改名称
    • 11.docker commit 容器ID 新镜像名称:新标签 #自定义镜像
  • 九、容器常用命令
    • 1.docker run -it docker.io/centos:latest /bin/bash #启动并进入容器
    • 2.docker run -itd httpd:latest #启动容器并放入后台
    • 3.docker ps #查看启动的容器
    • 4.docker ps -a #查看所有的容器,包括未启动的容器
    • 5.docker ps -aq #查看所有容器的ID
    • 6.docker rm 容器ID #删除容器,启动的容器需要停止后再删除
    • 7.docker start 容器ID #启动容器
    • 8.docker stop 容器ID #停止容器
    • 9.docker restart 容器ID #重启容器
    • 10.docker inpect 容器ID #查看容器的信息
    • 11.docker top 容器ID #查看容器的进程
    • 12.docker cp 本机路径 容器ID:容器内路径 #将本机文件复制到容器内
    • 13.docker cp 容器ID:容器内路径 本机路径 #将容器内文件复制到本机
    • 14.docker exec -it 容器ID 启动命令 #连接容器,启动新进程
    • 15.docker attch 容器ID #以上帝身份进入容器内部,注意exit退出容器时,会结束整个容器,可以用ctrl+p+q快捷键方式退出就不会结束整个容器。
  • 十、Docker 一般命令
  • 十一、Docker 镜像命令
  • 十二、Docker 容器命令

一、docker是什么

Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。 Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。

大多数Docker容器只需不到一秒钟即可启动,由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。

来自于知乎的通俗解释:
Docker的思想来自于 集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

  1. 不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

  2. 你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

  3. 在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

总之docker就是集装箱原理。

Java号称“一次编译,到处运行”,因为java虚拟机解决平台的兼容性问题,所以有java虚拟机的地方就能跑java代码;

Docker是:“一次封装,到处运行”,因为docker解决了应用环境的问题,安装了docker的平台就能跑“docker包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。

Docker 是基于Go语言实现的一个开源项目,通过对应组建的封装,分发,部署,运行等生命周期的管理,使用户的应用及其运行环境“一次镜像,处处运行”,其实是一个应用容器,类似于一个虚拟机。

通过以容器的形式将应用程序及其所有依赖项打包成一个可运行环境就是image镜像文件就可发布到 Linux 机器,通过该image镜像文件生成Docker容器实例就可运行。

便于应用程序的交付部署,省去了以往应用在一个新环境中运行的前期工作准备各种基础的工具的安装及版本不一致导致的应用运行异常。

二、为什么用docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

Docker 在如下几个方面具有较大的优势:

  1. 更快速的交付和部署
    Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。

例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

  1. 高效的部署和扩容
    Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。

  1. 更高的资源利用率
    Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

  2. 更简单的管理
    使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

二、不用dockers前


没有用docker前,开发完一个应用部署时,首先要按开发本地环境,让运维先去配置基础环境,而有时因为基础的版本号不一致,导致应用运行不了,而在开发人员本地却可运行,而后各种扯皮和检查配置和版本号重新安装。

三、用Docker后,一次镜像,处处使用,一个模子里出来的


用docker后,开发只要将开发完成的应用打成一个docker镜像,该镜像(相当于复制了开发本地环境及版本及依赖),运维只要运行该镜像不存在环境不一致依赖不一致版本配置不一致等问题,保证了环境迁移的一致,就算要在多台机器上运行,只要运行该镜像就行。方便做持续集成并有助于整体发布的容器虚拟化技术。

四、Docker 的基本组成

Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker客户端和服务器、Docker镜像、Registry、Docker容器。

镜像(image): 镜像文件生成容器实例,本身也是一个文件,称为镜像文件;其实image文件可以看作是容器的模版,Docker根据文件生成容器实例,同一个image文件,可以生成多个同时运行的文件实例。

容器(cantainer): 一个容器运行一种服务,当需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是容器;其实类似于通过镜像new出来的实例对象。

仓库(repository): 存放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库总拉取就行。

Docker客户端和服务器、Docker镜像、Registry、Docker容器。

1.Docker客户端和服务器

Docker是一个客户-服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具docker,可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

2. Docker镜像

Docker镜像是一个只读的模板。例如,一个镜像可以包含安装了Apache Web服务应用的Ubuntu操作系统。镜像可以用来创建Docker容器。Docker提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也可以下载别人已经创建好的镜像。Docker镜像是Docker的构建组件。

镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式的结构。由一系列指令一步一步构建出来。例如:添加一个文件,执行一个命令,打开一个端口。也可以把镜像当做容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

3.Registry

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker 仓库分为公有和私有。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker Hub 是一个用于分享、管理 Docker 容器的 Docker SaaS 平台。由Docker公司负责维护的公共注册中心,包含超过15,000个可用来下载和构建容器的镜像,并提供认证、工作组结构、工作流工具(比如webhooks)、构建触发器以及私有工具。

4.Docker容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

  1. 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以创建、运行并分享Dokcer容器。容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境。

  2. 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署中尤其实用。

  3. 用Docker创建隔离的环境进行测试。例如,用Jenkins这样的持续集成工具启动一个用于测试的容器。

  4. 构建一个多用户的平台即服务基础设施。Docker能够作为云计算的多租户容器,使用Docker能容易为每个租户创建运行应该多个实例,这得益其灵活的快速环境以及有效diff命令。

  5. 高性能、超大规模的宿主机部署。

  6. Docker通过创建进程的容器,不必重新启动操作系统,几秒内能关闭,你可以在数据中心创建或销毁资源,不用担心额外消耗。典型的数据中心利用率是30%,通过更积极的资源分配,以低成本方式对一个新的实例实现一个更聚合的资源分配,我们很容易超过这个利用率,大大提高数据中心的利用效率。

命名空间是Linux内核为实现容器虚拟化而引入的特性。每个容器都有自己的命名空间,这保证了容器之间的互不影响。利用该特性,容器实现了在内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等资源的隔离,而不再是应用进程直接共享的状态。

  1. 进程命名空间

Linux通过命名空间管理进程号,同一进程在不同的命名空间中的进程号是不同的。进程命名空间是一个父子关系的结构,子空间的进程可看到父进程的ID。

  1. 网络命名空间

通过网络命名空间可以实现网络的完全隔离。一个网络命名空间为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口、IPv4和IPv6协议栈、IP路由表、防火墙规则、sockets等。Docker可采用虚拟网络设备(Virtual Network Device)的方式将不同命名空间的网络设备连接在一起。默认情况下,容器的虚拟网卡将与宿主机的docker0网桥连接在一起。

  1. IPC命名空间

进程间交互(Interprocess Communication - IPC)的信息包括信号量、消息队列、共享内存等。同一IPC命名空间的进程可以交互;否则不行。PID命名空间和IPC命名空间可以组合使用。

  1. 挂载命名空间

挂载命名空间可以将一个进程放到一个特定的目录执行,且允许不同命名空间的进程看到的文件结构不同,将各个命名空间中的进程看到的文件目录隔离。

  1. UTS命名空间

UTS(UNIX Time-sharing System)命名空间可以另每个容器拥有独立的主机名和域名,从而虚拟出一个拥有独立主机名和独立网络空间的环境。默认情况下,Docker容器的主机名就是容器的ID。

  1. 用户命名空间

每个容器拥有不同的用户和组ID,容器可以使用自身内部的特定用户执行程序,而非宿主机系统上存在的用户。每个容器内部都可以有root账号,且跟宿主机不在同一命名空间。

五、Docker引擎

docker引擎是一个c/s结构的应用,主要组件见下图:

  • Server是一个常驻进程。
  • REST API 实现了client和server间的交互协议。
  • CLI 实现容器和镜像的管理,为用户提供统一的操作界面。

六、Docker构架

Docker使用一个客户端服务器c/s架构。 Docker客户端和Docker守护进程交流,Docker守护进程做非常重要的工作,构建,运行和分发你的Docker容器。Docker客户端和守护进程可以运行在同样的系统上,或者是你可以连接一个Docker客户端到一个远程Docker守护进程中。Docker客户端和守护进程通过sockets或通过RESTful API进行沟通交流。

七、核心概念

1.镜像(image)

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:

右边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

2.仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

3.容器(container)

Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。下面这张图片展示了一个运行中的容器。

正是文件系统隔离技术使得Docker成为了一个非常有潜力的虚拟化技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层。

一知乎大神的推荐:

我从不推荐开发者在web开发过程中使用容器,如果你真的用过docker,你会知道启动web容器也是要花时间的,即使是1秒钟也是时间啊。加上web开发的项目何止是一个组件构成的,通常这个时候尝试docker compose搭建一套开发环境倒是可以试验一把。但是,试想你写了一行代码,这个时候需要实时编译并呈现出来如何做到呢?难道需要手工restart一遍docker compose?它并不能热加载奥?所以,别吹牛了。在开发环境,docker一点用都没有。请尽量用docker来构建测试环境比较合适。自动化测试方面尤其方便。

  • 一次镜像,处处运行。
  • 更快速的应用交付和部署。
  • 更便捷的升级和扩缩容。
  • 更简单的系统运维。
  • 更高效的计算资源利用。

八、镜像常用命令

1.docker images #查看镜像

2.docker search 镜像名称 #查找镜像

3.docker pull 镜像名称:标签 #下载镜像

4.docker push 镜像名称:标签 #上传镜像

5.docker save centos:latest -o /root/centos.tar #将镜像导出到本机

6.docker load -i /root/centos.tar #将镜像导入

7.docker rmi 镜像名称:标签 #删除镜像

8.docker history 镜像名称:标签 #查看镜像制作历史

9.docker inspect 镜像名称:标签 #查看镜像的信息

10.docker tag 镜像名称:标签 新镜像名称:新标签 #复制镜像并改名称

11.docker commit 容器ID 新镜像名称:新标签 #自定义镜像

九、容器常用命令

1.docker run -it docker.io/centos:latest /bin/bash #启动并进入容器

2.docker run -itd httpd:latest #启动容器并放入后台

3.docker ps #查看启动的容器

4.docker ps -a #查看所有的容器,包括未启动的容器

5.docker ps -aq #查看所有容器的ID

6.docker rm 容器ID #删除容器,启动的容器需要停止后再删除

7.docker start 容器ID #启动容器

8.docker stop 容器ID #停止容器

9.docker restart 容器ID #重启容器

10.docker inpect 容器ID #查看容器的信息

11.docker top 容器ID #查看容器的进程

12.docker cp 本机路径 容器ID:容器内路径 #将本机文件复制到容器内

13.docker cp 容器ID:容器内路径 本机路径 #将容器内文件复制到本机

14.docker exec -it 容器ID 启动命令 #连接容器,启动新进程

15.docker attch 容器ID #以上帝身份进入容器内部,注意exit退出容器时,会结束整个容器,可以用ctrl+p+q快捷键方式退出就不会结束整个容器。

十、Docker 一般命令

十一、Docker 镜像命令

十二、Docker 容器命令

有镜像的前提下才能创建容器。

通俗易懂解释Docker是什么相关推荐

  1. 通俗易懂解释知识图谱

    通俗易懂解释知识图谱(Knowledge Graph) 1. 前言 2. 知识图谱定义 3. 数据类型和存储方式 4. 知识图谱的架构 4.1 逻辑架构 4.2 技术架构 5. 信息抽取 5.1 实体 ...

  2. 通俗易懂解释一类和二类错误(Type I Error Type II Error)

    通俗易懂解释一类和二类错误(Type I Error Type II Error) 作者 KULDEEP PATEL 翻译自False Positive (Type I Error) and Fals ...

  3. 通俗易懂的Docker容器技术简单解释

    一.什么是Docker容器 Docker的思想来自于集装箱, 是一个以容器的形式将应用程序及其所有依赖项打包在一起的平台.它使用容器使应用程序的创建.部署和运行变得更加容易.Docker 在容器内绑定 ...

  4. (通俗易懂~)Docker搭建Etcd集群

    (通俗易懂~)基于Docker的Etcd集群环境搭建 闲言碎语 Etcd简介 准备环境 第一步,下载Etc镜像 第二步,创建自定义Docker网络 第三步,创建并启动Etcd镜像节点 验证结果 完结撒 ...

  5. 通俗易懂解释汉明码(附MATLAB实现代码)

    汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名.汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正 ...

  6. 通俗易懂解释知识图谱(Knowledge Graph)

    1. 前言 从一开始的Google搜索,到现在的聊天机器人.大数据风控.证券投资.智能医疗.自适应教育.推荐系统,无一不跟知识图谱相关.它在技术领域的热度也在逐年上升. 本文以通俗易懂的方式来讲解知识 ...

  7. 1 通俗易懂解释Resnet50

    通俗易懂Resnet50网络结构分析 1 Why(该网络要解决什么样的问题) 1.1 什么叫梯度消失和梯度爆炸 2 How(如何解决该问题) 2.1 直观解释 2.2 残差是什么 2.3 网络结构 3 ...

  8. 非线性最小二乘通俗易懂解释

    转https://www.cnblogs.com/leexiaoming/p/7257198.html备份用 1. 非线性最小二乘介绍 1.1. 最小二乘问题回顾: 在上一篇博客中我们知道最小二乘问题 ...

  9. 通俗易懂学Docker

    一.初识Docker Docker是一个虚拟机技术,是应用程序和系统的中间层 Docker本身并不是容器,它是创建容器的工具,是应用容器引擎 大部分人用过虚拟机,例如VirtualBox,应用程序需要 ...

最新文章

  1. 零基础怎么学习UI设计?有哪些简单的学习方法?
  2. Oracle数据库的语句级读一致性
  3. [Hadoop in China 2011] 邵铮:揭秘FaceBook Puma演变及发展
  4. ngrok服务器搭建 window_.NET开发框架(三)高可用服务器端设计
  5. 《编程原本 》一2.2 轨道
  6. 利用sender的Parent获取GridView中的当前行
  7. Python深度学习基础(四)——损失函数
  8. 3DMM-Fitting_Pytorch代码阅读
  9. JS layer时间组件laydate的回调中重置清除选择无效的问题
  10. 云初起微方案中下单人、联系人、下载者三者之间是什么关系?
  11. Redis的I/O多路复用
  12. D3DCULL_CW 和 D3DCULL_CCW
  13. v4l2框架—申请缓存(VIDIOC_REQBUFS)
  14. python数据结构之线性顺序表
  15. Vue2中样式详解(scoped)
  16. 代码随想录训练营day7
  17. 适合小本创业的项目(适合新手创业的项目)
  18. c语言中char97,C语言数据类型char
  19. 转产品经理,难吗?怎么准备?
  20. Anti Arp Sniffer ARP病毒专杀工具

热门文章

  1. Python爬虫实践:优志愿 院校列表
  2. Python | 人脸识别系统 — 人脸比对 代码部分
  3. RetinaNet模型在DDSM数据集的应用问题(2)
  4. iOS中 @synthesize 和 @dynamic 区别
  5. 洛谷P1438 无聊的数列
  6. 进程之joinableQueue
  7. python开发培训的报价
  8. 阴阳师进不去怎么办?阴阳师海外打不开解决办法!
  9. ViewData与ViewBag比较
  10. Canvas实现3D效果-可旋转的立方体