DOCKER FAQ系列(一) (基础篇)

写在前头

(编者注: 部分摘自网络,如有雷同那各位看官就凑活看吧哇哈哈)

docker已经逐渐成为测试人员的基本技能了,在我们使用docker的时候,掌握一些原理,分析一些问题原因对我们能力提升有巨大的帮助。


概念篇

宿主如果和容器系统不同的话,那不是和虚拟机一样,一层层的调用,那么 DOCKER 和虚拟机还有什么差别?(蜗牛语录)

要把 Windows 和 Linux 分清楚,更要把内核(kernel)和用户空间(userland)分清楚。


容器内的进程是直接运行于宿主内核的,这点和宿主进程一致,只是容器的 userland 不同,容器的 userland 由容器镜像提供,也就是说镜像提供了 rootfs。


假设宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的进程会直接向 Ubuntu 宿主内核发送 syscall,而不会直接或间接的使用任何 Ubuntu 的 userland 的库。


这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。


还以上面的例子去考虑,虚拟机中,CentOS 的进程发送 syscall 内核调用,该请求会被虚拟机内的 CentOS 的内核接到,然后 CentOS 内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是 Ubuntu 的内核及 userland 的库去执行。


而且,Linux 和 Windows 在这点上非常不同。Linux 的进程是直接发 syscall 的,而 Windows 则把 syscall 隐藏于一层层的 DLL 服务之后,因此 Windows 的任何一个进程如果要执行,不仅仅需要 Windows 内核,还需要一群服务来支撑,所以如果 Windows 要实现类似的机制,容器内将不会像 Linux 这样轻量级,而是非常臃肿。看一下微软移植的 Docker 就非常清楚了。


所以不要把 Docker 和虚拟机弄混,Docker 容器只是一个进程而已,只不过利用镜像提供的 rootfs 提供了调用所需的 userland 库支持,使得进程可以在受控环境下运行而已,它并没有虚拟出一个机器出来。

具体参考: https://www.docker-cn.com/what-docker


总说看官方文档,可是 DOCKER 官网文档经常被墙,看不了怎么办?

我们可以本地运行 Docker 官方文档的网站,以 docker 的方式:

$ docker run -d -p 80:4000 docs/docker.github.io

这样访问 Docker 宿主的 80 端口,如 http://localhost,就会看到官网文档了


DOCKER 1.8 以后版本都有什么改进么?

  • 1.10: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.10.0-changelog.md

  • 1.11: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.11.0-changelog.md

  • 1.11.1: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.11.1-changelog.md

  • 1.12: https://github.com/allencloud/docker-changelog-chinese/blob/master/docker-1.12.0-changelog.md

  • 1.13: https://blog.lab99.org/post/docker-2016-11-14-what-is-new-in-docker-1-13.html


安装和配置问题

如何安装,安装哪个版本?

首先,Docker 有好几个版本,社区版(Community Edition)、企业基础版(Enterprise Edition Basic)、企业标准版(Enterprise Edition Standard)、企业高级版(Enterprise Edition Advanced)。对于我们一般学习使用而言,使用社区版就已足够,所以记住CE就可以了。


其次,我们会看到一堆平台特定的版本,Docker for Mac、Docker for Windows、Docker Toolbox、Docker for Azure、Docker for AWS 等等,还有一堆不同 Linux 的发行版。那我们应该用哪个?其实不难选择,这都是平台特定的东西嘛,选择自己平台就完了?:


macOS 就选择 Docker for Mac;    阿里云(未及时更新):https://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/stable/Linux 就选择自己平台的 Docker 源:    Ubuntu: https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/    Debian: https://docs.docker.com/engine/installation/linux/docker-ce/debian/    CentOS: https://docs.docker.com/engine/installation/linux/docker-ce/centos/    Fedora: https://docs.docker.com/engine/installation/linux/docker-ce/fedora/Windows 要麻烦些:    如果是 Windows 10 专业版、企业版、教育版,并且版本在 10586 以后,并且不打算在 Docker 运行同时再运行其它虚拟机的情况下,可以装 Docker for Windows。        阿里云(未及时更新):https://mirrors.aliyun.com/docker-toolbox/windows/docker-for-windows/stable/    其它情况都装 Docker Toolbox        阿里云:https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/如果是特定云服务平台,可以考虑特定服务平台的版本(当然,这不是必须):    AWS:Docker for AWS    Azure:Docker for Azure


