2016-12-10 17:00:25 +08:00
# 常 见 问 题 总 结
# # 镜 像 相 关
2017-11-24 00:29:51 +08:00
# # # 如 何 批 量 清 理 临 时 镜 像 文 件 ?
答 : 可 以 使 用 ` docker image prune ` 命 令 。
2016-12-10 17:00:25 +08:00
# # # 如 何 查 看 镜 像 支 持 的 环 境 变 量 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 可 以 使 用 ` docker run IMAGE env ` 命 令 。
# # # 本 地 的 镜 像 文 件 都 存 放 在 哪 里 ?
2017-11-24 00:29:51 +08:00
2020-03-04 11:50:59 +08:00
答 : 与 Docker 相 关 的 本 地 资 源 默 认 存 放 在 ` /var/lib/docker/ ` 目 录 下 , 以 ` overlay2 ` 文 件 系 统 为 例 , 其 中 ` containers ` 目 录 存 放 容 器 信 息 , ` image ` 目 录 存 放 镜 像 信 息 , ` overlay2 ` 目 录 下 存 放 具 体 的 镜 像 层 文 件 。
2016-12-10 17:00:25 +08:00
# # # 构 建 Docker 镜 像 应 该 遵 循 哪 些 原 则 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 整 体 原 则 上 , 尽 量 保 持 镜 像 功 能 的 明 确 和 内 容 的 精 简 , 要 点 包 括
2020-03-10 13:39:27 +08:00
* 尽 量 选 取 满 足 需 求 但 较 小 的 基 础 系 统 镜 像 , 例 如 大 部 分 时 候 可 以 选 择 ` alpine ` 镜 像 , 仅 有 不 足 六 兆 大 小 ;
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
* 清 理 编 译 生 成 文 件 、 安 装 包 的 缓 存 等 临 时 文 件 ;
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
* 安 装 各 个 软 件 时 候 要 指 定 准 确 的 版 本 号 , 并 避 免 引 入 不 需 要 的 依 赖 ;
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
* 从 安 全 角 度 考 虑 , 应 用 要 尽 量 使 用 系 统 的 库 和 依 赖 ;
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
* 如 果 安 装 应 用 时 候 需 要 配 置 一 些 特 殊 的 环 境 变 量 , 在 安 装 后 要 还 原 不 需 要 保 持 的 变 量 值 ;
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
* 使 用 Dockerfile 创 建 镜 像 时 候 要 添 加 . dockerignore 文 件 或 使 用 干 净 的 工 作 目 录 。
2019-01-06 09:50:03 +08:00
更 多 内 容 请 查 看 [ Dockerfile 最 佳 实 践 ] ( . . / best_practices . md )
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
# # # 碰 到 网 络 问 题 , 无 法 pull 镜 像 , 命 令 行 指 定 http_proxy 无 效 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 在 Docker 配 置 文 件 中 添 加 ` export http_proxy="http://<PROXY_HOST>:<PROXY_PORT>" ` , 之 后 重 启 Docker 服 务 即 可 。
# # 容 器 相 关
2017-11-24 00:29:51 +08:00
2018-01-15 22:00:53 +08:00
# # # 容 器 退 出 后 , 通 过 docker container ls 命 令 查 看 不 到 , 数 据 会 丢 失 么 ?
2017-11-24 00:29:51 +08:00
2018-01-15 22:00:53 +08:00
答 : 容 器 退 出 后 会 处 于 终 止 ( exited ) 状 态 , 此 时 可 以 通 过 ` docker container ls -a ` 查 看 。 其 中 的 数 据 也 不 会 丢 失 , 还 可 以 通 过 ` docker start ` 命 令 来 启 动 它 。 只 有 删 除 掉 容 器 才 会 清 除 所 有 数 据 。
2016-12-10 17:00:25 +08:00
2017-11-24 00:29:51 +08:00
# # # 如 何 停 止 所 有 正 在 运 行 的 容 器 ?
2018-12-13 18:43:55 +08:00
答 : 可 以 使 用 ` docker stop $(docker container ls -q) ` 命 令 。
2016-12-10 17:00:25 +08:00
2017-11-24 00:29:51 +08:00
# # # 如 何 批 量 清 理 已 经 停 止 的 容 器 ?
答 : 可 以 使 用 ` docker container prune ` 命 令 。
2016-12-10 17:00:25 +08:00
# # # 如 何 获 取 某 个 容 器 的 PID 信 息 ?
2017-11-24 00:29:51 +08:00
2019-10-29 14:31:45 +08:00
答 : 可 以 使 用
` ` ` bash
docker inspect -- format ' { { . State . Pid } } ' < CONTAINER ID or NAME >
` ` `
2016-12-10 17:00:25 +08:00
# # # 如 何 获 取 某 个 容 器 的 IP 地 址 ?
2017-11-24 00:29:51 +08:00
2019-10-29 14:31:45 +08:00
答 : 可 以 使 用
` ` ` bash
docker inspect -- format ' { { . NetworkSettings . IPAddress } } ' < CONTAINER ID or NAME >
` ` `
2016-12-10 17:00:25 +08:00
# # # 如 何 给 容 器 指 定 一 个 固 定 IP 地 址 , 而 不 是 每 次 重 启 容 器 IP 地 址 都 会 变 ?
2017-11-24 00:29:51 +08:00
答 : 使 用 以 下 命 令 启 动 容 器 可 以 使 容 器 IP 固 定 不 变
` ` ` bash
$ 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
` ` `
2016-12-10 17:00:25 +08:00
# # # 如 何 临 时 退 出 一 个 正 在 交 互 的 容 器 的 终 端 , 而 不 终 止 它 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 按 ` Ctrl-p Ctrl-q ` 。 如 果 按 ` Ctrl-c ` 往 往 会 让 容 器 内 应 用 进 程 终 止 , 进 而 会 终 止 容 器 。
# # # 使 用 ` docker port ` 命 令 映 射 容 器 的 端 口 时 , 系 统 报 错 “ Error : No public port ' 80 ' published for xxx ” ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 :
2017-11-24 00:29:51 +08:00
* 创 建 镜 像 时 ` Dockerfile ` 要 通 过 ` EXPOSE ` 指 定 正 确 的 开 放 端 口 ;
2016-12-10 17:00:25 +08:00
* 容 器 启 动 时 指 定 ` PublishAllPort = true ` 。
# # # 可 以 在 一 个 容 器 中 同 时 运 行 多 个 应 用 进 程 么 ?
2017-11-24 00:29:51 +08:00
2019-01-06 09:50:03 +08:00
答 : 一 般 并 不 推 荐 在 同 一 个 容 器 内 运 行 多 个 应 用 进 程 。 如 果 有 类 似 需 求 , 可 以 通 过 一 些 额 外 的 进 程 管 理 机 制 , 比 如 ` supervisord ` 来 管 理 所 运 行 的 进 程 。 可 以 参 考 https : //docs.docker.com/config/containers/multi-service_container/ 。
2016-12-10 17:00:25 +08:00
# # # 如 何 控 制 容 器 占 用 系 统 资 源 ( CPU 、 内 存 ) 的 份 额 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 在 使 用 ` docker create ` 命 令 创 建 容 器 或 使 用 ` docker run ` 创 建 并 启 动 容 器 的 时 候 , 可 以 使 用 - c | -- cpu - shares [ = 0 ] 参 数 来 调 整 容 器 使 用 CPU 的 权 重 ; 使 用 - m | -- memory [ = MEMORY ] 参 数 来 调 整 容 器 使 用 内 存 的 大 小 。
# # 仓 库 相 关
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
# # # 仓 库 ( Repository ) 、 注 册 服 务 器 ( Registry ) 、 注 册 索 引 ( Index ) 有 何 关 系 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
首 先 , 仓 库 是 存 放 一 组 关 联 镜 像 的 集 合 , 比 如 同 一 个 应 用 的 不 同 版 本 的 镜 像 。
注 册 服 务 器 是 存 放 实 际 的 镜 像 文 件 的 地 方 。 注 册 索 引 则 负 责 维 护 用 户 的 账 号 、 权 限 、 搜 索 、 标 签 等 的 管 理 。 因 此 , 注 册 服 务 器 利 用 注 册 索 引 来 实 现 认 证 等 管 理 。
# # 配 置 相 关
2017-11-24 00:29:51 +08:00
# # # Docker 的 配 置 文 件 放 在 哪 里 , 如 何 修 改 配 置 ?
2016-12-10 17:00:25 +08:00
2019-04-29 09:26:29 +08:00
答 : 使 用 ` systemd ` 的 系 统 ( 如 Ubuntu 16.04 、 Centos 等 ) 的 配 置 文 件 在 ` /etc/docker/daemon.json ` 。
2016-12-10 17:00:25 +08:00
# # # 如 何 更 改 Docker 的 默 认 存 储 位 置 ?
2017-11-24 00:29:51 +08:00
2018-12-13 18:57:41 +08:00
答 : Docker 的 默 认 存 储 位 置 是 ` /var/lib/docker ` , 如 果 希 望 将 Docker 的 本 地 文 件 存 储 到 其 他 分 区 , 可 以 使 用 Linux 软 连 接 的 方 式 来 完 成 , 或 者 在 启 动 daemon 时 通 过 ` -g ` 参 数 指 定 , 或 者 修 改 配 置 文 件 ` /etc/docker/daemon.json ` 的 "data-root" 项 。 可 以 使 用 ` docker system info | grep "Root Dir" ` 查 看 当 前 使 用 的 存 储 位 置 。
2016-12-10 17:00:25 +08:00
例 如 , 如 下 操 作 将 默 认 存 储 位 置 迁 移 到 / storage / docker 。
` ` ` sh
[ root @ s26 ~ ] # df - h
Filesystem Size Used Avail Use % Mounted on
/ dev / mapper / VolGroup - lv_root 50 G 5.3 G 42 G 12 % /
tmpfs 48 G 228 K 48 G 1 % / dev / shm
/ dev / sda1 485 M 40 M 420 M 9 % / boot
/ dev / mapper / VolGroup - lv_home 222 G 188 M 210 G 1 % / home
/ dev / sdb2 2.7 T 323 G 2.3 T 13 % / 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 . 1 root root 15 11 月 17 13 : 43 docker - > / storage / docker
[ root @ s26 lib ] # service docker start
` ` `
2018-12-13 18:57:41 +08:00
# # # 使 用 内 存 和 swap 限 制 启 动 容 器 时 候 报 警 告 : "WARNING: Your kernel does not support cgroup swap limit. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded." ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 这 是 因 为 系 统 默 认 没 有 开 启 对 内 存 和 swap 使 用 的 统 计 功 能 , 引 入 该 功 能 会 带 来 性 能 的 下 降 。 要 开 启 该 功 能 , 可 以 采 取 如 下 操 作 :
2017-11-24 00:29:51 +08:00
* 编 辑 ` /etc/default/grub ` 文 件 ( Ubuntu 系 统 为 例 ) , 配 置 ` GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" `
* 更 新 grub : ` $ sudo update-grub `
2016-12-10 17:00:25 +08:00
* 重 启 系 统 , 即 可 。
# # Docker 与 虚 拟 化
# # # Docker 与 LXC ( Linux Container ) 有 何 不 同 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : LXC 利 用 Linux 上 相 关 技 术 实 现 了 容 器 。 Docker 则 在 如 下 的 几 个 方 面 进 行 了 改 进 :
* 移 植 性 : 通 过 抽 象 容 器 配 置 , 容 器 可 以 实 现 从 一 个 平 台 移 植 到 另 一 个 平 台 ;
2020-03-04 11:50:59 +08:00
* 镜 像 系 统 : 基 于 OverlayFS 的 镜 像 系 统 为 容 器 的 分 发 带 来 了 很 多 的 便 利 , 同 时 共 同 的 镜 像 层 只 需 要 存 储 一 份 , 实 现 高 效 率 的 存 储 ;
2016-12-10 17:00:25 +08:00
* 版 本 管 理 : 类 似 于 Git 的 版 本 管 理 理 念 , 用 户 可 以 更 方 便 的 创 建 、 管 理 镜 像 文 件 ;
* 仓 库 系 统 : 仓 库 系 统 大 大 降 低 了 镜 像 的 分 发 和 管 理 的 成 本 ;
* 周 边 工 具 : 各 种 现 有 工 具 ( 配 置 管 理 、 云 平 台 ) 对 Docker 的 支 持 , 以 及 基 于 Docker 的 PaaS 、 CI 等 系 统 , 让 Docker 的 应 用 更 加 方 便 和 多 样 化 。
# # # Docker 与 Vagrant 有 何 不 同 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : 两 者 的 定 位 完 全 不 同 。
* Vagrant 类 似 Boot2Docker ( 一 款 运 行 Docker 的 最 小 内 核 ) , 是 一 套 虚 拟 机 的 管 理 环 境 。 Vagrant 可 以 在 多 种 系 统 上 和 虚 拟 机 软 件 中 运 行 , 可 以 在 Windows , Mac 等 非 Linux 平 台 上 为 Docker 提 供 支 持 , 自 身 具 有 较 好 的 包 装 性 和 移 植 性 。
* 原 生 的 Docker 自 身 只 能 运 行 在 Linux 平 台 上 , 但 启 动 和 运 行 的 性 能 都 比 虚 拟 机 要 快 , 往 往 更 适 合 快 速 开 发 和 部 署 应 用 的 场 景 。
简 单 说 : Vagrant 适 合 用 来 管 理 虚 拟 机 , 而 Docker 适 合 用 来 管 理 应 用 环 境 。
# # # 开 发 环 境 中 Docker 和 Vagrant 该 如 何 选 择 ?
2017-11-24 00:29:51 +08:00
答 : Docker 不 是 虚 拟 机 , 而 是 进 程 隔 离 , 对 于 资 源 的 消 耗 很 少 , 但 是 目 前 需 要 Linux 环 境 支 持 。 Vagrant 是 虚 拟 机 上 做 的 封 装 , 虚 拟 机 本 身 会 消 耗 资 源 。
2016-12-10 17:00:25 +08:00
如 果 本 地 使 用 的 Linux 环 境 , 推 荐 都 使 用 Docker 。
2017-11-24 00:29:51 +08:00
如 果 本 地 使 用 的 是 macOS 或 者 Windows 环 境 , 那 就 需 要 开 虚 拟 机 , 单 一 开 发 环 境 下 Vagrant 更 简 单 ; 多 环 境 开 发 下 推 荐 在 Vagrant 里 面 再 使 用 Docker 进 行 环 境 隔 离 。
2016-12-10 17:00:25 +08:00
# # 其 它
2017-11-24 00:29:51 +08:00
# # # Docker 能 在 非 Linux 平 台 ( 比 如 Windows 或 macOS ) 上 运 行 么 ?
2017-11-24 09:56:30 +08:00
答 : 完 全 可 以 。 安 装 方 法 请 查 看 [ 安 装 Docker ] ( . . / . . / install / ) 一 节
2017-11-24 00:29:51 +08:00
# # # 如 何 将 一 台 宿 主 主 机 的 Docker 环 境 迁 移 到 另 外 一 台 宿 主 主 机 ?
2016-12-10 17:00:25 +08:00
答 : 停 止 Docker 服 务 。 将 整 个 Docker 存 储 文 件 夹 复 制 到 另 外 一 台 宿 主 主 机 , 然 后 调 整 另 外 一 台 宿 主 主 机 的 配 置 即 可 。
# # # 如 何 进 入 Docker 容 器 的 网 络 命 名 空 间 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:00:25 +08:00
答 : Docker 在 创 建 容 器 后 , 删 除 了 宿 主 主 机 上 ` /var/run/netns ` 目 录 中 的 相 关 的 网 络 命 名 空 间 文 件 。 因 此 , 在 宿 主 主 机 上 是 无 法 看 到 或 访 问 容 器 的 网 络 命 名 空 间 的 。
用 户 可 以 通 过 如 下 方 法 来 手 动 恢 复 它 。
2017-11-24 00:29:51 +08:00
首 先 , 使 用 下 面 的 命 令 查 看 容 器 进 程 信 息 , 比 如 这 里 的 1234 。
2016-12-10 17:00:25 +08:00
2017-11-24 00:29:51 +08:00
` ` ` bash
2016-12-10 17:00:25 +08:00
$ docker inspect -- format = ' { { . State . Pid } } ' $ container_id
1234
` ` `
2017-11-24 00:29:51 +08:00
接 下 来 , 在 ` /proc ` 目 录 下 , 把 对 应 的 网 络 命 名 空 间 文 件 链 接 到 ` /var/run/netns ` 目 录 。
` ` ` bash
2016-12-10 17:00:25 +08:00
$ sudo ln - s / proc / 1234 / ns / net / var / run / netns /
` ` `
然 后 , 在 宿 主 主 机 上 就 可 以 看 到 容 器 的 网 络 命 名 空 间 信 息 。 例 如
2017-11-24 00:29:51 +08:00
` ` ` bash
2016-12-10 17:00:25 +08:00
$ sudo ip netns show
1234
` ` `
此 时 , 用 户 可 以 通 过 正 常 的 系 统 命 令 来 查 看 或 操 作 容 器 的 命 名 空 间 了 。 例 如 修 改 容 器 的 IP 地 址 信 息 为 ` 172.17.0.100/16 ` 。
2017-11-24 00:29:51 +08:00
` ` ` bash
2016-12-10 17:00:25 +08:00
$ sudo ip netns exec 1234 ifconfig eth0 172.17 .0 .100 / 16
` ` `
2016-12-10 17:06:04 +08:00
# # # 如 何 获 取 容 器 绑 定 到 本 地 那 个 veth 接 口 上 ?
2017-11-24 00:29:51 +08:00
2016-12-10 17:06:04 +08:00
答 : Docker 容 器 启 动 后 , 会 通 过 veth 接 口 对 连 接 到 本 地 网 桥 , veth 接 口 命 名 跟 容 器 命 名 毫 无 关 系 , 十 分 难 以 找 到 对 应 关 系 。
最 简 单 的 一 种 方 式 是 通 过 查 看 接 口 的 索 引 号 , 在 容 器 中 执 行 ` ip a ` 命 令 , 查 看 到 本 地 接 口 最 前 面 的 接 口 索 引 号 , 如 ` 205 ` , 将 此 值 加 上 1 , 即 ` 206 ` , 然 后 在 本 地 主 机 执 行 ` ip a ` 命 令 , 查 找 接 口 索 引 号 为 ` 206 ` 的 接 口 , 两 者 即 为 连 接 的 veth 接 口 对 。