近期在做 集群的升级的相关试验,即从原先的 K8s 1.3.7 版本升级到最新的 K8s 1.5.1 版本。k8s 自 1.4 版本开始引入 ,试图简化 K8s 的安装和使用门槛,提升开发者体验。但 kubeadm 仅支持 16.04 及以上的 Ubuntu 版本,于是我们在升级 K8s 集群前会遇到另外一个问题:Ubuntu 16.04 已经由 初始化系统换成了 初始化系统,Ubuntu 16.04 上的 Docker engine 的使用和配置方法与以前在 Ubuntu 14.04 上将有所不同。Docker 是 K8s 支持的容器引擎之一,也是目前最主流的容器引擎,弄清楚 Docker 的配置和使用也是后续用好 K8s 的前提之一。于是这里打算记录一下 Docker 与 Systemd 是如何相生共存的 ^0^。
Aliyun 目前上没有提供官方 Ubuntu 16.04 ECS,最高仅支持到 Ubuntu 14.04.4。因此在 Aliyun ECS 上用 16.04 需要手工 upgrade 到 16.04(不过建议在 upgrade 前做个 snapshot,一旦 upgrade 失败,好恢复)。升级后的 Ubuntu 环境信息如下:
- Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-58-generic x86_64)
中认为 Docker 1.11.2 版本与之更配哟,不过对于更新的版本似乎配合起来也没有什么大问题。我们这里安装目前可以找到的最新 stable release: docker 1.12.5:
- # docker version
- Client:
- Version: 1.12.5
- API version: 1.24
- Go version: go1.6.4
- Git commit: 7392c3b
- Built: Fri Dec 16 02:42:17 2016
- OS/Arch: linux/amd64
- Server:
- Version: 1.12.5
- API version: 1.24
- Go version: go1.6.4
- Git commit: 7392c3b
- Built: Fri Dec 16 02:42:17 2016
- OS/Arch: linux/amd64
上面是你安装 docker 成功后,才能输出的 version 信息哦 ^0^。
安装 Docker 的方法随着 docker 的快速演进也在变化中,随着 Docker 的成熟,其方法趋于稳定。官方提供的 成为主流,我们这里也不例外的参考这一方法。不过这一方法有一前提,那就是你最好配备的 "加 (fan) 速(qiang)器(qi)",否则好慢,甚至是不成功。
详细步骤如下:(熟悉之的观众可略过之 ^_^)
- # apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- Executing: /tmp/tmp.OoFaQ0V0gx/gpg.1.sh --keyserver
- hkp://p80.pool.sks-keyservers.net:80
- --recv-keys
- 58118E89F3A912897C070ADBF76221572C52609D
- gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net
- gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) <docker@docker.com>" imported
- gpg: Total number processed: 1
- gpg: imported: 1 (RSA: 1)
创建 / etc/apt/sources.list.d/docker.list 文件,写入:
- deb https: //apt.dockerproject.org/repo ubuntu-xenial main
执行 apt-get update 更新包信息:
- ... ...
- Get:11 https://apt.dockerproject.org/repo ubuntu-xenial InRelease [30.2 kB]
- Fetched 30.2 kB in 2s (14.1 kB/s)
- Reading package lists... Done
执行安装命令,安装 Docker engine:
- # apt install docker-engine
- ... ...
- Setting up docker-engine (1.12.5-0~ubuntu-xenial) ...
- Setting up liberror-perl (0.17-1.2) ...
- Setting up git-man (1:2.7.4-0ubuntu1) ...
- Setting up git (1:2.7.4-0ubuntu1) ...
- Processing triggers for libc-bin (2.23-0ubuntu5) ...
- Processing triggers for systemd (229-4ubuntu13) ...
- Processing triggers for ureadahead (0.100.0-19) ...
验证安装结果:
- # which docker
- /usr/bin/docker
- # docker version
- ... ... //输出和上一节相同的结果
- # ps -ef|grep docker
- root 22132 1 0 11:18 ? 00:00:00 /usr/bin/dockerd -H fd://
- root 22162 22132 0 11:18 ? 00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc
安装后,Docker 引擎自动启动了。
控制 Docker 服务开机自启以及启停操作的脚本已经由 upstart 初始化系统的 / etc/init.d/docker 变为了 systemd 初始化系统的 / lib/systemd/system/docker.service。
在 systemd 下,docker service 的脚本路径通过下面命令可以找到:
- # systemctl show --property=FragmentPath docker
- FragmentPath=/lib/systemd/system/docker.service
通过下面命令可以查看 docker service 的是否是开机自启:
- # systemctl is-enabled docker
- enabled
通过 systemctl enable 和 disable 命令可以使能开机自启或取消开机自启。
传统 Ubuntu 通过 service docker start/stop/restart 启动、停止或重启服务,换到 systemd 后,我们需要用 systemctl start/stop/restart docker 来启动、停止或重启服务。
以前我们给 Docker engine 设置一个 http_proxy、设置–insecure-registry 或–registry-mirror、配置一个 dns 啥的,都可以通过 / etc/default/docker 中的 DOCKER_OPTS 以及相关 export 的环境变量实现。但在 Ubuntu 16.04 下这个配置文件变成了这样:
- # Docker Upstart and SysVinit configuration file
- #
- # THIS FILE DOES NOT APPLY TO SYSTEMD
- #
- # Please see the documentation for "systemd drop-ins":
- # https://docs.docker.com/engine/articles/systemd/
- ... ...
问题来了!我们怎么配置 Docker engine 呢?Docker 官方推荐在如下路径下面创建配置文件(比如 http-proxy.conf),以 override 默认的 docker.service 文件中的配置:
- /etc/systemd/system/docker.service.d
不过经测试后(after systemctl daemon-reload; systemctl restart docker),发现并不生效。
我们来使用 EnvironmentFile 对 Docker Engine 进行配置。编辑 / lib/systemd/system/docker.service 文件,添加如下内容:
- ExecStart = /usr/bin / dockerd - H fd: // $DOCKER_OPTS
- EnvironmentFile = -/etc/
- default / docker
习惯了使用 / etc/default/docker 配置 DOCKER_OPTS 等配置,于是在 EnvironmentFile 中直接使用了该文件。
- ///etc/default/docker
- DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
- # If you need Docker to use an HTTP proxy, it can also be specified here.
- #export http_proxy="http://127.0.0.1:3128/"
- http_proxy="http://xxxxx"
- https_proxy="xxxx"
- no_proxy="127.0.0.1,localhost"
保存后,执行:
- systemctl daemon-reload
- systemctl restart docker
你会发现配置生效了。
经常接触 / etc/default/docker 的人会发现,上述文件中的 http_proxy 等变量前面的 export 关键字没有了。没错,在 systemd 环境下,不再需要 export 了,如果加上 export,反倒会导致配置不生效。
最后,Docker 引擎的日志哪里去了?以前不是在 / var/log/upstart / 下面么?Ubuntu 16.04 中,这个目录下连 docker 字样的影儿都没看到。
在 systemd 下面,我们需要搬出 工具。想看 docker service 的实时日志,请执行:
- # journalctl -u docker -f
看历史日志:
- # journalctl --since "1 hour ago" -u docker
更多 journalctl 用法,可以参考其 。
© 2016,bigwhite. 版权所有.
来源: