Docker——常见问题总结

镜像相关

1. 如何备份系统中所有的镜像

首先,备份镜像列表可以使用
docker images|awk 'NR>1{print $1":"$2}'|sort > images.list

导出所有镜像为当前目录下文件,可以使用如下命令:

while read img; do
	echo $img
	file="${img/\//-}"
	sudo docker save --output $file.tar $img
done < images.list

将本地镜像文件导入为Docker镜像:

while read img; do
	echo $img
	file="${img/\//-}"
	dokcer load < $file.tar
done < images.list

2. 如何批量清理临时镜像文件

docker rmi $(docker images -q -f dangling=true)

3. 如何删除所有本地的镜像

docker rmi -f $(docker images -q)

4. 如何清理Docker系统中的无用数据

docker system prune --volumes -f
这个命令会自动清理处于停止状态的容器、无用的网络和挂载卷、临时镜像和创建镜像缓存。

5. 如何查看镜像内的环境变量

docker run IMAGE env 命令。

6.本地的镜像文件都存放在哪里

与Docker相关的本地资源(包括镜像、容器)默认存放在/var/lib/docker/目录下。以aufs文件系统为例,其中 container 目录存放容器信息, graph目录存放镜像信息,aufs目录下存放具体的镜像层文件。

7.构建Docker镜像应该遵循哪些原则

整体原则上,尽量保持镜像功能的明确和内容的精简,避免添加额外文件和操作步骤,要点包括:

  • 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择debian:wheezy或debian:jessie镜像,仅有不足百兆大小;
  • 清理编译生成文件、安装包的缓存等临时文件;
  • 安装各个软件时候要指定准确的版本号,并避免引人不需要的依赖;
  • 从安全角度考虑,应用要尽量使用系统的库和依赖;
  • 如果安装应用时候需要配置–些特殊的环境变量,在安装后要还原不需要保持的变量值;
  • 使用Dockerfile创建镜像时候要添加.dockerignore 文件或使用干净的工作目录;
  • 区分编译环境容器和运行时环境容器,使用多阶段镜像创建。

8.碰到网络问题,无法pull镜像,命令行指定http_ proxy 无效,怎么办

在Docker 配置文件中添加

export http_ _proxy="http: //<PROXY_ _HOST>:<PROXY_ PORT>"

之后重启Docker服务即可。

容器相关

1.容器退出后,通过docker ps命令查看不到,数据会丢失么

容器退出后会处于终止( exited)状态,此时可以通过docker ps -a 查看。其中的数据也不会丢失,还可以通过docker [container] start 命令来启动它。只有删除掉容器才会清除所有数据。

2.如何停止所有正在运行的容器?

可以使用docker [container] stop $ (docker ps -q)命令。

3.如何批量清理所有的容器,包括处于运行状态和停止状态的

可以使用docker [container] rm -f $(docker ps -qa) 命令。

4.如何获取某个容器的PID信息?

可以使用docker [container] inspect -- format '{ { . State.Pid }} '<CONTAINER ID or NAME>命令。

5.如何获取某个容器的IP地址

可以使用docker [container] inspect --format ' { { .NetworkSettings.IPAddress }} ' <CONTAINER ID or NAME> 命令。

6.如何给容器指定一个固定IP地址,而不是每次重启容器时IP地址都会变

目前Docker并没有提供直接的对容器IP地址的管理支持,用户可以参考本书第三部的第20章“高级网络配置”中介绍的创建点对点连接例子,来手动配置容器的静态IP。或者在启动容器后,再手动进行修改(参考后面“其他类”的问题“如何进人Docker容器的网络命名空间?”)。

7.如何临时退出一个正在交互的容器的终端,而不终止它

按Ctrl-p Ctrl-q。 如果按Ctrl-c往往会让容器内应用进程终止,进而会终止容器。

8.可以在一个容器中同时运行多个应用进程么

一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如supervisord,来管理所运行的进程。

9.如何控制容器占用系统资源(CPU、内存)的份额

在使用docker [container] create 命令创建容器或使用docker [container] run 创建并启动容器的时候,可以使用-c|-cpu-shares[=0]参数来调整容器使用CPU的权重;使用-m|-memory [=MEMORY]参数来调整容器使用内存的大小。