最后是发布通道,从2017年初开始,也就是从 1.13 以后,Docker 使用了新的版本号规则,将采用类似 Ubuntu 那种 <年>.<月> 的形式,比如 17.03, 17.06 等。并且,将发布通道分为前沿版本(Edge)和稳定版本(Stable)。前沿通道将基本每个月发布一个版本,而稳定通道将基本每3个月发布一个版本。这样 Docker 的发布将有规律可寻。对于喜欢尝鲜的可以选择前沿版本,对于需要稳定的,可以选择稳定版本。


对于离线安装docker的(比如一些机器由于内网隔离),可以从官方下载 install with prebuilt 方式来进行安装,centos的使用rpm包安装, ubuntu/debian使用deb安装

DOCKER PULL 好慢啊怎么办?


首先,要“感谢”伟大的墙及其亲属。

然后,我们可以使用 Docker 镜像加速器来解决这个问题,加速器就是镜像、代理的概念。国内有不少机构提供了免费的加速器以方便大家使用,这里列出一些常用的加速器服务:


Docker 官方的中国镜像加速器:从2017年6月9日起,Docker 官方提供了在中国的加速器,以解决墙的问题。不用注册,直接使用加速器地址:https://registry.docker-cn.com 即可。中国科技大学的镜像加速器:中科大的加速器不用注册,直接使用地址 https://docker.mirrors.ustc.edu.cn/ 配置加速器即可。进一步的信息可以访问:http://mirrors.ustc.edu.cn/help/dockerhub.html?highlight=docker阿里云加速器:注册阿里云开发账户(免费的)后,访问这个链接就可以看到加速器地址: https://cr.console.aliyun.com/#/acceleratorDaoCloud 加速器:注册 DaoCloud 账户(支持微信登录),然后访问: https://www.daocloud.io/mirror#accelerator-doc


Ubuntu 14.04 配置加速器(或其它使用 Upstart 的系统)

Ubuntu 14.04 是使用 upstart 进行系统初始化的,对于这类系统,可以用通过编辑配置文件的方法来配置加速器。


如果是 Ubuntu 14.04,那么编辑 /etc/default/docker,在里面寻找 DOCKER_OPTS 环境变量设置的这一行,在其后添加 -–registry-mirror=<加速器地址>。如果发现该行已被注释,或者不存在该行,那么新添一行即可。

比如,在使用官方源安装了 docker-engine 后,会建立一个默认的 /etc/default/docker,其中相关 DOCKER_OPTS 的行是这样的:


# Use DOCKER_OPTS to modify the daemon startup options.#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"


假设我们的加速器地址为 https://registry.docker-cn.com,我们添加一行配置,将其改为

# Use DOCKER_OPTS to modify the daemon startup options.#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"


保存文件后,重启 Docker 引擎:

$ sudo service docker restartdocker stop/waitingdocker start/running, process 4222


重启成功后,确认一下配置是否已经生效:

$ sudo ps -ef | grep dockerdroot      3620     1  0 04:26 ?        00:00:00 /usr/bin/dockerd --registry-mirror=https://registry.docker-cn.com --raw-logs


Ubuntu 16.04 或 CentOS 7+ 配置加速器(或其它使用 Systemd 的系统)

Ubuntu 16.04 和 CentOS 7 这类系统都已经开始使用 systemd 进行系统初始化管理了,对于使用 systemd 的系统,应该通过编辑服务配置文件 docker.service 来进行加速器的配置。


在启用服务后

$ sudo systemctl enable docker


我们可以使用

$ service docker status


得到如下输出:

