最后
答应大伙的备战金三银四,大厂面试真题来啦!
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
一、docker run 简介
-
二、docker run 命令集
-
三、实例测试
-
-
3.1、分配名称并分配pseudo-TTY(–name,-it)
-
3.2、记录容器ID(–cidfile)
-
3.3、完整的容器功能 (–privileged)
-
3.4、设置工作目录 (-w)
-
3.5、为每个容器设置存储驱动程序选项
-
3.6、Mount tmpfs (–tmpfs)
-
3.7、Mount volume (-v, --read-only)
-
3.8、使用–mount flag
-
3.9、发布或公开端口(-p,–expose)
-
3.10、设置pull策略(–pull)
-
3.11、设置环境变量(-e,–env,–env-file)
-
3.12、在容器上设置元数据(-l,–label,–label-file)
-
3.13、将容器连接到网络(–网络)
-
3.14、从容器中安装卷(–volumes-from)
-
3.15、附加到STDIN/STDOUT/STDERR(-a)
-
3.16、将主机设备添加到容器(–device)
-
3.17、使用动态创建的设备(–device-cgroup-rule)
-
3.18、访问NVIDIA GPU
-
3.19、重启策略(–restart)
-
3.20、将条目添加到容器主机文件(–add-host)
-
3.21、在容器中设置ulimits(–ulimit)
-
3.22、对于nproc使用
-
3.22、带有信号的停止容器(–stop-signal)
-
3.23、可选的安全选项(–security-opt)
-
3.24、停止带超时的容器(–停止超时)
-
3.25、指定容器的隔离技术(–隔离)
-
3.26、指定容器可用内存的硬限制(-m,–memory)
-
3.27、在运行时配置命名空间内核参数(sysctls)
-
=============================================================================
docker run命令可以与docker commit命令结合使用,以改变容器运行的命令。
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run命令首先在指定映像上creates可写的容器层,然后使用指定的命令starts它。也就是说,docker run等价于API /containers/create
然后/containers/(id)/start
。使用docker start,可以重新启动已停止的容器,并保存之前的更改。
==============================================================================
这里的命令集比较多,如果你不太喜欢的话,可以迅速下滑值实例讲解区。我之所以把它放在最前面,是因为,我们以后要一直和它们交到,是需要熟悉的核心。
| Name, shorthand | Description |
| — | — |
| –add-host | 添加自定义主机到IP映射(host:ip) |
| –attach , -a | 连接到STDIN、STDOUT或STDERR |
| –blkio-weight | 块IO(相对重量),在10到1000之间,或0禁用(默认0) |
| –blkio-weight-device | Block IO重量(相对设备重量) |
| –cap-add | 添加Linux功能 |
| –cap-drop | 删除Linux功能 |
| –cgroup-parent | 容器的可选父cgroup |
| –cgroupns | (API 1.41+才新增)要使用的C组命名空间(host |
| –cidfile | 将容器ID写入文件 |
| –cpu-count | CPU计数(仅限Windows) |
| –cpu-percent | CPU百分比(仅限Windows) |
| –cpu-period | 限制CPU CFS(完全公平的调度器)期限 |
| –cpu-quota | 限制CPU CFS(完全公平的调度器)配额 |
| –cpu-rt-period | 将CPU实时周期限制在微秒内 |
| –cpu-rt-runtime | 将CPU实时运行时间限制在微秒内 |
| –cpu-shares , -c | CPU份额(相对权重) |
| –cpus | CPU数量 |
| –cpuset-cpus | 允许执行的CPU(0-3,0,1) |
| –cpuset-mems | 允许执行的MEM(0-3,0,1) |
| –detach , -d | 在后台运行容器并打印容器ID |
| –detach-keys | 覆盖用于分离容器的密钥序列 |
| –device | 将主机设备添加到容器中 |
| –device-cgroup-rule | 在cgroup允许的设备列表中添加规则 |
| –device-read-bps | 限制设备读取速率(每秒字节) |
| –device-read-iops | 限制设备读取速率(每秒IO) |
| –device-write-bps | 将写入速率(每秒字节)限制到设备 |
| –device-write-iops | 限制设备写入率(每秒IO) |
| –disable-content-trust | 跳过图像验证 |
| –dns | 设置自定义DNS服务器 |
| –dns-opt | 设置DNS选项 |
| –dns-option | 设置DNS选项 |
| –dns-search | 设置自定义DNS搜索域 |
| –domainname | Container NIS域名 |
| –entrypoint | 覆盖图像的默认ENTRYPOINT |
| –env , -e | 设置环境变量 |
| –env-file | 在环境变量文件中读取 |
| –expose | 暴露一个端口或一系列端口 |
| –gpus | (IPI 1.40+)要添加到容器中的GPU设备(“全部”用于传递所有GPU) |
| –group-add | 添加其他组加入 |
| –health-cmd | 命令运行以检查当前状态 |
| –health-interval | 运行检查之间的时间(ms |
| –health-retries | 报告不健康需要连续失败 |
| –health-start-period | 容器在开始健康再试倒计时前初始化的开始周期(ms |
| –health-timeout | 允许运行一个检查的最大时间(ms |
| –help | 打印使用情况 |
| –hostname , -h | 容器主机名 |
| –init | 在容器内运行init,转发信号并收割流程 |
| –interactive , -i | 即使没有连接,也要保持STDIN打开 |
| –io-maxbandwidth | 系统驱动器的最大IO带宽限制(仅限Windows) |
| –io-maxiops | 系统驱动器的最大 IOps 限制(仅限 Windows) |
| –ip | IPv4地址(例如,172.30.100.104) |
| –ip6 | IPv6地址(例如,2001:db8:33) |
| –ipc | 使用的IPC模式 |
| –isolation | 容器隔离技术 |
| –kernel-memory | 内核内存限制 |
| –label , -l | 在容器上设置元数据 |
| –label-file | 在行分隔的标签文件中阅读 |
| –link | 添加指向另一个容器的链接 |
| –link-local-ip | 容器IPv4/IPv6链路本地地址 |
| –log-driver | 容器的日志驱动程序 |
| –log-opt | 记录驱动程序选项 |
| –mac-address | 容器MAC地址(例如,92:d0:c6:0a:29:33) |
| –memory , -m | 内存限制 |
| –memory-reservation | 内存软限制 |
| –memory-swap | 交换限制等于内存加交换:“-1”以启用无限交换 |
| –memory-swappiness | 调整容器内存交换(0到100)默认为 -1 |
| –mount | 将文件系统挂载附加到容器中 |
| –name | 为容器分配名称 |
| –net | 将容器连接到网络 |
| –net-alias | 为容器添加网络范围的别名 |
| –network | 将容器连接到网络 |
| –network-alias | 为容器添加网络范围的别名 |
| –no-healthcheck | 禁用任何容器指定的HEALTHCHECK |
| –oom-kill-disable | 禁用OOM杀手 |
| –oom-score-adj | 调整主机的OOM首选项(-1000至1000) |
| –pid | 要使用的PID命名空间 |
| –pids-limit | 调整容器pids限制(无限设置-1) |
| –platform | 如果服务器支持多平台,请设置平台 |
| –privileged | 授予此容器扩展权限 |
| –publish , -p | 将容器的端口发布到主机 |
| –publish-all , -P | 将所有公开的端口发布到随机端口 |
| –pull | 运行前拉取图像(“always”,“missing”,“never”)默认(“missing”) |
| –read-only | 将容器的根文件系统装载为只读 |
| –restart | 重新启动策略,以便在容器退出时应用 默认(No) |
| –rm | 容器退出时自动取出 |
| –runtime | 用于此容器的运行时 |
| –security-opt | 安全选项 |
| –shm-size | /dev/shm的大小 |
| –sig-proxy | 代理收到该过程的信号 默认 true |
| –stop-signal | 停止容器的信号 默认 SIGTERM |
| –stop-timeout | 暂停(以秒为单位)以阻止容器 |
| –storage-opt | 容器的存储驱动程序选项 |
| –sysctl | Sysctl选项 |
| –tmpfs | 挂载tmpfs目录 |
| –tty , -t | 分配 pseudo-TTY |
| –ulimit | 限制选项 |
| –user , -u | 用户名或UID (format: <name |
| –userns | 要使用的用户命名空间 |
| –uts | 要使用的UTS命名空间 |
| –volume , -v | 绑定安装卷 |
| –volume-driver | 容器的可选音量驱动程序 |
| –volumes-from | 从指定的容器中挂载卷 |
| –workdir , -w | 容器内的工作目录 |
呼!累死宝宝了,,,这里的命令类型真的太多了。
====================================================================
3.1、分配名称并分配pseudo-TTY(–name,-it)
我们先来创建一个使用debian:latest
映像运行一个名为test的容器。-it 指示Docker分配一个pseudo-TTY 连接到容器的stdin;在容器中创建一个交互式bash shell
。
$ docker run --name test -it debian
root@d6c0fe130dba:/# exit 13
$ echo $?
13
$ docker ps -a | grep test
a131d2951e84 debian “bash” About a minute ago Exited (13) About a minute ago test
在上面命令中,输入exit 13退出bash shell。这个退出代码被传递给docker运行的调用者,并记录在测试容器的元数据中。
$ ocker run --cidfile /tmp/docker_test.cid ubuntu echo “test”
创建一个容器,并将test打印到控制台。cidfile标志使Docker尝试创建一个新文件,并将容器ID写入其中。如果文件已经存在,Docker将返回错误。Docker将在docker run退出时关闭此文件。
$ docker run -t -i --rm ubuntu bash
上面的命令结果运行,直接提示我们没有权限,因为默认情况下,这是直接删除内核功能;包括cap_sys_admin(挂载文件系统需要)。然而,–privileged标志将允许它运行:
--privileged
标志赋予容器所有功能,它还解除了devicecgroup控制器执行的所有限制。换句话说,容器几乎可以做主机能做的一切。此标签的存在是为了允许特殊用例,例如在Docker中运行Docker。
$ docker run -w /path/to/dir/ -i -t ubuntu pwd
-w
允许在给定的目录内执行命令,此处为/path/to/dir/
。如果路径不存在,则在容器内创建。
$ docker run -it --storage-opt size=120G fedora /bin/bash
这个(size)将允许在创建时将容器rootfs大小设置为120G。此选项仅适用于devicemapper、btrfs、overlay2、windowsfilter和zfs图形驱动
。对于devicemapper, btrfs, windowsfilter和zfs图形驱动
,用户不能传递小于默认BaseFS 的大小。对于overlay2存储驱动程序,只有当备份文件fs是xfs并且使用pquota挂载选项挂载时,size选项才可用。在这些条件下,用户可以传递任何小于备份文件大小的大小。
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
--tmpfs
标志将一个空的tmpfs装入容器中,其中包含rw、noexec、nosuid、size=65536k选项
。
3.7、Mount volume (-v, --read-only)
$ docker run -v
pwd
:pwd
-wpwd
-i -t ubuntu pwd
-v
标志将当前工作目录挂载到容器中。-w
允许在当前工作目录中执行命令,方法是将命令更改为pwd返回的值。因此,此组合使用容器执行命令,但在当前工作目录中。
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
当绑定式卷的主机目录不存在时,Docker将自动在主机上为您创建此目录。在上面的示例中,Docker将在启动容器之前创建/doesnt/exist
文件夹。
$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here
Volumes 可以与--read-only
结合使用,以控制容器写入文件的位置。--read-only
标志将容器的根文件系统挂载为只读,禁止写入容器指定卷以外的位置。
$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh
通过绑定安装docker unix套接字和静态链接的docker二进制文件(linux二进制文件),您可以让容器完全访问创建和操作主机的Docker守护进程。
在Windows上,必须使用Windows风格的语义指定路径。
PS C:> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt
Contents of file
PS C:> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt
Contents of file
使用基于Windows的容器时,以下示例将失败,因为容器内卷或绑定挂载的目标必须是:不存在或空目录;或C以外的驱动器:此外,绑定挂载的来源必须是本地目录,而不是文件。
net use z: \remotemachine\share
docker run -v z:\foo:c:\dest …
docker run -v \uncpath\to\directory:c:\dest …
docker run -v c:\foo\somefile.txt:c:\dest …
docker run -v c:\foo:c: …
docker run -v c:\foo:c:\existing-directory-with-contents …
--mount
标志允许您在容器中挂载卷、主机目录和tmpfs挂载。
--mount
标志支持-v或--volume
标志支持的大多数选项,但使用不同的语法。有关–mount标志的详细信息,以及--volume和--mount
之间的比较,请参阅服务创建命令引用。
尽管没有计划弃用--volume
,但建议使用--mount
。
示例:
$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
这将容器的端口8080绑定到主机127.0.0.1上的TCP端口80。您还可以指定udp和sctp端口。Docker用户指南详细解释了如何在Docker中操作端口。
请注意,未绑定到主机的端口**(即-p 80:80而不是-p 127.0.0.1:80:80)**可以从外部访问。如果您将UFW配置为阻止此特定端口,这也适用,因为Docker管理自己的iptables规则。
$ docker run --expose 80 ubuntu bash
这暴露了容器的端口80,而无需将端口发布到主机系统的接口。
在创建(和运行)容器时,使用--pull
标志设置图像拉取策略。
--pull
标志可以接受以下值之一:
| Value | Description |
| — | — |
| missing(默认) | 如果在图像缓存中找不到图像,请将其拉出,否则请使用缓存的图像。 |
| never | 不要拉动图像,即使它丢失了,如果图像缓存中不存在图像,也会产生错误。 |
| always | 在创建容器之前,请务必执行拉取。 |
从映像创建(和运行)容器时,守护进程会检查图像是否存在于本地映像缓存中。如果图像丢失,则会向cli返回错误,允许它启动拉取。
默认(missing)是仅在守护进程的图像缓存中不存在图像时提取图像。此默认值允许您运行仅在本地存在的映像(例如,您从Dockerfile构建但尚未推送到注册表的映像),并减少了网络。
在创建容器之前,always选项会启动拉取。此选项确保图像是最新的,并防止您使用过时的图像,但可能不适合在推送之前测试本地构建的图像(因为拉取图像会覆盖图像缓存中的现有图像)。
创建容器时,never选项禁用(隐式)提取图像,并且仅使用图像缓存中可用的图像。如果找不到指定的映像,则会产生错误,并且不会创建容器。此选项在网络不可用的情况下非常有用,或者可以防止在创建容器时隐式提取图像。
下面的例子显示了docker在运行时设置了——pull=never选项,这会产生一个错误,因为图像在图像缓存中丢失了:
$ docker run --pull=never hello-world
3.11、设置环境变量(-e,–env,–env-file)
$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
使用-e、--env和--env-file
标签在您正在运行的容器中设置简单的(非数组)环境变量,或覆盖您正在运行的映像的Dockerfile中定义的变量。
您可以在运行容器时定义变量及其值:
$ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VA
您还可以使用已导出到本地环境的变量:
$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
运行该命令时,Docker CLI客户端会检查变量在本地环境中的值,并将其传递给容器。如果未提供=,并且该变量未在本地环境中导出,则不会在容器中设置该变量。
您还可以从文件中加载环境变量。此文件应使用语法<variable>=value
(将变量设置为给定值)或<variable>
(从本地环境中获取值),以及**#**作为注释。
3.12、在容器上设置元数据(-l,–label,–label-file)
标签是将元数据应用于容器的key=value
对。要给容器贴上两个标签:
$ docker run -l my-label --label com.example.foo=bar ubuntu bash
my-label
键没有指定值,因此标签默认为空字符串(“”)。要添加多个标签,请重复标签标志(-l或--label
)。
key=value
必须是唯一的,以避免覆盖标签值。如果您指定具有相同键但不同值的标签,则每个后续值都会覆盖上一个值。Docker使用您提供的最后一个key=value
。
使用--label-file
标志从文件中加载多个标签。用EOL标记分隔文件中的每个标签。以下示例从当前目录中的标签文件中加载标签:
$ docker run --label-file ./labels ubuntu bash
标签文件格式与加载环境变量的格式相似。(与环境变量不同,在容器内运行的进程看不到标签。)以下示例说明了标签文件格式:
您可以通过提供多个--label-file
标志来加载多个标签文件。
当您启动容器时,请使用--network
标志将其连接到网络。这将busybox容器添加到my-net
网络中。
$ docker run -itd --network=my-net busybox
当您在用户定义的网络上启动容器时,您还可以选择带有--ip和--ip6
标志的容器的IP地址。
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox
如果您想向网络添加正在运行的容器,请使用docker network connect子命令。
您可以将多个容器连接到同一网络。连接后,容器只能使用另一个容器的IP地址或名称轻松通信。对于支持多主机连接的overlay网络或自定义插件,连接到同一多主机网络但从不同引擎启动的容器也可以以这种方式通信。
默认网桥接网络上无法发现服务。默认情况下,容器可以通过其IP地址进行通信。要通过姓名进行沟通,必须链接。
您可以使用docker network disconnect
命令断开容器与网络的连接。
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
--volumes-from
标志挂载所引用容器中的所有已定义。容器可以通过重复--volume -from
参数来指定。容器ID后面可以加上“:ro”或“:rw”
,分别以只读或读写方式挂载卷。默认情况下,卷的挂载方式与参考容器相同(可读可写或只读)。
最后
由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
名进行沟通,必须链接。
您可以使用docker network disconnect
命令断开容器与网络的连接。
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
--volumes-from
标志挂载所引用容器中的所有已定义。容器可以通过重复--volume -from
参数来指定。容器ID后面可以加上“:ro”或“:rw”
,分别以只读或读写方式挂载卷。默认情况下,卷的挂载方式与参考容器相同(可读可写或只读)。
最后
由于文章篇幅原因,我只把面试题列了出来,详细的答案,我整理成了一份PDF文档,这份文档还包括了还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 ,帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!