试题内容
1.docker的exec与attach命令有啥区别?attach
开启一个和正在运行的进程交互的终端,如果该进程结束,原docker container的进程也会结束。exec
可以开启多个终端实例,exec -i /bin/bash
,由此可见exec其实是在运行中的容器中执行一个命令。
2.docker的CMD与ENTRYPOINT命令有啥区别?CMD
的命令会被docker run
里的命令覆盖,而ENTRYPOINT
命令不会。
如果要覆盖ENTRYPOINT
,则在docker run
里添加--entrypoint
标签来覆盖即可。
如果dockerfile里指定了WORKDIR
,那么无论是CMD
还是ENTRYPOINT
命令都是在这个WORKDIR目录里执行。
3.docker的kill和stop命令有啥区别?
stop是“优雅退出”,先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。
kill是“暴力退出”,即发送SIGKILL信号,应用程序直接退出。
4.假设有一个AAA的容器,现在需要备份它的挂载卷/DATA里的数据,请问如何操作?
1
docker run --volumes-form A -v /tmp:/backup --name BACKUP ubuntu tar cvf /backup/A.tar /DATA
上面这个语句新建立一个叫BACKUP的容器,它与A容器挂载情况相同(即都是挂载/DATA),同时将本地的/tmp挂载到容器的/backup,在容器生成的时候,执行了tar cvf /backup/A.tar /DATA
将DATA文件夹的内容进行了打包,又由于/tmp已经与/backup挂载,所以就可以直接从宿主机上的/tmp里得到A.tar了。
4.linux里删除某个用户的所有进程的语句?
ps -u username | grep -v PID | awk ‘{print$1}’| xargs kill -9
或者killall -u username
5.linux如何彻底删除一个用户?
userdel -r zhidao(前提是这个用户下已经没有程序运行了)
6.杀死某进程的命令?
ps -ef |grep 进程名 |grep -v grep|awk ‘{print $2}’|xargs kill -9
注意!这里awk后面是单引号不是双引号
7.普通用户如何访问docker?
使用gpasswd -a lcshop docker
把该用户添加到docker组即可。
8.输入ping IP后敲回车,发包前会发生什么?
首先要知道,ICMP协议是三层(网络层协议),因为不带端口所以肯定不是四层,又因为依赖IP地址所以肯定比2层高。
其次ping可以帮我们了解到是否能够与对方连通,但是ping如果能不开就不开,因为网络上会有无聊的人给你发大量的ping包把你的带宽占满。
回到题目中,假设是下图中的A在ping B:
回车之后,主机A就要封装二层报文,它会先查自己的MAC地址表,如果没有B的MAC地址,就会向外发送一个ARP广播包。交换机会收到这个报文后,由于交换机有学习MAC地址的功能,所以他会检索自己有没有保存主机B的MAC,如果有,就直接返回给主机A;如果没有,就会向所有端口发送ARP广播,其它主机收到后,发现不是在找自己,就纷纷丢弃了该报文,不去理会。直到主机B收到了报文后,就立即响应,我的MAC地址是多少,同时它也学到主机A的MAC地址,并按同样的ARP报文格式返回给主机A,这时候主机A学到了主机B的MAC,就把B的MAC地址封装到ICMP包中,向主机B发送一个回显请求,主机B收到该报文后,知道是主机A的一个回显请求,就会返回一个相同格式的报文。这样就完成了同一个网段的Ping的过程。
如果主机A要ping主机C,那么主机A发现主机C的IP和自己不是同一网段,它就去找网关转发,但是它也不知道网关的MAC情况下呢?就会像之前那个步骤一样:先发送一个ARP广播,学到网关的MAC,再发封装ICMP报文给网关路由器。当路由器收到主机A发过来的ICMP报文,发现自己的目的地址是其本身MAC地址,根据目的的IP2.1.1.1查路由表,发现2.1.1.1/24的路由表项,得到一个出口指针,去掉原来的MAC头部加上自己的MAC地址向主机C转发。如果网关也没有主机C的MAC地址,还是要向前面一个步骤一样,ARP广播一下即可相互学到。路由器2端口能学到主机D的MAC,主机D也能学到路由器2端口的MAC。最后,在主机C已学到路由器2端口MAC,路由器2端口转发给路由器1端口,路由1端口学到主机A的MAC的情况下,他们就不需要再做ARP解析,就将ICMP的回显请求回复过来。
9.MySQL的数据如何恢复到任意时间点?
10.假设有一个dockerfile内容如下:
1
2
3FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
然后凭借此dockerfile创建一个镜像,然后docker run -it --rm --name test 镜像名称 -H
的实际结果是什么?
实际执行结果是相当于执行top -b -H
,没有-c
。因为使用exec格式(只能加双引号),在docker run <image>
的所有参数,都会追加到ENTRYPOINT
之后,并且会覆盖CMD
所指定的参数。CMD与ENTRYPOINT一样,如果dockerfile有多个的话,只有最后一个生效。
11.假设有一个dockerfile A内容如下:
1
2ENV name Cloud Man
ENTRYPOINT ["/bin/echo", "Hello, $name"]
还有一个B dockerfile内容如下:
1
2ENV name Cloud Man
ENTRYPOINT echo "Hello, $name"
请问两者分别运行容器结果是啥?
A是Hello, $name
,B是Hello, Cloud Man
。A的环境变量并没有达到效果,如果想要达到效果,应该改成如下:
1
2ENV name Cloud Man
ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]
参考资料
https://stackoverflow.com/questions/30960686/difference-between-docker-attach-and-docker-exec
http://dockone.io/question/469
https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/RUN_vs_CMD_vs_ENTRYPOINT_%E6%AF%8F%E5%A4%A95%E5%88%86%E9%92%9F%E7%8E%A9%E8%BD%AC_Docker_%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF_17?lang=en
https://c.isme.pub/2018/07/11/python-interview/