這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
近期在做Kubernetes叢集的升級的相關實驗,即從原先的K8s 1.3.7版本升級到最新的K8s 1.5.1版本。k8s自1.4版本開始引入kubeadm,試圖簡化K8s的安裝和使用門檻,提升開發人員體驗。但kubeadm僅支援16.04及以上的Ubuntu版本,於是我們在升級K8s叢集前會遇到另外一個問題:Ubuntu 16.04已經由Upstart初始化系統換成了systemd初始化系統,Ubuntu 16.04上的Docker engine的使用和配置方法與以前在Ubuntu 14.04上將有所不同。Docker是K8s支援的容器引擎之一,也是目前最主流的容器引擎,弄清楚Docker的配置和使用也是後續用好K8s的前提之一。於是這裡打算記錄一下Docker與Systemd是如何相生共存的^0^。
一、Ubuntu 16.04安裝Docker
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)
kubeadm文檔中認為Docker 1.11.2版本與之更配喲,不過對於更新的版本似乎配合起來也沒有什麼大問題。我們這裡安裝目前可以找到的最新stable release: docker 1.12.5:
# docker versionClient: 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/amd64Server: 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的成熟,其方法趨於穩定。官方提供的在Ubuntu安裝Docker的方法成為主流,我們這裡也不例外的參考這一方法。不過這一方法有一前提,那就是你最好配備的“加(fan)速(qiang)器(qi)”,否則好慢,甚至是不成功。
詳細步驟如下:(熟悉之的觀眾可略過之^_^)
1、從keyserver擷取key
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609DExecuting: /tmp/tmp.OoFaQ0V0gx/gpg.1.sh --keyserverhkp://p80.pool.sks-keyservers.net:80--recv-keys58118E89F3A912897C070ADBF76221572C52609Dgpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.netgpg: key 2C52609D: public key "Docker Release Tool (releasedocker) " importedgpg: Total number processed: 1gpg: imported: 1 (RSA: 1)
2、添加Docker源
建立/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
3、安裝Docker engine
執行安裝命令,安裝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 dockerroot 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服務的使能與啟停
控制Docker服務開機自啟以及啟停操作的指令碼已經由upstart初始化系統的/etc/init.d/docker變為了systemd初始化系統的/lib/systemd/system/docker.service。
在systemd下,docker service的指令碼路徑通過下面命令可以找到:
# systemctl show --property=FragmentPath dockerFragmentPath=/lib/systemd/system/docker.service
通過下面命令可以查看docker service的是否是開機自啟:
# systemctl is-enabled dockerenabled
通過systemctl enable和disable命令可以使能開機自啟或取消開機自啟。
傳統Ubuntu通過service docker start/stop/restart啟動、停止或重啟服務,換到systemd後,我們需要用systemctl start/stop/restart docker來啟動、停止或重啟服務。
三、Docker的EnvironmentFile
以前我們給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_OPTSEnvironmentFile=-/etc/default/docker
習慣了使用/etc/default/docker配置DOCKER_OPTS等配置,於是在EnvironmentFile中直接使用了該檔案。
///etc/default/dockerDOCKER_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-reloadsystemctl restart docker
你會發現配置生效了。
經常接觸/etc/default/docker的人會發現,上述檔案中的http_proxy等變數前面的export關鍵字沒有了。沒錯,在systemd環境下,不再需要export了,如果加上export,反倒會導致配置不生效。
四、Docker引擎的日誌
最後,Docker引擎的日誌哪裡去了?以前不是在/var/log/upstart/下面嗎?Ubuntu 16.04中,這個目錄下連docker字樣的影兒都沒看到。
在systemd下面,我們需要搬出journalctl工具。想看docker service的即時日誌,請執行:
# journalctl -u docker -f
看曆史日誌:
# journalctl --since "1 hour ago" -u docker
更多journalctl用法,可以參考其man pages。
2016, bigwhite. 著作權.