1. 程式人生 > >解決 debian8 中 /etc/default/docker 無效問題

解決 debian8 中 /etc/default/docker 無效問題

問題

環境:Debian 8 + Docker 1.6
問題:

  • /etc/default/docker 中 DOCKER_OPTS 引數無效
  • /etc/default/docker didn’t work
  • DOCKER_OPTS do not work

過程

一開始,只是因為搭了一個 registry,想新增 --insecure-registry=192.168.11.33:5000 作為 docker daemon 的啟動引數。做法是在 /etc/default/docker 中新增 DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=192.168.11.33:5000"

這樣一行設定,設定 DOCKER_OPTS 引數。然後用 service 或 systemctl 重啟 docker。

然而,絲毫沒有起作用。docker client 對 registry 的訪問都會因為 tls 失敗。如果檢視 docker 的啟動引數:

➜  ~  ps -ef | grep docker
root      11085      1  0 20:32 ?        00:00:00 /usr/bin/docker -d -H fd://
angryro+  11148   1554  0 20:33 pts/1    00:00:00 grep --color=auto docker

會發現,DOCKER_OPTS 引數根本沒有被讀取。在 github 上找到這個

issue。作業系統也是 debian,docker 1.6.2 版本。原因是 /lib/systemd/system/docker.service 中根本沒有設定 EnvironmentFile 變數,意味著 /etc/docker/default 根本沒有被讀取。 issue 裡面的修改方法是,修改 /lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket [Service] EnvironmentFile=-/etc/default/docker #這裡添加了 EnvironmentFile 引數 ExecStart=/usr/bin/docker -d $DOCKER_OPTS -H fd:// # 增加了 $DOCKER_OPTS MountFlags=slave LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity [Install] WantedBy=multi-user.target

EnvironmentFile 變數後面 =- 表示 ignore_errors=yes 的意思,$DOCKER_OPTS 新增到 ExecStart 裡意思應該是讓 systemd 把 EnvironmentFile 裡的 $DOCKER_OPTS 作為 docker 的啟動引數。然而這對於我並不起作用,如果成功的同學請告知我一下。錯誤的原因是 $DOCKER_OPTS 好像沒有被解析,docker 直接以 /usr/bin/docker -d $DOCKER_OPTS -H fd:// 啟動,而不是 /usr/bin/docker -d --insecure-registry=192.168.11.33:5000 -H fd://,所以 docker 會有啟動的錯誤。

$ ps -ef | grep docker          # 檢視 docker 是否啟動及啟動引數
$ sudo systemctl status docker  # 檢視 docker 啟動狀態
$ sudo journalctl -u docker     # 檢視 docker 啟動日誌

看到 docker 關於 systemd 的文件,here. 這裡其實已經給了一個用 $OPTIONS 引數啟動的例子,只是當時比較執著,結果最後在一個 stackoverflow 上看到用 $OPTIONS 啟動的,我才這樣修改成功。記下下面幾條除錯的命令:

$ sudo systemctl show docker | grep EnvironmentFile
EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)
$ sudo systemctl status docker | grep Loaded
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
$ sudo grep EnvironmentFile /usr/lib/systemd/system/docker.service
EnvironmentFile=-/etc/default/docker

解決方案

/etc/default/docker 用 OPTIONS 選項,並相應修改 /lib/systemd/system/docker.service

➜  ~  cat /etc/default/docker      
# Docker Upstart and SysVinit configuration file

# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"

# Use DOCKER_OPTS to modify the daemon startup options.
#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/"

# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
OPTIONS=--insecure-registry 192.168.11.33:5000

➜  ~  cat /lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

➜  ~  sudo systemctl daemon-reload 

➜  ~  sudo systemctl restart docker

➜  ~  ps -ef | grep docker
root       5516      1 40 21:10 ?        00:00:02 /usr/bin/docker -d -H fd:// --insecure-registry 192.168.11.33:5000
angryro+   5552   1573  0 21:10 pts/0    00:00:00 grep --color=auto docker