仓库相关

1.仓库( Repository)、注册服务器(Registry)、 注册索引(Index )有何关系

仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。

2.从非官方仓库(例如non-official-repo.com)下载镜像时候,有时候会提示“Error:Invalid registry endpoint https://non-official-repo.com…”怎么办

Docker 自1.3.0 版本往后,加强了对镜像安全性的验证,需要添加私有仓库证书,或者手动添加对非官方仓库的信任。编辑Docker配置文件,在其中添加:DOCKER_ _OPTS="-- insecure- registry non-official-repo"之后,重启Docker服务即可。

配置相关

1. Docker的配置文件放在哪里,如何修改配置

使用upstart的系统(如Ubuntu 16.04) 的配置文件在/etc/default/docker,使用systemd的系统(如Ubuntu 16.04、Centos 等)的配置文件在/etc/systemd/system/docker.service.d/docker.conf

Ubuntu下面的配置文件内容如下,可以参考配置(如果出现该文件不存在的情况,重启或者自己新建一个文件都可以解决):
在这里插入图片描述

2.如何更改Docker的默认存储位置

Docker的默认存储位置是/var/lib/docker,如果希望将Docker 的本地文件存储到其他分区,可以使用Linux软连接的方式来完成,或者在启动daemon时通过-g参数指定。
例如,如下操作将默认存储位置迁移到/storage/docker:
在这里插入图片描述

3.使用内存和swap限制启动容器时候报警告:“WARNING:Yourkerneldoesnotsupport cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities.Limitation discarded.",怎么办

答:这是因为系统默认没有开启对内存和swap使用的统计功能,引人该功能会带来性能的下降。要开启该功能,可以采取如下操作:

1 )编辑/etc/default/grub文件(Ubuntu系统为例),配置GRUB_ _CMDLINE_ LINUX=" cgroup- enabl e=memory swapaccount=1";
2)更新grub: $ sudo update-grub;
3)重启系统即可。

Docker与虚拟化

1. Docker与LXC (Linux Container )有何不同

LXC利用Linux上相关技术实现了容器支持; Docker早期版本中使用了LXC技术,后期演化为新的libcontainer, 在如下的几个方面进行了改进:

  • 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
  • 镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
  • 版本管理:类似于Git的版本管理理念,用户可以更方便地创建、管理镜像文件;0仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
  • 周边工具:各种现有工具(配置管理、云平台)对Docker的支持,以及基于Docker的PaaS、CI 等系统,让Docker的应用更加方便和多样化。

2. Docker与Vagrant有何不同?

两者的定位完全不同。

  • Vagrant是一套虚拟机的管理环境。Vagrant 可以在多种系统上和虚拟机软件中运行,启动一个完整的操作系统环境,可以在Windows、Mac等非Linux平台上为Docker提供支持,自身具有较好的包装性和移植性。Docker则面向应用层隔离,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
  • 简单说:Vagrant适合用来管理虛拟机,而Docker适合用来管理应用环境。

3.开发环境中Docker和Vagrant该如何选择?

Docker不是虚拟机,而是进程隔离,对于资源的消耗很少。Vagrant是虚拟机上做的封装,虚拟机本身会消耗更多资源。
如果本地使用的Linux环境或macOS,推荐都使用Docker;如果本地使用的是Windows环境,可以考虑用虚拟机获取一致 的体验。

其他

1. Docker能在非Linux平台(比如macOS或Windows) .上运行么?

可以。macOS目前需要使用dockerformac等软件创建-个轻量级的Linux虛拟机层。由于成熟度不高,暂时不推荐在Windows环境中使用Docker。

2.如何将一台宿主主机的Docker环境迁移到另外一台宿主主机?

停止Docker服务。将整个Docker存储文件夹(如默认的/var/lib/docker) 复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。

3.如何进入Docker容器的网络命名空间?

Docker 在创建容器后,删除了宿主主机上/var/ run/netns目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。用户可以通过如下方法来手动恢复它:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/cold___play/article/details/108255259