Docker 基础知识

Docker

  1. Docker 和虚拟机有啥不同?
    答:Docker 是轻量级的沙盒,在其中运行的只是应用,虚拟机里面还有额外的系统。
  2. Docker 安全么?
    答:Docker 利用了 Linux 内核中很多安全特性来保证不同容器之间的隔离,并且通 过签名机制来对镜像进行验证。大量生产环境的部署证明,Docker 虽然隔离性无法与 虚拟机相比,但仍然具有极高的安全性。
  3. 如何清理后台停止的容器?
    答:可以使用 sudo docker rm $sudo( docker ps -a -q) 命令。
  4. 如何查看镜像支持的环境变量?
    答:可以使用 docker run IMAGE env 命令。
  5. 当启动容器的时候提示:exec format error?如何解决问题
    答:检查启动命令是否有可执行权限,进入容器手工运行脚本进行排查。
  6. 本地的镜像文件都存放在哪里?
    答:与 Docker 相关的本地资源都存放在/var/lib/docker/目录下,其中 container 目 录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的内容文件。
  7. 如何退出一个镜像的 bash,而不终止它?
    答:按 Ctrl-p Ctrl-q。
  8. 退出容器时候自动删除?
    答:使用 –rm 选项,例如 sudo docker run –rm -it ubuntu
  9. 怎么快速查看本地的镜像和容器?
    答:可以通过 docker images 来快速查看本地镜像;通过 docker ps -a 快速查看本 地容器。

镜像相关

  1. 如何批量清理临时镜像文件?
    答:可以使用 sudo docker rmi $(sudo docker images -q -f danging=true)命令
  2. 如何查看镜像支持的环境变量?
    答:使用 sudo docker run IMAGE env
  3. 本地的镜像文件都存放在哪里
    答:于 Docker 相关的本地资源存放在/var/lib/docker/目录下,其中 container 目录 存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像底层文件。
  4. 构建 Docker 镜像应该遵循哪些原则?
    答:整体远侧上,尽量保持镜像功能的明确和内容的精简,要点包括: l 尽量选取满足需求但较小的基础系统镜像,建议选择 debian:wheezy 镜像,仅有 86MB 大小 l 清理编译生成文件、安装包的缓存等临时文件 l 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖 l 从安全的角度考虑,应用尽量使用系统的库和依赖 l 使用 Dockerfile 创建镜像时候要添加.dockerignore 文件或使用干净的工作目录 容器相关
  5. 容器退出后,通过 docker ps 命令查看不到,数据会丢失么?
    答:容器退出后会处于终止(exited)状态,此时可以通过 docker ps -a 查看,其中 数据不会丢失,还可以通过 docker start 来启动,只有删除容器才会清除数据。
  6. 如何停止所有正在运行的容器?
    答:使用 docker kill $(sudo docker ps -q)
  7. 如何清理批量后台停止的容器?
    答:使用 docker rm $(sudo docker ps -a -q)
  8. 如何临时退出一个正在交互的容器的终端,而不终止它?
    答:按 Ctrl+p,后按 Ctrl+q,如果按 Ctrl+c 会使容器内的应用进程终止,进而会使 容器终止。
  9. 很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
    答:使用 docker logs,后面跟容器的名称或者 ID 信息
  10. 使用 docker port 命令映射容器的端口时,系统报错 Error: No public port ‘80’
    published for …,是什么意思?
    答:创建镜像时 Dockerfile 要指定正确的 EXPOSE 的端口,容器启动时指定 PublishAllport=true
  11. 可以在一个容器中同时运行多个应用进程吗?
    答:一般不推荐在同一个容器内运行多个应用进程,如果有类似需求,可以通过额外 的进程管理机制,比如 supervisord 来管理所运行的进程
  12. 如何控制容器占用系统资源(CPU,内存)的份额?
    答:在使用 docker create 命令创建容器或使用 docker run 创建并运行容器的时候, 可以使用-c|–cpu-shares[=0]参数来调整同期使用 CPU 的权重,使用-m|–memory 参数来调整容器使用内存的大小。

