https://wiki.archlinux.org/api.php?action=feedcontributions&user=Zombie110year&feedformat=atom
ArchWiki - User contributions [en]
2024-03-28T21:21:53Z
User contributions
MediaWiki 1.41.0
https://wiki.archlinux.org/index.php?title=Docker_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)&diff=571489
Docker (简体中文)
2019-04-18T05:36:16Z
<p>Zombie110year: 翻译英文改动</p>
<hr />
<div>[[Category:Sandboxing (简体中文)]]<br />
[[Category:Virtualization (简体中文)]]<br />
[[en:Docker]]<br />
[[ja:Docker]]<br />
[[ru:Docker]]<br />
[[zh-hant:Docker]]<br />
{{Related articles start}}<br />
{{Related|systemd-nspawn}}<br />
{{Related|Linux Containers}}<br />
{{Related|Vagrant}}<br />
{{Related articles end}}<br />
{{TranslationStatus (简体中文)|Docker|2018-10-22|549067}}<br />
[[Wikipedia:Docker (software)|Docker]] 是一种打包、传输和运行任何程序作为轻量级容器的实用工具.<br />
<br />
== 安装 ==<br />
<br />
[[Install]] {{Pkg|docker}} 包 或者,对于开发版本,选择{{Aur|docker-git}} 包. 下一步 [[start]] 并启用 {{ic|docker.service}} 然后验证操作:<br />
<br />
# docker info<br />
<br />
注意, 如果你有一个活动的 VPN 连接, 那么 docker 服务的启动可能失败, 因为 VPN 和 Docker 的网桥 IP 冲突以及网络覆盖. 如果发生了这种事, 尝试在启动 docker 服务之前断开 VPN 连接. 你可以在之后立刻重连 VPN. [https://stackoverflow.com/questions/45692255/how-make-openvpn-work-with-docker You can also try to deconflict the networks.]<br />
<br />
如果你想以普通用户身份运行docker的话,添加你自己到 {{ic|docker}} [[user group]].<br />
<br />
{{警告|任何加入到 {{ic|docker}} 组的用户都和root用户等价. 查阅更多信息可访问 [https://github.com/docker/docker/issues/9976 这里] 和 [https://docs.docker.com/engine/security/security/ 这里].}}<br />
<br />
== 配置 ==<br />
<br />
=== 存储驱动程序 ===<br />
<br />
docker存储驱动 (或者是显卡驱动) 对性能有巨大影响. 它的工作是高效存储容器镜像层,也就是许多镜像共享一个层时只有一个层使用磁盘空间。作为兼容选项, `devicemapper` 提供了次优性能, 这在机械硬盘上是非常糟糕的. 例外, `devicemapper` 不建议在生产中使用.<br />
<br />
随着arch Linux发布新的内核,没有必要使用兼容选项了。一个好的现代选择是 {{ic|overlay2}}.<br />
<br />
想看现在的存储驱动, 运行 {{ic|# docker info {{!}} head}}; 现代docker安装应该已经默认使用 {{ic|overlay2}} 了.<br />
<br />
想设置你自己的存储驱动选项, 编辑 {{ic|/etc/docker/daemon.json}} (如果不存在就自己创建):<br />
{{hc|/etc/docker/daemon.json|2=<br />
{<br />
"storage-driver": "overlay2"<br />
}<br />
<br />
}}<br />
<br />
然后, [[restart]] docker.<br />
<br />
更多的选项信息能在 [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ 用户指南]查阅.<br />
更多的 {{ic|daemon.json}} 选项查阅 [https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file docker 文档].<br />
<br />
=== 远程 API ===<br />
<br />
手动打开远程 API 端口 {{ic|4243}} , 运行:<br />
<br />
# /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock<br />
<br />
{{ic|-H tcp://0.0.0.0:4243}} 部分是用来打开远程 API的.<br />
<br />
{{ic|-H unix:///var/run/docker.sock}} 部分是通过终端连接主机的.<br />
<br />
==== 用systemd打开远程API ====<br />
<br />
如果要用docker守护进程开启远程API, 创建一个 [[Drop-in snippet]] ,内容如下:<br />
<br />
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=<br />
[Service]<br />
ExecStart=<br />
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock<br />
}}<br />
<br />
=== 守护进程socket配置 ===<br />
<br />
''docker'' 守护进场默认监听 [[Wikipedia:Unix domain socket|Unix socket]] .如果要监听特定端口的话, 创建一个 [[Drop-in snippet]] ,内容如下:<br />
<br />
{{hc|/etc/systemd/system/docker.socket.d/socket.conf|2=<br />
[Socket]<br />
ListenStream=0.0.0.0:2375<br />
}}<br />
<br />
=== 代理 ===<br />
<br />
代理配置分为两部分。一部分是主机docker守护进程的配置,另一部分是让容器检测到代理的配置<br />
<br />
==== 代理配置 ====<br />
<br />
创建一个 [[Drop-in snippet]] 内容如下:<br />
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2=<br />
[Service]<br />
Environment="HTTP_PROXY=192.168.1.1:8080"<br />
Environment="HTTPS_PROXY=192.168.1.1:8080"<br />
}}<br />
<br />
{{注意|这假定 {{ic|192.168.1.1}} 是你的代理服务器,不要使用 {{ic|127.0.0.1}}.}}<br />
<br />
确定配置被加载了:<br />
<br />
{{hc|# systemctl show docker --property Environment|2=<br />
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080<br />
}}<br />
<br />
==== 容器配置 ====<br />
<br />
在 {{ic|docker.service}} 文件里的设置并不会进入到容器里. 要实现这样的话必须设置 {{ic|ENV}} 变量在你的 {{ic|Dockerfile}} 里:<br />
<br />
FROM base/archlinux<br />
ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>"<br />
ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>"<br />
<br />
[https://docs.docker.com/engine/reference/builder/#env Docker] 提供了配置的细节信息,通过Dockerfile的 {{ic|ENV}} .<br />
<br />
=== 配置 DNS ===<br />
<br />
默认的,docker会让容器里的 {{ic|resolv.conf}} 和主机里的 {{ic|/etc/resolv.conf}} 匹配, 并过滤掉本地地址 (e.g. {{ic|127.0.0.1}}). 如果这产生了一个空文件, 那么 [https://developers.google.com/speed/public-dns/ Google DNS servers] 就会被使用. 如果你用的是 [[dnsmasq (简体中文)]] 一样的服务来提供域名解析的话, 你可能需要在 {{ic|/etc/resolv.conf}} 添加入口给docker网络借口让它不被过滤掉.<br />
<br />
=== 在systemd-networkd用手动定义的网络运行Docker ===<br />
<br />
如果你是手动配置的网络,用的是 [[systemd-networkd]] 版本 '''220 或者更高''', 你运行的容器可能无法连接网络. 从版本 220开始, 对于给定网络 ({{ic|net.ipv4.conf.<interface>.forwarding}}) 的转发设置默认是 {{ic|off}}. 这个设置阻止了IP转发. 它会与在容器里启用了 {{ic|net.ipv4.conf.all.forwarding}} 设置的docker冲突<br />
<br />
一个解决办法是编辑 在{{ic|/etc/systemd/network/}}里的{{ic|<interface>.network}}文件 , 添加 {{ic|1=IPForward=kernel}} 到docker主机:<br />
<br />
{{hc|/etc/systemd/network/<interface>.network|2=<br />
[Network]<br />
...<br />
IPForward=kernel<br />
...}}<br />
<br />
这项设置像预期一样允许来自容器的IP转发.<br />
<br />
=== 镜像位置 ===<br />
<br />
默认,docker镜像放置在 {{ic|/var/lib/docker}}. 他们可以被移动到其他分区. <br />
首先, [[stop]] the {{ic|docker.service}}. <br />
<br />
如果你正在运行docker镜像,你必须确定镜像被完全解除挂载。一旦这个完成后,你就可以把镜像从 {{ic|/var/lib/docker}} 移动到你的目标地点.<br />
<br />
然后为{{ic|docker.service}}添加 [[Drop-in snippet]],加入 {{ic|-g}} 参数到 {{ic|ExecStart}}:<br />
<br />
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2=<br />
[Service]<br />
ExecStart= <br />
ExecStart=/usr/bin/dockerd --data-root=''/path/to/new/location/docker'' -H fd://}}<br />
<br />
=== 不安全的注册 ===<br />
<br />
如果你想用自签名的证书, docker会拒绝它直到你定义你相信它.<br />
为{{ic|docker.service}}添加 [[Drop-in snippet]], 添加 {{ic|--insecure-registry}}参数到 {{ic|dockerd}}:<br />
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=<br />
[Service]<br />
ExecStart=<br />
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000<br />
}}<br />
<br />
== 镜像 ==<br />
=== Arch Linux ===<br />
下面的命令会拉取 [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 image.这是一个arch内核的剥离版本,没有网络等等.<br />
<br />
# docker pull archlinux/base<br />
<br />
也可查阅 [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md].<br />
<br />
对于完整的arch基础,可以从下面克隆镜像并且建立你自己的镜像.<br />
<br />
$ git clone https://github.com/archlinux/archlinux-docker.git<br />
<br />
编辑包文件让它只含有 '基础'. 运行: <br />
<br />
# make docker-image<br />
<br />
=== Debian ===<br />
下面的命令会拉取Debian镜像 [https://hub.docker.com/r/_/debian/ debian] x86_64 image.<br />
<br />
# docker pull debian<br />
<br />
==== 手动 ====<br />
用 {{Pkg|debootstrap}}建立Debian镜像:<br />
<br />
# mkdir jessie-chroot<br />
# debootstrap jessie ./jessie-chroot http://http.debian.net/debian/<br />
# cd jessie-chroot<br />
# tar cpf - . | docker import - debian<br />
# docker run -t -i --rm debian /bin/bash<br />
<br />
== 移除docker和镜像 ==<br />
<br />
如果你想完全移除Docker,你可以通过下面的步骤完成:<br />
<br />
{{注意|不要仅仅只是复制粘贴下面的命令而不知道你在干什么.}}<br />
<br />
检查正在运行的容器:<br />
<br />
# docker ps<br />
<br />
列出在主机运行的所有容器,为删除做准备:<br />
<br />
# docker ps -a<br />
<br />
停止一个运行的容器:<br />
<br />
# docker stop <CONTAINER ID><br />
<br />
杀死还在运行的容器:<br />
<br />
# docker kill <CONTAINER ID><br />
<br />
通过ID删除列出的所有容器:<br />
<br />
# docker rm <CONTAINER ID><br />
<br />
列出所有的docker镜像:<br />
<br />
# docker images<br />
<br />
通过ID删除所有镜像:<br />
<br />
# docker rmi <IMAGE ID><br />
<br />
删除所有docker数据 (清除目录):<br />
<br />
{{Accuracy|执行 # rm -R /var/lib/docker 将会留下已删除容器的btrfs子卷}}<br />
<br />
# rm -R /var/lib/docker<br />
<br />
== 有用的建议 ==<br />
<br />
抓取运行容器的IP地址:<br />
<br />
{{hc|<nowiki>$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id> </nowiki>|<br />
172.17.0.37}}<br />
<br />
每个正在运行的容器,它们的名字和相关IP地址都能被列出来在 {{ic|/etc/hosts}}里用:<br />
<br />
{{bc|#!/usr/bin/env sh<br />
<nowiki>for ID in $(docker ps -q | awk '{print $1}'); do<br />
IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID")<br />
NAME=$(docker ps | grep "$ID" | awk '{print $NF}')<br />
printf "%s %s\n" "$IP" "$NAME"<br />
done</nowiki>}}<br />
<br />
== 故障排除 ==<br />
=== docker0 网桥无法获取 IP / internet 到容器 ===<br />
<br />
Docker会自己启用IP转发,但是默认 [[systemd-networkd]] 会覆盖对应的sysctl设置. 在网络配置文件里设置 {{ic|1=IPForward=yes}} . 查阅 [[Internet sharing#Enable packet forwarding]] 获取细节.<br />
<br />
{{Note| 你可能需要在每次 [[restart]] {{ic|systemd-networkd.service}} 或者 {{ic|iptables.service}} 之后手动重启 {{ic|docker.service}}}}<br />
<br />
=== 默认的允许的进程/线程数太少 ===<br />
<br />
如果你允许时得到下面的错误信息<br />
<br />
# e.g. Java<br />
java.lang.OutOfMemoryError: unable to create new native thread<br />
# e.g. C, bash, ...<br />
fork failed: Resource temporarily unavailable<br />
<br />
那么你可能需要调整被systemd允许的进程数. 默认的是 500 (see {{ic|system.conf}}), 这对需要允许几个容器的话太少了. [[Edit]] 并添加下面片段 {{ic|docker.service}} :<br />
<br />
{{hc|# systemctl edit docker.service|2=<br />
[Service]<br />
TasksMax=infinity<br />
}}<br />
<br />
=== 初始化显卡驱动错误: devmapper ===<br />
<br />
如果 ''systemctl'' 不能开启docker并提供了以下信息:<br />
<br />
Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool<br />
<br />
那么尝试以下步骤来解决错误。停止docker服务,备份 {{ic|/var/lib/docker/}} (如果需要的话), 移除{{ic|/var/lib/docker/}}的内容, 尝试重启docker服务. 查阅 [https://github.com/docker/docker/issues/21304 GitHub issue] 获取更多细节.<br />
<br />
=== 无法创建到某文件的路径: 设备没有多余的空间了 ===<br />
如果你获取到的错误信息是像这样的话:<br />
<br />
ERROR: Failed to create some/path/to/file: No space left on device<br />
<br />
当创建或者运行Docker镜像时,尽管磁盘还有多余的空间。所以请确保:<br />
<br />
* [[Tmpfs]] 被禁用了并且有足够的内存分配. Docker可能会尝试写入文件到 {{ic|/tmp}} 但是失败了因为内存使用的限制和磁盘空间不足.<br />
* 如果你在使用 [[XFS (简体中文)]], 你可能得从相关入口移除 {{ic|noquota}} 挂载选项在 {{ic|/etc/fstab}}里 (通常是 {{ic|/tmp}} 和/或 {{ic|/var/lib/docker}} 在的地方). 查阅 [[Disk quota]] 获取更多信息, 特别是你计划使用和调整 {{ic|overlay2}} Docker 存储驱动.<br />
* XFS 的配额挂载选项在文件系统重新挂载时 ({{ic|uquota}}, {{ic|gquota}}, {{ic|prjquota}}, 等等.) 失败了. 为了为root文件系统启用配额挂载选项必须作为 [[Kernel parameters (简体中文)]] {{ic|1=rootflags=}}传递到initramfs. 之后, 它就不应该在 {{ic|/etc/fstab}}中的挂载选项中列出root ({{ic|/}}) 文件系统.<br />
<br />
{{注意|XFS配额和标准Linux[[Disk quota]], [http://inai.de/linux/adm_quota] 是有区别的。这里值得一读.}}<br />
<br />
=== kernel 4.19.1下无效的跨设备链接 ===<br />
<br />
如果像 ''dpkg'' 这样的命令在docker运行失败, 比如:<br />
<br />
dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link<br />
<br />
可以 添加 {{ic|1=overlay.metacopy=N}} [[kernel parameter]] 或者降级到 4.18.x 直到 [https://github.com/docker/for-linux/issues/480 这个 issue] 被解决. 更多信息查看 [https://bbs.archlinux.org/viewtopic.php?id=241866 Arch forum].<br />
<br />
=== CPUACCT missing in docker with Linux-ck ===<br />
<br />
In newer versions of [[Linux-ck]] ([https://aur.archlinux.org/packages/linux-ck#comment-677316 some experienced] with 4.19, 4.20 seems general), a change to the MuQSS was made that disables the {{ic|CONFIG_CGROUP_CPUACCT}} option from the kernel, which makes ''some'' usage of docker ({{ic|run}} or {{ic|build}}) to produce the following error:<br />
<br />
{{hc|$ docker run --rm hello-world|docker: Error response from daemon: unable to find "cpuacct" in controller set: unknown.}}<br />
<br />
This error does not seems to affect the docker daemon, just containers. Read more on [[Linux-ck#CPUACCT missing in docker]].<br />
<br />
== 查阅更多 ==<br />
<br />
* [https://www.docker.com Official website]<br />
* [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux on docs.docker.com]<br />
* [http://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com</div>
Zombie110year
https://wiki.archlinux.org/index.php?title=Docker_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)&diff=571487
Docker (简体中文)
2019-04-18T03:35:21Z
<p>Zombie110year: 修改了措辞与语序</p>
<hr />
<div>[[Category:Sandboxing (简体中文)]]<br />
[[Category:Virtualization (简体中文)]]<br />
[[en:Docker]]<br />
[[ja:Docker]]<br />
[[ru:Docker]]<br />
[[zh-hant:Docker]]<br />
{{Related articles start}}<br />
{{Related|systemd-nspawn}}<br />
{{Related|Linux Containers}}<br />
{{Related|Lxc-systemd}}<br />
{{Related|Vagrant}}<br />
{{Related articles end}}<br />
{{TranslationStatus (简体中文)|Docker|2018-10-22|549067}}<br />
[[Wikipedia:Docker (software)|Docker]] 是一种打包、传输和运行任何程序作为轻量级容器的实用工具.<br />
<br />
== 安装 ==<br />
<br />
[[Install]] {{Pkg|docker}} 包 或者,对于开发版本,选择{{Aur|docker-git}} 包. 下一步 [[start]] 并启用 {{ic|docker.service}} 然后验证操作:<br />
<br />
# docker info<br />
<br />
注意到如果你有启用的vpn连接的话开启docker服务可能会失败。这样的话,试下开启docker服务前断开vpn连接。之后你可以自行重连vpn。<br />
<br />
如果你想以普通用户身份运行docker的话,添加你自己到 {{ic|docker}} [[user group]].<br />
<br />
{{警告|任何加入到 {{ic|docker}} 组的用户都和root用户等价. 查阅更多信息可访问 [https://github.com/docker/docker/issues/9976 这里] 和 [https://docs.docker.com/engine/security/security/ 这里].}}<br />
<br />
{{注意|因为 {{Pkg|linux}} 4.15.0-1 的''vsyscalls''——这被容器里的特定程序需要 (比如 ''apt-get'')——被内核配置默认关闭了. 要重新启用的话, 添加 {{ic|1=vsyscall=emulate}}到 [[Kernel parameters (简体中文)]]. 查阅更多信息到 {{bug|57336}}.}}<br />
<br />
== 配置 ==<br />
<br />
=== 存储驱动程序 ===<br />
<br />
docker存储驱动 (或者是显卡驱动) 对性能有巨大影响. 它的工作是高效存储容器镜像层,也就是许多镜像共享一个层时只有一个层使用磁盘空间。作为兼容选项, `devicemapper` 提供了次优性能, 这在机械硬盘上是非常糟糕的. 例外, `devicemappper` 不建议在生产中使用.<br />
<br />
随着arch Linux发布新的内核,没有必要使用兼容选项了。一个好的现代选择是 {{ic|overlay2}}.<br />
<br />
想看现在的存储驱动, 运行 {{ic|# docker info {{!}} head}}, 现代docker安装应该已经默认使用 {{ic|overlay2}} 了.<br />
<br />
想设置你自己的存储驱动选项, 编辑 {{ic|/etc/docker/daemon.json}} (如果不存在就自己创建):<br />
{{hc|/etc/docker/daemon.json|2=<br />
{<br />
"storage-driver": "overlay2"<br />
}<br />
<br />
}}<br />
<br />
然后, [[restart]] docker.<br />
<br />
更多的选项信息能在 [https://docs.docker.com/engine/userguide/storagedriver/selectadriver/ 用户指导]查阅.<br />
更多的 {{ic|daemon.json}} 选项查阅 [https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file dockerd文献].<br />
<br />
=== 远程 API ===<br />
<br />
手动打开远程 API 端口 {{ic|4243}} , 运行:<br />
<br />
# /usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock<br />
<br />
{{ic|-H tcp://0.0.0.0:4243}} 部分是用来打开远程 API的.<br />
<br />
{{ic|-H unix:///var/run/docker.sock}} 部分是通过终端连接主机的.<br />
<br />
==== 用systemd打开远程API ====<br />
<br />
如果要用docker守护进程开启远程API, 创建一个 [[Drop-in snippet]] ,内容如下:<br />
<br />
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=<br />
[Service]<br />
ExecStart=<br />
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock<br />
}}<br />
<br />
=== 守护进程socket配置 ===<br />
<br />
''docker'' 守护进场默认监听 [[Wikipedia:Unix domain socket|Unix socket]] .如果要监听特定端口的话, 创建一个 [[Drop-in snippet]] ,内容如下:<br />
<br />
{{hc|/etc/systemd/system/docker.socket.d/socket.conf|2=<br />
[Socket]<br />
ListenStream=0.0.0.0:2375<br />
}}<br />
<br />
=== 代理 ===<br />
<br />
代理配置分为两部分。一部分是主机docker守护进程的配置,另一部分是让容器检测到代理的配置<br />
<br />
==== 代理配置 ====<br />
<br />
创建一个 [[Drop-in snippet]] 内容如下:<br />
{{hc|/etc/systemd/system/docker.service.d/proxy.conf|2=<br />
[Service]<br />
Environment="HTTP_PROXY=192.168.1.1:8080"<br />
Environment="HTTPS_PROXY=192.168.1.1:8080"<br />
}}<br />
<br />
{{注意|这假定 {{ic|192.168.1.1}} 是你的代理服务器,不要使用 {{ic|127.0.0.1}}.}}<br />
<br />
确定配置被加载了:<br />
<br />
{{hc|# systemctl show docker --property Environment|2=<br />
Environment=HTTP_PROXY=192.168.1.1:8080 HTTPS_PROXY=192.168.1.1:8080<br />
}}<br />
<br />
==== 容器配置 ====<br />
<br />
在 {{ic|docker.service}} 文件里的设置并不会进入到容器里. 要实现这样的话必须设置 {{ic|ENV}} 变量在你的 {{ic|Dockerfile}} 里:<br />
<br />
FROM base/archlinux<br />
ENV http_proxy="<nowiki>http://192.168.1.1:3128</nowiki>"<br />
ENV https_proxy="<nowiki>https://192.168.1.1:3128</nowiki>"<br />
<br />
[https://docs.docker.com/engine/reference/builder/#env Docker] 提供了配置的细节信息,通过Dockerfile的 {{ic|ENV}} .<br />
<br />
=== 配置 DNS ===<br />
<br />
默认的,docker会让容器里的 {{ic|resolv.conf}} 和主机里的 {{ic|/etc/resolv.conf}} 匹配, 并过滤掉本地地址 (e.g. {{ic|127.0.0.1}}). 如果这产生了一个空文件, 那么 [https://developers.google.com/speed/public-dns/ Google DNS servers] 就会被使用. 如果你用的是 [[dnsmasq (简体中文)]] 一样的服务来提供域名解析的话, 你可能需要在 {{ic|/etc/resolv.conf}} 添加入口给docker网络借口让它不被过滤掉.<br />
<br />
=== 在systemd-networkd用手动定义的网络运行Docker ===<br />
<br />
如果你是手动配置的网络,用的是 [[systemd-networkd]] 版本 '''220 或者更高''', 你运行的容器可能无法连接网络. 从版本 220开始, 对于给定网络 ({{ic|net.ipv4.conf.<interface>.forwarding}}) 的转发设置默认是 {{ic|off}}. 这个设置阻止了IP转发. 它会与在容器里启用了 {{ic|net.ipv4.conf.all.forwarding}} 设置的docker冲突<br />
<br />
一个解决办法是编辑 在{{ic|/etc/systemd/network/}}里的{{ic|<interface>.network}}文件 , 添加 {{ic|1=IPForward=kernel}} 到docker主机:<br />
<br />
{{hc|/etc/systemd/network/<interface>.network|2=<br />
[Network]<br />
...<br />
IPForward=kernel<br />
...}}<br />
<br />
这项设置像预期一样允许来自容器的IP转发.<br />
<br />
=== 镜像位置 ===<br />
<br />
默认,docker镜像放置在 {{ic|/var/lib/docker}}. 他们可以被移动到其他分区. <br />
首先, [[stop]] the {{ic|docker.service}}. <br />
<br />
如果你正在运行docker镜像,你必须确定镜像被完全解除挂载。一旦这个完成后,你就可以把镜像从 {{ic|/var/lib/docker}} 移动到你的目标地点.<br />
<br />
然后为{{ic|docker.service}}添加 [[Drop-in snippet]],加入 {{ic|--data-root}} 参数到 {{ic|ExecStart}}:<br />
<br />
{{hc|/etc/systemd/system/docker.service.d/docker-storage.conf|2=<br />
[Service]<br />
ExecStart= <br />
ExecStart=/usr/bin/dockerd --data-root=''/path/to/new/location/docker'' -H fd://}}<br />
<br />
=== 不安全的注册 ===<br />
<br />
如果你想用自签名的证书, docker会拒绝它直到你定义你相信它.<br />
为{{ic|docker.service}}添加 [[Drop-in snippet]], 添加 {{ic|--insecure-registry}}参数到 {{ic|dockerd}}:<br />
{{hc|/etc/systemd/system/docker.service.d/override.conf|2=<br />
[Service]<br />
ExecStart=<br />
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry my.registry.name:5000<br />
}}<br />
<br />
== 镜像 ==<br />
=== Arch Linux ===<br />
下面的命令会拉取 [https://hub.docker.com/r/archlinux/base/ archlinux/base] x86_64 image.这是一个arch内核的剥离版本,没有网络等等.<br />
<br />
# docker pull archlinux/base<br />
<br />
也可查阅 [https://github.com/archlinux/archlinux-docker/blob/master/README.md README.md].<br />
<br />
对于完整的arch基础,可以从下面克隆镜像并且建立你自己的镜像.<br />
<br />
$ git clone https://github.com/archlinux/archlinux-docker.git<br />
<br />
编辑包文件让它只含有 '基础'. 运行: <br />
<br />
# make docker-image<br />
<br />
=== Debian ===<br />
下面的命令会拉取Debian镜像 [https://hub.docker.com/r/_/debian/ debian] x86_64 image.<br />
<br />
# docker pull debian<br />
<br />
==== 手动 ====<br />
用 {{Pkg|debootstrap}}建立Debian镜像:<br />
<br />
# mkdir jessie-chroot<br />
# debootstrap jessie ./jessie-chroot http://http.debian.net/debian/<br />
# cd jessie-chroot<br />
# tar cpf - . | docker import - debian<br />
# docker run -t -i --rm debian /bin/bash<br />
<br />
== 移除docker和镜像 ==<br />
<br />
如果你想完全移除Docker,你可以通过下面的步骤完成:<br />
<br />
{{注意|不要仅仅只是复制粘贴下面的命令而不知道你在干什么.}}<br />
<br />
检查正在运行的容器:<br />
<br />
# docker ps<br />
<br />
列出在主机运行的所有容器,为删除做准备:<br />
<br />
# docker ps -a<br />
<br />
停止一个运行的容器:<br />
<br />
# docker stop <CONTAINER ID><br />
<br />
杀死还在运行的容器:<br />
<br />
# docker kill <CONTAINER ID><br />
<br />
通过ID删除列出的所有容器:<br />
<br />
# docker rm <CONTAINER ID><br />
<br />
列出所有的docker镜像:<br />
<br />
# docker images<br />
<br />
通过ID删除所有镜像:<br />
<br />
# docker rmi <IMAGE ID><br />
<br />
删除所有docker数据 (清除目录):<br />
<br />
{{Accuracy|执行 # rm -R /var/lib/docker 将会留下已删除容器的btrfs子卷}}<br />
<br />
# rm -R /var/lib/docker<br />
<br />
== 有用的建议 ==<br />
<br />
抓取运行容器的IP地址:<br />
<br />
{{hc|<nowiki>$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container-name OR id> </nowiki>|<br />
172.17.0.37}}<br />
<br />
每个正在运行的容器,它们的名字和相关IP地址都能被列出来在 {{ic|/etc/hosts}}里用:<br />
<br />
{{bc|#!/usr/bin/env sh<br />
<nowiki>for ID in $(docker ps -q | awk '{print $1}'); do<br />
IP=$(docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "$ID")<br />
NAME=$(docker ps | grep "$ID" | awk '{print $NF}')<br />
printf "%s %s\n" "$IP" "$NAME"<br />
done</nowiki>}}<br />
<br />
== 故障排除 ==<br />
=== docker0 网桥无法获取 IP / internet 到容器 ===<br />
<br />
Docker会自己启用IP转发,但是默认 [[systemd-networkd]] 会覆盖对应的sysctl设置. 在网络配置文件里设置 {{ic|1=IPForward=yes}} . 查阅 [[Internet sharing#Enable packet forwarding]] 获取细节.<br />
<br />
=== 默认的允许的进程/线程数太少 ===<br />
<br />
如果你允许时得到下面的错误信息<br />
<br />
# e.g. Java<br />
java.lang.OutOfMemoryError: unable to create new native thread<br />
# e.g. C, bash, ...<br />
fork failed: Resource temporarily unavailable<br />
<br />
那么你可能需要调整被systemd允许的进程数. 默认的是 500 (see {{ic|system.conf}}), 这对需要允许几个容器的话太少了. [[Edit]] 并添加下面片段 {{ic|docker.service}} :<br />
<br />
{{hc|# systemctl edit docker.service|2=<br />
[Service]<br />
TasksMax=infinity<br />
}}<br />
<br />
=== 初始化显卡驱动错误: devmapper ===<br />
<br />
如果 ''systemctl'' 不能开启docker并提供了以下信息:<br />
<br />
Error starting daemon: error initializing graphdriver: devmapper: Device docker-8:2-915035-pool is not a thin pool<br />
<br />
那么尝试以下步骤来解决错误。停止docker服务,备份 {{ic|/var/lib/docker/}} (如果需要的话), 移除{{ic|/var/lib/docker/}}的内容, 尝试重启docker服务. 查阅 [https://github.com/docker/docker/issues/21304 GitHub issue] 获取更多细节.<br />
<br />
=== 无法创建到某文件的路径: 设备没有多余的空间了 ===<br />
如果你获取到的错误信息是像这样的话:<br />
<br />
ERROR: Failed to create some/path/to/file: No space left on device<br />
<br />
当创建或者运行Docker镜像时,尽管磁盘还有多余的空间。所以请确保:<br />
<br />
* [[Tmpfs]] 被禁用了并且有足够的内存分配. Docker可能会尝试写入文件到 {{ic|/tmp}} 但是失败了因为内存使用的限制和磁盘空间不足.<br />
* 如果你在使用 [[XFS (简体中文)]], 你可能得从相关入口移除 {{ic|noquota}} 挂载选项在 {{ic|/etc/fstab}}里 (通常是 {{ic|/tmp}} 和/或 {{ic|/var/lib/docker}} 在的地方). 查阅 [[Disk quota]] 获取更多信息, 特别是你计划使用和调整 {{ic|overlay2}} Docker 存储驱动.<br />
* XFS 的配额挂载选项在文件系统重新挂载时 ({{ic|uquota}}, {{ic|gquota}}, {{ic|prjquota}}, 等等.) 失败了. 为了为root文件系统启用配额挂载选项必须作为 [[Kernel parameters (简体中文)]] {{ic|1=rootflags=}}传递到initramfs. 之后, 它就不应该在 {{ic|/etc/fstab}}中的挂载选项中列出root ({{ic|/}}) 文件系统.<br />
<br />
{{注意|XFS配额和标准Linux[[Disk quota]], [http://inai.de/linux/adm_quota] 是有区别的。这里值得一读.}}<br />
<br />
=== kernel 4.19.1下无效的跨设备链接 ===<br />
<br />
如果像 ''dpkg'' 这样的命令在docker运行失败, 比如:<br />
<br />
dpkg: error: error creating new backup file '/var/lib/dpkg/status-old': Invalid cross-device link<br />
<br />
降级到 4.18.x 直到 [https://github.com/docker/for-linux/issues/480 这个问题] 解决. 更多信息可查阅 [https://bbs.archlinux.org/viewtopic.php?id=241866 Arch forum].<br />
<br />
== 查阅更多 ==<br />
<br />
* [https://www.docker.com Official website]<br />
* [https://docs.docker.com/engine/installation/linux/archlinux/ Arch Linux on docs.docker.com]<br />
* [http://opensource.com/business/14/7/docker-security-selinux Are Docker containers really secure?] — opensource.com</div>
Zombie110year
https://wiki.archlinux.org/index.php?title=Talk:Docker_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)&diff=571486
Talk:Docker (简体中文)
2019-04-18T03:23:45Z
<p>Zombie110year: 这个的 image 应该翻成 "镜像" 吧, 对于 docker 国内一般都是这么说的. 而且有些语序最好也修改一下.</p>
<hr />
<div></div>
Zombie110year