1. 程式人生 > >Docker 被重啟故障

Docker 被重啟故障

在生產環境中,docker和flannel都是通過systemd管理的,發生了一個奇怪的事情,當重啟網路外掛flannel的時候,docker daemon也發生了重啟,這個很奇怪,按道理是各自獨立執行的。細查日誌,當重啟flannel時候systemd也把docker重啟了。

# systemctl list-dependencies docker.service   
docker.service
● ├─docker-cleanup.timer
● ├─docker-storage-setup.service
● ├─flanneld.service
● ├─system.slice
● └─basic.target
● ├─microcode.service ● ├─rhel-autorelabel-mark.service ● ├─rhel-autorelabel.service ● ├─rhel-configure.service ● ├─rhel-dmesg.service ● ├─rhel-loadmodules.service ● ├─selinux-policy-migrat

奇怪的發現了docker依賴的竟然有flanneld
再看看docker的systemd配置

# ll /etc/systemd/system/docker.service.requires/
lrwxrwxrwx 1 root root 40 823 08:00 flanneld.service -> /usr/lib/systemd/system/flanneld.service

確實是依賴了flannel,那這個軟鏈是怎麼生成的呢?答案是開啟自啟動system enable搗的鬼,
當設定了flannel的開機自啟動後會生成下面兩條記錄

# systemctl enable flanneld 
Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system
/flanneld.service. Created symlink from /etc/systemd/system/docker.service.requires/flanneld.service to /usr/lib/systemd/system/flanneld.service.

那麼為什麼會生成呢?深入瞭解systemd的管理

# cat  /usr/lib/systemd/system/flanneld.service 
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/opt/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker


Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

在install模組裡面,有個RequiredBy,他是指定依賴這個程式的所有unit的列表。當enable的時候會生成requires目錄。

終於找到原因了,解決的辦法無非是註釋這行,或者開機自啟動放到rc目錄下面,而不通過enable的方式。