Docker入门与实战——常见问题总结

常见问题总结

1、镜像相关

1.1、如何备份和恢复系统中所有的镜像?

首先,备份镜像列表到本地文件:

之后,可以导出所有镜像到当前目录:

恢复时,将本地镜像文件导入为Docker镜像:

1.2、如何批量清理临时镜像文件?

可以使用docker rmi $(docker images-q-fdangling=true)命令或docker image prune命令。

1.3、如何删除所有本地镜像?

可以使用docker rmi-f $(docker images-q)命令。如果只是删除没有被使用的镜像,则可以使用docker image prune -a命令。

1.4、如何清理Docker系统中的无用数据?

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

1.5、如何查看镜像内的环境变量?

可以使用docker run IMAGE env命令。

1.6、本地的镜像文件都存放在哪里?

与Docker相关的本地资源(包括镜像、容器)默认存放在/var/lib/docker/目录下。

以aufs文件系统为例,各子目录的作用如下:

  • aufs:存放使用aufs存储驱动的Docker容器镜像的数据。
  • containers:存放容器的元数据信息(例如容器ID、PID等)。
  • image:存放所有本地的Docker镜像,每个镜像使用一个单独的子目录存储。
  • network:存放Docker网络的元数据信息(例如网络ID、IPAM数据等)。
  • overlay2:存放使用overlay2存储驱动的Docker容器镜像的数据。
  • plugins:存放Docker插件的数据。
  • Runtimes:存放使用其他容器运行时的Docker容器镜像的数据。
  • Swarm:存放Docker Swarm模式的数据。

1.7、构建Docker镜像应该遵循哪些原则?

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

  • 最小化原则:尽量选取满足需求但较小的基础系统镜像,并只安装必需的软件。例如,可以选择Alpine镜像,仅有几兆大小。
  • 单一职责:每个镜像应该只负责一个单一的任务,例如运行一个进程或服务。
  • 清理原则:清理中间文件、安装包缓存、变量等临时文件,或使用多阶段构建。
  • 版本管理原则:对于镜像,要定义精确的版本号,安装软件时也要指定精确的版本号。
  • 安全原则:尽量使用系统的库和依赖,避免在镜像中引入密码或过高的访问权限。
  • 可复用原则:尽量使镜像具有可重用性,使镜像可以在不同的部署环境中使用。

1.8、遇到网络问题,无法拉取镜像,在命令行指定http_proxy无效,怎么办?

在Docker配置文件中添加exporthttp_proxy="http://<PROXY_HOST>:<PROXY_PORT>",之后重启Docker服务即可。

2、容器相关

2.1、容器退出后,通过docker ps命令查看不到,数据会丢失吗?

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

2.2、如何停止所有正在运行的容器?

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

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

可以使用docker [container] rm-f $(docker ps-qa)命令,此命令会删除容器中的数据,在生产环境应慎用。

2.4、如何获取某个容器的PID信息?

可以使用docker [container] inspect--format'{``{.State.Pid }}'<CONTAINER ID or NAME>命令获取容器的PID信息。

2.5、如何获取某个容器的IP地址?

可以使用docker[container]inspect--format'{``{.NetworkSettings.IPAddress }}'<CONTAINER ID orNAME>命令获取容器的IP地址。

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

可以使用Docker的网络模式来为容器指定固定的IP地址。

首先,创建一个自定义的Docker网络,例如docker network create--subnet=172.18.0.0/16 mynet。启动容器时,将容器连接到自定义网络,并指定IP地址,例如docker run--net mynet--ip 172.18.0.2-d testimage。

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

按Ctrl-P和Ctrl-Q键。按Ctrl-C键往往会让容器内的应用进程终止,进而会终止容器。

2.8、可以在一个容器中同时运行多个应用进程吗?

可以在一个容器中同时运行多个应用进程,但这并不是推荐的做法。如果有类似需求,可以通过一些额外的进程管理机制,比如supervisord来管理所运行的进程。可以参考https://docs.docker.com/articles/using_supervisord/。

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

可以使用Docker的资源限制来控制容器占用系统资源的份额。在使用docker [container] create命令创建容器或使用docker [container] run命令创建并启动容器时,可以使用-c|-cpu-shares[=0]参数来调整容器使用CPU的权重;使用-m|-memory[=MEMORY]参数来限制容器使用内存的大小,或使用-memory-reservation来保证在内存充足的情况下分配容器的内存量。例如,docker run-d--name testcontainer--cpu-shares 512--memory 1gtestimage。

3、仓库相关

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

仓库是存储Docker镜像的地方,它可以是私有仓库或公共仓库。仓库中可以包含多个镜像。

注册服务器是存放实际的镜像文件的服务器,一个 Docker注册服务器可以有多个仓库。Docker支持自定义注册服务器,如Harbor或Nexus等。

