Docker Q&A

镜像相关

  1. 如何批量清理临时镜像文件?
    答:可以使用docker image prune命令。
  2. 如何查看镜像支持的环境变量?
    答:可以使用docker run IMAGE env命令。
  3. 本地的镜像文件都存放在哪里?
    答:与 Docker 相关的本地资源默认存放在/var/lib/docker/目录下,以aufs文件系统为例,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像层文件。
  4. 构建 Docker 镜像应该遵循哪些原则?
    答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括:
    • 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择debian:wheezydebian:stretch镜像,仅有不足百兆大小;
    • 清理编译生成文件、安装包的缓存等临时文件;
    • 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
    • 从安全角度考虑,应用要尽量使用系统的库和依赖;
    • 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
    • 使用 Dockerfile 创建镜像时候要添加.dockerignore文件或使用干净的工作目录。
  5. 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?
    答:在 Docker 配置文件中添加export http_proxy="http://<PROXY_HOST>:<PROXY_PORT>",之后重启 Docker 服务即可。

容器相关

  1. 容器退出后数据还在吗?如何查看?
    答:容器退出后会处于终止(exited)状态,此时可以通过docker container ls -a查看。其中的数据也不会丢失,还可以通过docker start命令来启动它。只有删除掉容器才会清除所有数据。
  2. 如何停止所有正在运行的容器?
    答:可以使用docker stop $(docker container ls -q)命令。
  3. 如何批量清理已经停止的容器?
    答:可以使用docker container prune命令。
  4. 如何获取某个容器的 PID 信息?
    答:可以使用docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>命令。
  5. 如何获取某个容器的 IP 地址?
    答:可以使用docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>命令。
  6. 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
    答:使用以下命令启动容器可以使容器 IP 固定不变:
    $ docker network create -d bridge --subnet 172.25.0.0/16 my-net
    $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
    
  7. 如何临时退出一个正在交互的容器的终端,而不终止它?
    答:按Ctrl-p Ctrl-q。如果按Ctrl-c往往会让容器内应用进程终止,进而会终止容器。
  8. 使用docker port命令映射容器的端口时,系统报错“Error: No public port ‘80’ published for xxx”?
    答:
    • 创建镜像时Dockerfile要通过EXPOSE指定正确的开放端口;
    • 容器启动时指定PublishAllPort = true
  9. 可以在一个容器中同时运行多个应用进程么?
    答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如supervisord来管理所运行的进程。可以参考https://docs.docker.com/config/containers/multi-service_container/。
  10. 如何控制容器占用系统资源(CPU、内存)的份额?
    答:在使用docker create命令创建容器或使用docker run创建并启动容器的时候,可以使用-c|—cpu-shares[=0]参数来调整容器使用 CPU 的权重;使用-m|—memory[=MEMORY]参数来调整容器使用内存的大小。

仓库相关

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

配置相关

  1. Docker 的配置文件放在哪里,如何修改配置?
    答:使用systemd的系统(如 Ubuntu 16.04、Centos 等)的配置文件在/etc/docker/daemon.json
  2. 如何更改 Docker 的默认存储位置?
    答:Docker 的默认存储位置是/var/lib/docker,如果希望将 Docker 的本地文件存储到其他分区,可以使用 Linux 软连接的方式来完成,或者在启动 daemon 时通过-g参数指定,或者修改配置文件/etc/docker/daemon.json的 “data-root” 项 。可以使用docker system info | grep "Root Dir"查看当前使用的存储位置。
    例如,如下操作将默认存储位置迁移到 /storage/docker
[root@s26~]#df-h
FilesystemSizeUsedAvailUse%Mountedon
/dev/mapper/VolGroup-lv_root50G5.3G42G12%/
tmpfs48G228K48G1%/dev/shm
/dev/sda1485M40M420M9%/boot
/dev/mapper/VolGroup-lv_home222G188M210G1%/home
/dev/sdb22.7T323G2.3T13%/storage
[root@s26~]#service docker stop
[root@s26~]#cd/var/lib/
[root@s26 lib]#mv docker/storage/
[root@s26 lib]#ln-s/storage/docker/docker
[root@s26 lib]#ls-la docker
lrwxrwxrwx.1root root1511月1713:43docker->/storage/docker
[root@s26 lib]#service docker start
  1. 使用内存和 swap 限制启动容器时候报警告:”WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.”?
    答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
    • 编辑/etc/default/grub文件(Ubuntu 系统为例),配置GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    • 更新 grub:$ sudo update-grub
    • 重启系统,即可。

Docker 与虚拟化

  1. Docker 与 LXC(Linux Container)有何不同?
    答:LXC 利用 Linux 上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:
    • 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;
    • 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
    • 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
    • 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
    • 周边工具:各种现有工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker的 PaaS、CI 等系统,让 Docker 的应用更加方便和多样化。
  2. Docker 与 Vagrant 有何不同?
    答:两者的定位完全不同。
    Vagrant类似Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管理环境。Vagrant可以在多种系统上和虚拟机软件中运行,可以在 Windows,Mac 等非 Linux 平台上为 Docker 提供支持,自身具有较好的包装性和移植性。
    原生的 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
    简单说:Vagrant适合用来管理虚拟机,而 Docker 适合用来管理应用环境。
  3. 开发环境中 Docker 和 Vagrant 该如何选择?
    答:Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,但是目前需要 Linux 环境支持。Vagrant是虚拟机上做的封装,虚拟机本身会消耗资源。
    如果本地使用的 Linux 环境,推荐都使用 Docker。
    如果本地使用的是 macOS 或者 Windows 环境,那就需要开虚拟机,单一开发环境下Vagrant更简单;多环境开发下推荐在Vagrant里面再使用 Docker 进行环境隔离。

其它

  1. Docker 能在非 Linux 平台(比如 Windows 或 macOS )上运行么?
    答:完全可以。
  2. 如何将一台宿主主机的 Docker 环境迁移到另外一台宿主主机?
    答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。
  3. 如何进入 Docker 容器的网络命名空间?
    答:Docker 在创建容器后,删除了宿主主机上/var/run/netns目录中的相关的网络命名空间文件。因此,在宿主主机上是无法看到或访问容器的网络命名空间的。
    用户可以通过如下方法来手动恢复它。
    • 首先,使用下面的命令查看容器进程信息,比如这里的 1234。
      $ docker inspect--format='{{. State.Pid}} '$container_id
      1234
      
    • 接下来,在/proc目录下,把对应的网络命名空间文件链接到/var/run/netns目录。
      $ sudo ln-s/proc/1234/ns/net/var/run/netns/
      
    • 然后,在宿主主机上就可以看到容器的网络命名空间信息。例如
      $ sudo ip netns show
      1234
      
    • 此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为172.17.0.100/16
      $ sudo ip netns exec1234ifconfig eth0172.17.0.100/16
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值