容器创建

我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器。同样,如果我们想要使用容器,那么我们必须首先需要创建容器。而且要知道一个镜像可以同时创建多个容器

[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
-t表示为容器分配一个伪终端
-i容器的标准输出为打开的状态
/bin/bash表示容器运行的地址
再执行一遍,就又创建一个容器

容器的启动

容器的启动主要分为两种方式:

1、创建。
2、把终止状态的容器启动。

exit之后就是终止状态

[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
root@abc6e11de34e:/# exit
exit

查看docker上所有的容器

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc6e11de34e ubuntu:17.10 "/bin/bash" 11 minutes ago Exited (0) 50 seconds ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

再次启动

[root@206 /]# docker start abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc6e11de34e ubuntu:17.10 "/bin/bash" 14 minutes ago Up 2 seconds ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

守护态运行

Docker里的容器可以在后台以守护态的方式运行,这样可以方便我们对Docker的操作

[root@206 /]# docker run -d ubuntu:17.10 /bin/bash -c "while true;do echo thanks;sleep 3;done"
这里我们创建了一个守护态运行的容器,并让他一直输出thanks
根据id查看容器的输出
[root@206 /]# docker logs 9e48
thanks
thanks
thanks
thanks
thanks
thanks
thanks
thanks
...

终止

假如我们暂时不想运行某个容器,我们可以终止该容器,终止之后,对应的容器将退出运行状态

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 2 minutes ago Up 2 minutes inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 25 minutes ago Up 11 minutes ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

这里有两个正在后面默默运行的容器

[root@206 /]# docker stop 9e48
9e48
[root@206 /]# docker stop abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 4 minutes ago Exited (137) 13 seconds ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 28 minutes ago Exited (0) 8 seconds ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski

依附容器

我们可以使用Docker attach指令依附到某个容器中,通俗来说,就是指我们可以通过该指令进入某个容器。

没有在运行的容器是不能依附的

[root@206 /]# docker start abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 10 minutes ago Exited (137) 6 minutes ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 34 minutes ago Up 2 seconds ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski
[root@206 /]# docker attach abc6
root@abc6e11de34e:/#

其实依附也就是进入一个容器而已

容器信息查看

查看运行中的容器

[root@206 /]# docker ps

查看所有容器

[root@206 /]# docker ps -a

查看最后一次创建的容器

[root@206 /]# docker ps -l

查看运行中的容器的id号

[root@206 /]# docker ps -q

上面的查看守护容器的log

[root@206 /]# docker logs 9e48

实时查看

[root@206 /]# docker logs -f 9e48

只查看最新两行

[root@206 /]# docker logs --tail=2 9e48

只查看最新的两行,且不断实时查看

[root@206 /]# docker logs --tail=2 -f 9e48

附加产生log的具体时间

[root@206 /]# docker logs  -t 9e48

容器内命令执行

容器内命令的执行方式有两种:
1.依附到对应容器,在对应容器中直接执行。
2.不进入对应容器,直接在主系统中通过docker exec指令对对应容器进行相关指令执行操作。而2又可分为:

2.1 后台执行

[root@206 /]# docker exec -d abc6 touch /q.txt
[root@206 /]# docker exec -d abc6 echo "123"
[root@206 /]#

2.2 交互执行

[root@206 /]# docker exec -ti abc6 touch /w.txt
[root@206 /]# docker exec -ti abc6 echo "123"
123
结果很明显了
 
 
docker exec -ti abc6 /bin/bash
这个比attach的好处是,不会exit就关闭容器

容器的导入导出

我们已经学过如何将某个镜像导出成一个压缩文件,移植到其他环境中使用。同样,我们也可以将某个容器通过docker export指令导出为一个压缩文件,然后存储起来,在必要的时候可以根据该压缩文件恢复为容器

[root@206 /]# docker export abc6 > abc6.tar
当我们想把某个容器的压缩文件导入恢复为容器的时候,我们需要通过docker import指令进行容器的导入操作。由于容器是基于镜像而创建的,其核心特征是在镜像上创建一层可写层。故而,容器的导入过程可以这样:首先把容器压缩文件快照导入为一个镜像,然后基于该镜像创建一个容器,则此时创建的新容器跟原容器性能一致,该过程即为容器的导入操作
首先把容器压缩文件快照导入为一个镜像
[root@206 /]# cat abc6.tar | docker import - cba:v2

查看镜像,发现多了一个

[root@206 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cba v2 7ee75c306951 48 minutes ago 78.5 MB
<none> <none> cbf64eb48a64 6 hours ago 89.6 MB
newsuse 99999 7e4ff5f67461 6 hours ago 156 MB
newubuntu 8888 036d21b62a12 6 hours ago 89.6 MB
ubuntu 17.10 073e7b409b9b 43 hours ago 89.6 MB
itliucheng/ubuntu first 073e7b409b9b 43 hours ago 89.6 MB

创建容器

[root@206 /]# docker run  -ti cba:v2 /bin/bash

虽然容器号不一样了,但是内容是完全一样的

数据卷

我们以后在学习Docker容器的时候,那么容器可能会出现多个,同样,每个容器中都会涉及数据,自然,我们就要研究如何对这些数据进行管理。管理容器中数据的方式主要有2种:
1.数据卷
2.数据卷容器
数据卷是一个可以供一个容器或者多个容器使用的特殊目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享,类似于Linux系统下的mount(挂载命令)
数据卷主要有4个性能:
1.数据卷可以在容器之间共享和重用
2.对数据卷的修改会立马生效
3.对数据卷的更新,不会影响镜像
4.卷会一直存在,直到没有容器使用
数据卷创建
[root@206 ~]# docker run -ti -v /abctest ubuntu:17.10 /bin/bash

-v就是创建数据卷参数,并且挂载到指定的容器里

root@f109cdc59516:/# ls
abctest bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

挂载

我们在容器中创建了数据卷之后,可以把母机器中的某个目录或某个文件挂载到数据卷中,这样,这个目录或文件与容器中的数据卷内容就相当于是一个了。

[root@206 ~]# cd /
[root@206 /]# mkdir gztest
[root@206 /]# cd gztest/
[root@206 gztest]# touch a.txt

创建容器并挂载 将母机的gztest挂载到 容器中的contest中

[root@206 gztest]# docker run -ti -v /gztest:/contest ubuntu:17.10 /bin/bash
root@9647eb0d2898:/# ls
bin boot contest dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@9647eb0d2898:/# cd contest/
root@9647eb0d2898:/contest# ls
a.txt

延伸:如果创建的容器有权限限制,就修改成这样创建容器docker run -ti -v /gztest:/contest --privileged=true ubuntu:17.10 /bin/bash  再或者关闭selinux 命令为: setenforce 0

同理,刚才是挂载文件夹,挂载文件同理
docker run -ti -v /file.txt:/co/b.txt ubuntu:17.10 /bin/bash

数据卷容器

所谓的数据卷容器,其实质上,是容器,但是这个容器是一个专门用来提供数据卷的容器。
     那么,为什么要有数据卷容器呢?
因为有的时候,我们会有一些数据需要持续更新,并且这些数据需要在容器间进行共享,那么此时,如果有一个专门的容器来提供数据卷,将会方便很多。所以,如果我们要解决数据的持久化问题,我们应当选用数据卷容器
创建一个数据卷容器,设置了容器名称为datac1
[root@206 /]# docker run -ti -v /abc --name datac1 ubuntu:17.10 /bin/bash
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2e8f642c525 ubuntu:17.10 "/bin/bash" 17 seconds ago Exited (0) 8 seconds ago datac1
9647eb0d2898 ubuntu:17.10 "/bin/bash" 27 minutes ago Exited (0) 14 minutes ago focused_jang
f109cdc59516 ubuntu:17.10 "/bin/bash" 34 minutes ago Exited (0) 32 minutes ago stupefied_curie
6d8a8372d68b cba:v2 "/bin/bash" 3 hours ago Up 3 hours unruffled_agnesi
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 6 hours ago Exited (137) 5 hours ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 6 hours ago Up 5 hours ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago amazing_kowalevski

创建另外一个普通容器,并挂载数据卷容器

[root@206 /]# docker run -ti --volumes-from b2e8 --name testcommon ubuntu:17.10 /bin/bash
root@f99f555cfac5:/# ls
abc bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
这里可以用--volumes-from b2e8  也可以用--volumes-from bdatac1
我们可以看到普通容器中有一个abc文件夹,这个就是数据卷容器中的文件夹
在abc中创建文件,attach到数据卷容器中会发现这个 abc文件夹中也有新创建的文件

数据迁移

我们在这里所说的数据迁移,是指在有必要的时候,将数据卷容器的数据卷中的数据全部转移到一个新的地方。我们实现迁移的原理是:首先将数据卷容器的相应数据卷进行备份,然后将备份文件保存起来,在有需要的时候,再将备份文件恢复为原来的数据卷,并且数据卷里面的内容要完整保存
 要想对数据卷里面的内容进行备份,我们可以这样做:加载源数据卷容器里面的数据卷,并在新的容器中把加载过来的数据卷归档存放,在进行以上操作的同时,将当前目录挂载到新容器存放归档文件的目录中,这样就可以直接在当前文件取到对应的压缩文件了。
意思就是 :创建一个普通容器,并挂载数据卷容器,同时这个普通容器还挂载了母机的一个文件夹,这样普通容器能操作数据卷,压缩数据卷后放入母机关联的文件夹,这样在母机上也能操作
[root@206 /]# docker run -ti -v /abcd --name abc ubuntu:17.10 /bin/bash
root@42fae694e443:/# ls
abcd bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@42fae694e443:/# cd abcd/
root@42fae694e443:/abcd# touch a.txt&&touch b.txt
root@42fae694e443:/abcd# ls
a.txt b.txt

创建普通容器

[root@206 /]# docker run -ti --volumes-from 42fa -v /gztest:/backup --name backcontainer ubuntu:17.10 tar cvf /backup/task1.tar /abcd

母机上

[root@206 /]# cd gztest/
[root@206 gztest]# ls
a.txt task1.tar

数据恢复就不说了,在建立一个容器,将母机文件所在目录挂载到容器的目录中

容器命名

从之前到现在,创建了很多的容器

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 24 minutes ago Up 24 minutes 0.0.0.0:32769->8998/tcp net2
e617f1cd394d ubuntu:17.10 "/bin/bash" 25 minutes ago Exited (0) 25 minutes ago net1
dbb53a5ddc3e ubuntu:17.10 "tar cvf /backup/t..." 50 minutes ago Exited (0) 50 minutes ago backcontainer
42fae694e443 ubuntu:17.10 "/bin/bash" 57 minutes ago Exited (0) 56 minutes ago abc
f99f555cfac5 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago testcommon
b2e8f642c525 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago datac1
9647eb0d2898 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 13 hours ago focused_jang
f109cdc59516 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 14 hours ago stupefied_curie
6d8a8372d68b cba:v2 "/bin/bash" 17 hours ago Exited (255) 2 hours ago unruffled_agnesi
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 19 hours ago Exited (137) 19 hours ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 20 hours ago Exited (255) 2 hours ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago amazing_kowalevski

我们先根据容器id查一下容器名称

[root@206 /]# docker inspect -f "{{.Name}}" 2f90
/amazing_kowalevski

docker不允许容器同名。若出现同名

1、先删除原容器,再创建新容器。

[root@206 /]# docker rm amazing_kowalevski

把容器名换成id一样

2、使用--rm标记,一旦容器退出,自动删除容器

[root@206 /]# docker run -ti --name advc --rm ubuntu:17.10

exit之后容器已经删除了

网络服务

Docker可以提供网络服务。
Docker提供网络服务,主要有两种方式:
1、外部访问
    我们在Docker的容器中,可以运行一些网络应用,比如WEB应用等,如果这些应用需要跟外界进行交互,那么一般使用外部访问容器的方式进行。主要会通过端口映射的方式解决。

[root@206 /]# docker run -t -P --expose 8998 --name net2 ubuntu:17.10

-P表示可以外部访问

--expose绑定端口

[root@206 /]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 12 seconds ago Up 11 seconds 0.0.0.0:32769->8998/tcp net2

所以我们可以浏览器192.168.126.206:32769来访问该服务,由于容器里并没有什么web项目,所以访问也没效果

[root@206 /]# docker port net2 8998
0.0.0.0:32769

还可以这样 小写的p

[root@206 /]# docker run -t -p 192.168.126.205:8999:5001 --name net3 ubuntu:17.10

他表示访问192.168.126.206:8999来访问容器的5001端口

2、容器互联

容器互联的方式会在接收容器与源容器间创建一个隧道,接收容器可以看到源容器的指定信息

创建源容器

[root@206 /]# docker run -ti --name hl1 ubuntu:17.10
[root@206 /]# docker start hl1

创建接收容器

[root@206 /]# docker run -ti --name hl2 --link hl1:yuan1 ubuntu:17.10
:yuan1表示给源容器起的别名,可以不加
 此时这两个容器就算是互联了
我们在进行了容器互联之后,有时我们需要查找某些容器的互联信息,此时我们就要进行连接信息的公开。
      一般,要公开连接信息,有两种方式
1、hosts文件法

我们可以进入连接容器,也就是接收容器,然后找到/etc/hosts文件,并cat查看,即可以把该容器的连接信息公开出来,包括该连接容器对应的源容器信息等。公开之后,我们可以使用ping命令测试连接是否通畅。

root@7a9dee156249:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 yuan1 30bd2045b737 hl1
172.17.0.4 7a9dee156249

执行 ping 172.17.0.3  或者  ping hl1 即可

2、环境变量法

[root@206 /]# docker run -ti --name hl3 --link hl1:yuan2 ubuntu:17.10 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7a91ce8a9480
TERM=xterm
YUAN2_NAME=/hl3/yuan2
HOME=/root

Dockerfile的使用

这是以前学的只用Dockerfile创建镜像

[root@206 test]# touch Dockerfile
FROM newubuntu:8888
MAINTAINER root
RUN touch a.txt
RUN mkdir test1

CMD:执行docker run时执行某行指令,具有替换性

FROM ubuntu:17.10
MAINTAINER root
CMD ["echo"]
[root@206 test]# docker build -t="copyubuntu" /test
[root@206 /]# docker run -ti copyubuntu echo hello
hello

ENTRYPOINT:执行docker run时执行某行指令,不具有替换性

[root@206 test]# vi Dockerfile
FROM ubuntu:17.10
MAINTAINER root
ENTRYPOINT ["echo"]
[root@206 /]# docker build -t="copyubuntu1" /test
[root@206 /]# docker run -ti copyubuntu1 echo hello
echo hello
USER:使用哪个用户运行容器
EXPOSE:绑定哪个内部端口,构建镜像的时候,开启哪个端口
ENV:环境变量设置,构建镜像的时候添加环境变量配置
ADD: 跟copy类似 ,将本机某个文件,在生成镜像的时候,放入镜像中,同时add有另外的解压功能,也就是拷贝进去后会自动解压
COPY :从本地复制文件到镜像中

5.docker学习之容器的更多相关文章

  1. Docker 学习1 容器技术基础入门

    一.虚拟化 1.主机级别虚拟化(两种) a.类型一虚拟化:在硬件上直接安装hyper-ver,然后再安装虚拟机 1).操作系统就两棵树:进程树,文件系统树. 2).一个内核只能有一个root b.类型 ...

  2. 2.ASP.NET Core Docker学习-镜像容器与仓库

    Docker下载 https://www.docker.com/community-edition 社区版 (CE) 下载完后安装,运行 docker --version 可查看版本 基本命令: 下面 ...

  3. docker学习笔记-容器相关命令

    新建并启动容器 docker pull centos (先下载镜像,如果没有直接使用docker run 命令会根据本地情况进行下载) # docker run [可选参数] image # 参数说明 ...

  4. docker学习(3) 容器的启动过程

    这一节我们来稍微了解下docker原理性的东西 docker run -i -t ubuntu /bin/bash 输入上面这行命令,启动一个ubuntu容器时,到底发生了什么? 大致过程可以用下图描 ...

  5. Docker学习4-Containers - 容器

    用Docker方式构建应用程序,从这个应用程序层次结构的底层容器开始.高于此级别的是一项服务,它定义了容器在生产中的行为方式.在顶层是堆栈,它定义了所有服务的交互. Stack  堆栈 Service ...

  6. docker学习6-docker-compose容器集群编排

    前言 实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器. 我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有 ...

  7. Docker学习(3) 容器基本操作

    容器的基本操作

  8. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  9. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

随机推荐

  1. iOS - 正则表达式判断邮箱、身份证,车牌,URL等..是否正确:

    //邮箱 + (BOOL) validateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Z ...

  2. Swift UIAlertController、UISegmentedControl

    // MARK: 提示框 func _initAlertView() { let btn = UIButton(type: UIButtonType.ContactAdd) btn.frame = C ...

  3. 02-C与OC语言的一些小知识

    1.        #import 跟#include.@class有什么区别?#import<> 跟 #import”"又什么区别? 1>  #import和#inclu ...

  4. MacDown语法

    markdown编辑器太多,作为新手比较容易MacDown 相对容易上手,切使用简单方便,满足一般需求 下载地址:http://macdown.uranusjr.com/ ## 标题 # 一级标题 # ...

  5. ios 控制器的生命周期

    #pragma mark - 控制器生命周期 // 视图将要出现 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:anima ...

  6. Jmeter-Threads(Users)

    setUp Thread Group---测试开始前的准备操作,每次测试前都会执行 A special type of ThreadGroup that can be utilized to perf ...

  7. 每天一个linux命令:【转载】more命令

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  8. 【模板】FFT

    FFT模板 安利一下前辈的博客,写的真的好点击这里:从多项式乘法到快速傅里叶变换 #include<bits/stdc++.h> using namespace std; const in ...

  9. 从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配

    尝试过写 if (x is null)?它与 if (x == null) 相比,孰优孰劣呢? x is null 还有 x is constant 是 C# 7.0 中引入的模式匹配(Pattern ...

  10. Object-C 中的Selector 概念

    selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. @selector(xxxx)的作用是找到名字为xxxx的方法.一般用于[a pe ...