當Docker遇到systemd

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

近期在做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. 著作權.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.