root@iflytek-repo:~# service docker status    ● docker.service - Docker Application Container Engine    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)    Active: active (running) since 四 2018-01-11 00:22:33 CST; 3 days ago        Docs: https://docs.docker.com    Main PID: 8558 (dockerd)        Tasks: 190    Memory: 1.3G        CPU: 54min 20.277s    CGroup: /system.slice/docker.service            ├─ 8558 /usr/bin/dockerd -H fd:// --insecure-registry harbour.iflytek.com            ├─ 8565 docker-containerd --config /var/run/docker/containerd/containerd.toml            ├─14069 docker-containerd-shim -namespace moby -workdir /ext/docker/containerd/d


可以看到 该docker service 加载了服务配置文件地址为:

/lib/systemd/system/docker.service$ vim /lib/systemd/system/docker.service


在文件中找到 ExecStart= 这一行,并且在其行尾添加上所需的配置。假设我们的加速器地址为 https://registry.docker-cn.com,那么可以这样配置:

ExecStart=/usr/bin/dockerd --registry-mirror=https://registry.docker-cn.com


注: Docker 1.12 之前的版本,dockerd 应该换为 docker daemon,更早的版本则是 docker -d。不过还在用那些版本的童鞋,升级吧……?

保存退出后,重新加载配置并启动服务:

sudo systemctl daemon-reloadsudo systemctl restart docker


如果配置成功,生效后就会在这里看到自己所配置的加速器。

在 1.13 版本以后,可以直接 docker info 查看,如果配置成功,加速器 Registry Mirror 会在最下面列出来。


如果重启后发现无法启动 docker 服务,检查一下服务日志,看看是不是之前执行过那些加速器网站的脚本,如果有做过类似的事情,检查一下是不是被建立了 /etc/docker/daemon.json 以配置加速器,如果是的话,删掉这个文件,然后在重启服务。


使用配置文件是件好事,比如修改配置不必重启服务,只需发送 SIGHUP 信号即可。但需要注意,目前在 dockerd 中使用配置文件时,无法输出当前生效配置,并且当 dockerd 的参数和 daemon.json 文件中的配置有所重复时,并不是一个优先级覆盖另一个,而是会直接导致引擎启动失败。很多人发现配了加速器后 Docker 启动不起来了就是这个原因。解决办法很简单,去掉重复项。不过在这些问题解决前,建议使用修改 docker.service 这类做法来实现配置,而不是使用配置文件 daemon.json。方便 ps -ef | grep dockerd 一眼看到实际配置情况。


docker pull 拉去我们的私有镜像的时候 报 Error Response Https?

在公司内网我们经常会自己搭建如 harbour这样的镜像仓库,为了省事,我们一般不会去配置HTTPS,即 我们默认提供 http://harbour.dockerregistry.com 这样域名的仓库


当我们使用

docker pull harbour.dockerregistry.com/library/ubuntu:latest

这样的命令时候,可能会报 Error Response Https…

这里的原因是docker pull 默认会使用https协议去拉去镜像仓库的镜像,无论你的仓库是否开启 https。


docker目前不建议使用非HTTPS的HTTP方式,怎么修改?

参照上一节添加加速器的方式,我们只需要在 DOCKER_OPTS中添加:

UPSTART:

# Use DOCKER_OPTS to modify the daemon startup options.#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com --insecure-registry=harbour.dockerregistry.com"


SYSTEMD:

ExecStart=/usr/bin/dockerd --registry-mirror=https://registry.docker-cn.com --insecure-registry=harbour.dockerregistry.com


怎么修改了 docker 服务配置后不起作用?

改动真的生效了么?在宿主上运行一下 ps -ef | grep dockerd 看看,自己做的那些配置有么?没有的话就说明没有生效,那么就要检查原因了。

首先,改完配置重启服务了么?虽然这个问题看着很小白,但是确实很多人犯了这个小白的错误。

Ubuntu 14.04: sudo service docker restartUbuntu 16.04, CentOS 7: sudo systemctl daemon-reload && sudo systemctl restart docker


另外,你改对了配置文件了么?

不少人懒得看英文文档,百度个文章就照着配,既不管百度得到的文章所讲的系统,也没注意版本,而且中文文章往往自身表达描述不清楚,很多想当然的东西,结果无数坑。这么百度的人,很有可能压根就改错了文件。


猜你喜欢

转载自blog.csdn.net/itest_2016/article/details/79089018
今日推荐