1.docker退出容器但是不关闭容器
Ctrl+P+Q
2.如何批量停止所有的容器
docker stop $(docker ps -q)
注意使用 -q 参数,仅仅输出镜像/容器的ID.
3.容器重启后会IP地址都会改变,查看容器的ID
docker inspect -f '{{.NetworkSettings.IPAddress}}' <CONTAINER>
4.docker exec 与 docker attach区别
docker attach 直接进入容器 启动命令 的终端,不会启动新的进程。
docker exec 则是在容器中打开新的终端,并且可以启动新的进程。
如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
5.docker Engine是什么?
我们平时说的 docker Engine就是docker,docker的架构是C/S架构,开发者通过 docker client 向docker daemon发送请求。
Docker Engine包括这么几个部分:
Docker Daemon — docker 的守护进程,属于C/S中的server。
Docker REST API — docker daemon向外暴露的REST 接口,属于Client。
Docker CLI — docker向外暴露的命令行接口(Command Line API),属于Client。
6.批量删除所有所有退出的容器
docker rm ${docker ps -aq -f status=exited}
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
7.docker中CMD与ENTRYPOINT的使用格式?
shell格式
<instruction> <conmmand>
CMD echo "hello docker"
ENTRYPOINT python "/code/algorithm-start.py"
exec格式
<instruction> ["executable","param1","param2",.....]
CMD ["/bin/bash","hello dicker"]
ENTRYPOINT ["python","/code/algorithm-start.py"]
CMD与ENTRYPOINT都推荐使用exec格式。
8.docker中CMD与ENTRYPOINT的区别?
CMD与ENTRYPOINT都设置的是容器启动时的命令,两者有很大的区别。
CMD是设置容器启动的默认命令,如果使用者在使用容器时设置了容器启动的命令,则CMD执行的命令就失效了,也就是说docker run [IMAGE] /bin/bash 启动[IMAGE]时的 /bin/bash命令会覆盖CMD执行的命令,ENTRYPOINT则不会,ENTRYPOINT是容器启动真正的命令,启动容器时候的命令并不能覆盖ENTRYPOINT执行的命令,docker run 所携带的启动命令或者是参数都会当做 ENTRYPOINT执行命令的参数。还有一个区别就是CMD可以当做ENTRYPOINT执行命令的默认参数。
左边是 start.py 输出传递给它的参数,右边是启动dockerfile文件。制作镜像 test
如果需要把CMD当做ENTRYPOINT的参数,需要把CMD房子ENTRYPOINT的上面。
9.docker容器如何指定静态IP?
只有开发者在使用 --subset 创建的网络才能指定静态IP。
docker network create --driver bridge --subnet 172.25.16.0/24 --gateway 172.25.16.1 my_net2
docker run -it --network=my_net --ip 172.18.0.8 busybox
10.什么是容器技术?
轻量级的操作系统虚拟化解决方案, 能够在Linux系统上迅速创建一个容器(类似于虚拟机)并在容器上部署和运行应用程序,同时还可以通过配置文件轻松将应用程序的自动化安装、部署和升级。
11.容器是基于什么技术的?
基于Linux容器(LXC)技术。
12.改变防护墙状态后,容器无法联网?
firewall开启状态,装docker后(能联网),firewall关闭后,在容器中无法联网,firewall再次打开,在容器中有网。
firewall关闭着,装docker后(能联网),firewall启动(无法联网,无DNS服务),firewall开启后,在容器中无法联网。
在此实验基础上,装docker之前先开启防火墙。
13.直接关闭容器快捷键?
Ctrl+D
14.最近遇到的一个问题:启动nginx的镜像,发现无法打开通过goofys挂载的视频文件,提示无法打开视频,权限不足,在启动镜像时候,已经制定 --privileged=true,还是提示权限不足。
原因是 centos中安全模块把selinux权限禁止了,需要关闭 selinux, 打开 /etc/sysconfig/selinux , 把SELINUX=enforcing 改为 SELINUX=disabled。
15. docker的仓库和仓库注册服务器(registry)
一直以来,我总把仓库和仓库注册器(registry)混为一谈,并不严格区分。实际上仓库注册服务器上往往放着多个仓库,每个仓库中又包含着多个镜像,每个镜像包括多个不同的标签(tag)。仓库分成共有的和私有的。最大的公有仓库是 docker Hub。registry并不是仓库,registry是仓库注册器。标准的镜像名字: 服务器IP:端口/分类/镜像名字:tag 比如:docker.io/yunqianqian/tensorflow-dev-cpu:1.4
16. 查看容器中运行的进程
docker top <ID>/<container name>
17. docker -p -v映射时候,宿主机和容器的位置关系
时间久了就忘记了,其实,-p hostport : containerport -v hostpath : containerpath,记忆的话就是先有宿主机后有容器,所以无论是端口映射还是数据卷挂载都是先是宿主机后是容器。
18.修改docker存储路径
#确定修改文件地址
systemctl enable docker
#增加选项 --graph
--graph <修改的路径>
#重新装在配置
docker daemon-reload
#重启docker
systemctl restart docker
#查看修改是否成功
docker info
19.容器使用了ns技术,我为啥使用命令查看不到呢
这是因为默认docker把创建的网络命名空间链接文件隐藏起来了,导致 ip netns 命令无法读取。
#执行下面的命令来获取容器进程号
docker inspect [container-name] |grep Pid
执行如下命令,将进程网络命名空间恢复到主机目录,
ln -s /proc/[container-pid]/ns/net /var/run/netns/[container]