注册索引是用来提供Docker镜像的索引服务,它可以帮助用户快速地查找和获取镜像,另外负责维护用户的账号、权限、搜索、标签等的管理。用户可以使用Clair等实现。

3.2、从非官方仓库(例如non-official-repo.com)下载镜像时,有时会提示"Error:Invalid registry endpointhttps://non-official-repo.com/v1/......,怎么办?

Docker自1.3.0版本之后,加强了对镜像安全性的验证,需要添加私有仓库证书,或者手动添加对非官方仓库的信任。编辑Docker配置文件,在其中添加:

之后重启Docker服务即可。

通过docker info命令可以查看当前的Docker基本配置信息,其中就包括非HTTPS仓库的配置信息:

在生产环境中,推荐使用TLS机制来访问安全仓库。

4、配置相关

4.1、Docker服务的配置文件放在哪里?如何修改配置?

Docker服务配置文件通常位于/etc/docker/daemon.json或/etc/docker/daemon.conf,默认内容可能为:

4.2、如何更改Docker的默认存储位置?

Docker的默认存储位置是/var/lib/docker,如果希望将Docker的本地文件存储到其他分区,可以通过修改配置文件/etc/docker/daemon.json的方式实现:

之后,重启Docker服务即可。

此外,还可以使用Linux软连接的方式来完成,或者在启动daemon时通过-g参数指定。例如,如下操作会将默认存储位置迁移到/storage/docker:

4.3、使用内存和Swap限制启动容器时会显示警告"WARNING:Your kernel does not support cgroupswap limit.WARNING:Your kernel does not supportswap limit capabilities.Limitation discarded."​,怎么办?

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

  • 1)编辑/etc/default/grub文件(以Ubuntu系统为例),配置 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"。
  • 2)更新grub:$ sudo update-grub。
  • 3)重启系统。

5、ocker与虚拟化

5.1、Docker与LXC(Linux Container)有何不同?

Docker和LXC都是Linux容器化技术,但它们的设计和使用方式有所不同。

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

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

5.2、Docker与Vagrant有何不同?

两者的定位完全不同。

Vagrant是一套虚拟机的管理环境,可以在多种系统上和虚拟机软件中运行,启动一个完整的操作系统环境,自身具有较好的包装性和可移植性;Docker则面向应用层隔离,更轻量级,启动和运行性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。

简单地说,Vagrant适合用来管理虚拟机,而Docker适合用来管理应用环境。

5.3、在开发环境中应该如何选择Docker和Vagrant?

Docker是进程隔离,对于资源的消耗更少。Vagrant是虚拟机上做的封装,本身会消耗更多资源。

目前,Docker在Linux和macOS上支持得更好。如果本地使用的Linux环境或macOS,推荐都使用Docker;如果本地使用的是Windows环境,可以考虑用虚拟机获取更一致的体验。

6、 其他

6.1、Docker能在非Linux平台(比如macOS或Windows)上运行吗?

可以。目前,DockerDesktop已经支持Linux、macOS和Windows。

6.2、如何将一台主机上的Docker环境迁移到另外一台主机?

在源主机上停止Docker服务,将所有的镜像和容器文件导出为tar文件,并和配置文件一起复制到目标主机,然后在目标主机上导入这些文件。最后,启动Docker服务即可。注意,这种迁移方法并不包含容器的状态,只包含容器的文件系统和元数据。

6.3、如何进入Docker容器的网络命名空间?

要进入Docker容器的网络命名空间,可以使用nsenter工具。

首先,使用下面的命令查看容器进程PID:

之后,使用nsenter命令进入该容器的网络命名空间:

相关推荐
是jin奥1 小时前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg
丨晨 丨1 小时前
K8s控制器天团图鉴-五大控制器整活
云原生·容器·kubernetes
全栈技术负责人1 小时前
AI 自动化单元测试技术方案
运维·单元测试·自动化
Shadow(⊙o⊙)1 小时前
仿muduo实现高并发服务器——EventLoop.hpp初步设计(未纳入超时管理模块)
运维·服务器
nlp研究牲2 小时前
Linux 常用命令速查手册:英文全称、中文释义、巧记方法与实战示例
linux·运维·php
众壹新能源科技2 小时前
逆变器半夜停机等备件48小时少发10万度电,备件安全库存怎么算
大数据·运维·安全
广州智造2 小时前
Radioss破坏模型FAILJOHNSON (Johnson-cook) 和 FAILTAB1
运维·数据库·自动化·仿真·建模·后处理·前处理
味悲2 小时前
Nginx笔记
linux·运维·笔记·nginx
电商全栈程序猿2 小时前
2026 开源商城系统选型指南:开发者实测对比Tigshop、ShopXO、CRMEB
java·运维·开源