程序员社区

Docker常见问题整理

Docker常见问题整理

    • 镜像相关
      • 如何批量清理临时镜像文件?
      • 如何查看镜像支持的环境变量?
      • 本地的镜像文件都存放在哪里?
      • 构建 Docker 镜像应该遵循哪些原则?
      • 碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?
    • 容器相关
      • 容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?
      • 如何停止所有正在运行的容器?
      • 如何批量清理已经停止的容器?
      • 如何获取某个容器的 PID 信息?
      • 如何获取某个容器的 IP 地址?
      • 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
      • 如何临时退出一个正在交互的容器的终端,而不终止它?
      • 使用 `docker port` 命令映射容器的端口时,系统报错“Error: No public port '80' published for xxx”?
      • 可以在一个容器中同时运行多个应用进程么?
      • 如何控制容器占用系统资源(CPU、内存)的份额?
  • 如何将一台宿主主机的 Docker 环境迁移到另外一台宿主主机?

镜像相关


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

答:可以使用 docker image prune 命令。


如何查看镜像支持的环境变量?

答:可以使用 docker run IMAGE env 命令。


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

答:与 Docker 相关的本地资源默认存放在 /var/lib/docker/ 目录下,以 overlay2 文件系统为例,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像层文件。


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

答:整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括

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

碰到网络问题,无法 pull 镜像,命令行指定 http_proxy 无效?

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


容器相关


容器退出后,通过 docker container ls 命令查看不到,数据会丢失么?

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


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

答:可以使用 docker stop $(docker container ls -q) 命令。


如何批量清理已经停止的容器?

答:可以使用 docker container prune 命令。


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

答:可以使用

docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>

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

答:可以使用

docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>

如何给容器指定一个固定 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

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

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


使用 docker port 命令映射容器的端口时,系统报错“Error: No public port ‘80’ published for xxx”?

答:

  • 创建镜像时 Dockerfile 要通过 EXPOSE 指定正确的开放端口;
  • 容器启动时指定 PublishAllPort = true

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

答:一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如 supervisord 来管理所运行的进程。可以参考 https://docs.docker.com/config/containers/multi-service_container/ 。


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

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


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

答:停止 Docker 服务。将整个 Docker 存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机的配置即可。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Docker常见问题整理

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区