仓库相关

  1. 仓库(Repository)、注册服务器(Registry)、注册索引(Index)有何关系?
    答:首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像,注 册服务器是存放实际的镜像的地方,注册索引则负责维护用户的账号,权限,搜索, 标签等管理。注册服务器利用注册索引来实现认证等管理。
  2. 从非官方仓库(如:http://dl.dockerpool.com)下载镜像的时候,有时候会提 示“Error:Invaild registry endpoint https://dl.docker.com:5000/v1/…”?
    答:Docker 自 1.3.0 版本往后以来,加强了对镜像安全性的验证,需要手动添加对非 官方仓库的信任。 DOCKER_OPTS=”–insecure-registry dl.dockerpool.com:5000” 重启 docker 服务

配置相关

  1. Docker 的配置文件放在那里。如何修改配置?
    答:Ubuntu 系统下 Docker 的配置文件是/etc/default/docker,CentOS 系统配置 文件存放在/etc/sysconfig/docker
  2. 如何更改 Docker 的默认存储设置?
    答:Docker 的默认存放位置是/var/lib/docker,如果希望将 Docker 的本地文件存储 到其他分区,可以使用 Linux 软连接的方式来做。

Docker 与虚拟化

  1. Docker 与 LXC(Linux Container)有何不同?
    答:LXC 利用 Linux 上相关技术实现容器,Docker 则在如下的几个方面进行了改进: l 移植性:通过抽象容器配置,容器可以实现一个平台移植到另一个平台; l 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时共同的 镜像层只需要存储一份,实现高效率的存储; l 版本管理:类似于 GIT 的版本管理理念,用户可以更方面的创建、管理镜像文件; l 仓库系统:仓库系统大大降低了镜像的分发和管理的成本; l 周边工具:各种现有的工具(配置管理、云平台)对 Docker 的支持,以及基于 Docker 的 Pass、CI 等系统,让 Docker 的应用更加方便和多样化。
  2. Docker 与 Vagrant 有何不同?
    答:两者的定位完全不同 Vagrant 类似于 Boot2Docker(一款运行 Docker 的最小内核),是一套虚拟机的管 理环境,Vagrant 可以在多种系统上和虚拟机软件中运行,可以在 Windows。Mac 等非 Linux 平台上为 Docker 支持,自身具有较好的包装性和移植性。 原生 Docker 自身只能运行在 Linux 平台上,但启动和运行的性能都比虚拟机要快, 往往更适合快速开发和部署应用的场景。
  3. 开发环境中 Docker 与 Vagrant 该如何选择?
    答:Docker 不是虚拟机,而是进程隔离,对于资源的消耗很少,单一开发环境下 Vagrant 是虚拟机上的封装,虚拟机本身会消耗资源。 Other FAQ
  4. Docker 能在非 Linux 平台(Windows+MacOS)上运行吗?
    答:可以
  5. 如何将一台宿主机的 docker 环境迁移到另外一台宿主机?
    答:停止 Docker 服务,将整个 docker 存储文件复制到另外一台宿主机上,然后调整 另外一台宿主机的配置即可
  6. Docker 容器创建后,删除了/var/run/netns 目录下的网络名字空间文件,可以
    手动恢复它:
    答:查看容器进程 ID,比如 1234 sudo docker inspect --format='{{. State.pid}}' $container_id 1234 # 到 proc 目录下,把对应的网络名字空间文件链接到 /var/run/netns,然后通过正常的系统命令查看操作容器的名字空间。
  7. 什么Docker
    Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。

    Docker与虚拟机有何不同
    Docker不是虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用LXC驱动程序,然后移动到libcontainer现在重命名为runc。Docker主要专注于在应用程序容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则设计为运行多个进程,如虚拟机。因此,Docker被视为容器化系统上的容器管理或应用程序部署工具。
    A 容器不需要引导操作系统内核,因此可以在不到一秒的时间内创建容器。此功能使基于容器的虚拟化比其他虚拟化方法更加独特和可取。
    B 由于基于容器的虚拟化为主机增加了很少或没有开销,因此基于容器的虚拟化具有接近本机的性能。
    C 对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。
    D 主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。
    E 与虚拟机映像相比,容器状态(Docker或LXC映像)的大小很小,因此容器映像很容易分发。
    F 容器中的资源管理是通过cgroup实现的。Cgroups不允许容器消耗比分配给它们更多的资源。虽然主机的所有资源都在虚拟机中可见,但无法使用。这可以通过在容器和主机上同时运行top或htop来实现。所有环境的输出看起来都很相似。

    什么是Docker镜像
    Docker镜像是Docker容器的源代码,Docker镜像用于创建容器。使用build命令创建镜像。

    什么是Docker容器
    Docker容器包括应用程序及其所有依赖项,作为操作系统的独立进程运行。

    Docker容器有几种状态
    四种状态:运行、已暂停、重新启动、已退出。

    Dockerfile中最常见的指令是什么
    FROM:指定基础镜像
    LABEL:功能是为镜像指定标签
    RUN:运行指定的命令
    CMD:容器启动时要运行的命令

    Dockerfile中的命令COPY和ADD命令有什么区别
    COPY与ADD的区别COPY的SRC只能是本地文件,其他用法一致

    docker常用命令
    docker pull 拉取或者更新指定镜像
    docker push 将镜像推送至远程仓库
    docker rm 删除容器
    docker rmi 删除镜像
    docker images 列出所有镜像
    docker ps 列出所有容器

    容器与主机之间的数据拷贝命令
    docker cp 命令用于容器与主机之间的数据拷贝
    主机到容器:
    docker cp /www 96f7f14e99ab:/www/
    容器到主机:
    docker cp 96f7f14e99ab:/www /tmp/

    启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令
    docker run -d -P --name nginx2 -v /home/nginx:/usr/share/nginx/html nginx

    解释一下dockerfile的ONBUILD指令
    当镜像用作另一个镜像构建的基础时,ONBUILD指令向镜像添加将在稍后执行的触发指令。如果要构建将用作构建其他镜像的基础的镜像(例如,可以使用特定于用户的配置自定义的应用程序构建环境或守护程序),这将非常有用。

    什么是Docker Swarm
    Docker Swarm是Docker的本机群集。它将Docker主机池转变为单个虚拟Docker主机。Docker Swarm提供标准的Docker API,任何已经与Docker守护进程通信的工具都可以使用Swarm透明地扩展到多个主机。

    如何在生产中监控Docker
    Docker提供docker stats和docker事件等工具来监控生产中的Docker。我们可以使用这些命令获取重要统计数据的报告。
    Docker统计数据:当我们使用容器ID调用docker stats时,我们获得容器的CPU,内存使用情况等。它类似于Linux中的top命令。
    Docker事件:Docker事件是一个命令,用于查看Docker守护程序中正在进行的活动流。
    一些常见的Docker事件是:attach,commit,die,detach,rename,destroy等。我们还可以使用各种选项来限制或过滤我们感兴趣的事件

    Docker如何在非Linux系统中运行容器
    通过添加到Linux内核版本2.6.24的名称空间功能,可以实现容器的概念。容器将其ID添加到每个进程,并向每个系统调用添加新的访问控制检查。它由clone()系统调用访问,该调用允许创建先前全局命名空间的单独实例。
    如果由于Linux内核中可用的功能而可以使用容器,那么显而易见的问题是非Linux系统如何运行容器。Docker for Mac和Windows都使用Linux VM来运行容器。Docker Toolbox用于在Virtual Box VM中运行容器。但是,最新的Docker在Windows中使用Hyper-V,在Mac中使用Hypervisor.framework。

### Docker 基础知识概述 #### 容器与传统虚拟化的区别 传统的虚拟化技术依赖于完整的操作系统实例运行,每次创建新环境都需要数天时间来准备硬件资源。相比之下,Docker 的容器化解决方案仅需几秒钟即可完成相同的工作[^2]。 #### 主要优势 由于不需要启动整个操作系统,Docker 可以显著减少部署时间和资源消耗。这种效率提升使得 Google 和 Facebook 等大型互联网公司能够更灵活地管理和扩展其基础设施。此外,在数据中心内部署和撤销资源变得更加便捷高效,减少了因重启造成的停机成本,并提高了服务器的整体利用率至远超常规水平。 #### 关键命令介绍 对于初学者来说,掌握一些基本的 Docker CLI (命令行界面) 是非常重要的: - **查看本地镜像列表** 使用 `docker images` 来展示当前机器上已有的所有 Docker 镜像信息[^1]。 - **搜索远程仓库中的镜像** 如果想要查找特定的应用程序或服务对应的官方镜像,则可以通过执行 `docker search <关键词>` 实现快速定位所需资源。 - **下载镜像到本地** 当找到合适的镜像后,便可以利用 `docker pull <镜像名称>` 将它拉取下来以便后续使用。 - **基于现有镜像启动容器** 创建并启动一个新的容器实例可通过如下指令实现:`docker run -d --name my_container_name <image_name>`, 这里 `-d` 参数表示以后台模式运行容器;`--name` 后面跟的是给定的名字用于区分不同的容器实体[^4]。 - **构建自定义镜像** 若要定制专属的服务版本或者应用组合,可编写一份名为 Dockerfile 的配置文件描述所需的软件栈结构,之后借助 `docker build -t <tagged_image_name> .` 构建出独一无二的新镜像[^3]。 ```bash # 示例:从 Nginx 开始制作一个简单的 Web 应用镜像 FROM nginx RUN echo 'hello, docker!' > /usr/share/nginx/html/index.html ``` 上述脚本展示了如何修改默认页面内容为 "hello, docker!" 并保存在一个新的 NGINX 映像中。 #### 提交更改后的镜像到公共/私有注册中心 一旦完成了个性化设置或是开发测试工作流结束时,就可以考虑把成果分享出去供他人重复利用。此时只需调用 `docker push <repository_url>/<namespace>:<version_tag>` 即可上传至目标位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农汉子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值