安装DCOS,关于docker异常引发的调查
入门DCOS,刚开始安装,碰到了一个异常:
Bind for 0.0.0.0:9000 failed: port is already allocated.
调试这个问题花费了好长时间,因为无法通过netstat以及lsof看到究竟是什么应用占用了程序;后来我才发现原来是因为docker的原因;如果docker被run了两次
docker run -it -p : mesosphere/dcos-genconf:d932fc405eb80d8e5b-b7c22f7cfb481d9f95 /bin/bash
第一次失败,那么这个端口将会被一直占用,即使docker容器并没有创建并没有。解决办法就是重启docker服务:
service docker restart
(也有人说要sudo rm /var/lib/docker/network/files/local-kv.db,但是在我看来并不需要)
这个是docker里面的bug,看到这个issue在论坛里面讨论的热火朝天,但是这是2014年的事了。
再回过头来,那么既然是run两次失败会爆这个异常,那么,docker run失败原因是什么呢?
exec: "docker-proxy": executable file not found in $PATH.
这个异常的原因是docker启动后将会执行docker-proxy指令,但是在shell中加载的$PATH中无法找到对应的指令。与之类似是docker-runc无法找到,这个原因是在/usr/libexec/docker下面,在安装的时候可能因为没有完全安装导致的两个link没有安装上,用如下方法进行修补:
cd /usr/libexec/docker/
sudo ln -s docker-proxy-current /usr/bin/docker-proxy
daocker执行应该首先回到/usr/libexec/docker下面找执行文件,没有,再到$PATH定义的路径下找,再没有,则报错。
另外,当发生以下异常:
/usr/bin/docker-current: Error response from daemon: shim error: docker-runc not installed on system.
也是需要创建软连接方式来解决:
sudo ln -s docker-runc-current /usr/bin/docker-runc
prestart hook 1 caused \\\"error running hook: exit status 1
这个问题如果这样贴出来,是没有意义的,想要看更加详细的错误信息:
service docker status -l
journalctl -xe
这样结合起来可以看到更加详细的信息。
看到的错误信息:Failed to open file '/sys/class/net/vethf6a3cb0/operstate'
vethXXX应该是docker内部的网络接口的名称;初步推测应该是因为某个异常导致的docker内部的网卡没有启动起来。
在调查的过程中发现了一个命令:brctl show,用来显示网桥,其实docker默认的网桥是docker0(docker0并不是一个网络接口,而是一个网桥)。
至于如何来创建网桥
https://docs.docker.com/engine/userguide/networking/default_network/build-bridges/
以及相关docker的文档:
https://docs.docker.com/v1.7/articles/networking/
https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/22
后来深入跟踪这个问题,发现其实是因为不知道什么原因会增加一个override.conf,这个override.conf将storage-driver设置成了overlay(难道是因为设docker_proxy?),至于发现这个的过程是这样的,比较docker info的差异,发现有问题的机器采用的是overlay的方式,OK机器采用的是devicemapper的方式;然后我又尝试修改为devicemapper,方式就是在/etc/docker/daemon.json文件中写入
{"storage-driver": "devicemapper"}
但是启动docker的时候爆了一个异常:
unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: storage-driver: (from flag: overlay, from file: devicemapper)\n"
这里关于option我还想了半天,最后是怀疑是启动docker服务的时候应该指定了storage-driver参数,和我在配置文件中的冲突了。我还手动启动了一下dockerd --storage-drive=devicemapper,在docker run dcos的image没有问题。
然后我使用了service docker status,来查看docer服务的详细内容,才发现status里面包含了非常丰富的内容,之前只是记得会显示执行的指令以及参数选项(option)
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/docker.service.d
└─override.conf
Active: activating (auto-restart) (Result: exit-code) since Sat -- :: CST; 2s ago
Docs: http://docs.docker.com
Process: ExecStart=/usr/bin/dockerd --storage-driver=overlay (code=exited, status=/FAILURE)
Process: ExecStartPre=/sbin/ip link del docker0 (code=exited, status=/SUCCESS)
Main PID: (code=exited, status=/FAILURE)
注意加粗三句话,所有的问题都是通过三句话来解开的:
第一句话是说明服务启动的文件,我进去看了,发现里面的storage-driver的配置文件里面默认配置的就是devicemapper。这个过程稍微有点复杂:/usr/lib/systemd/system/docker.service里面指定了storage的配置文件(/etc/sysconfig/docker-storage),需要查看storage的配置文件,但是呢这个配置文件还是多重继承的意思,总是最后根上是/usr/share/container-storage-setup/container-storage-setup文件,打开一看:STORAGE_DRIVER=devicemapper,这说明默认就是devicemapper的方式,那么为什么通过docker info看到的方式是overlay呢?
第二句话是说明配置项已经被覆盖了,覆盖的配置文件是 /etc/systemd/system/docker.service.d/override.conf,里面内容是:
art=always
StartLimitInterval=
RestartSec=
ExecStartPre=-/sbin/ip link del docker0
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=overlay
第三句话(还有下面的process语句)是真正的执行的指令和参数,其实就是override.conf里面定义的内容。
看到这里我明白了,原来docker的启动过程被覆盖了。于是我将override.conf文件重命名了,然后重启docker服务,爆了提示:
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
daemon-reload是指重新加载服务的核心配置文件,即单元文件(里面定义了服务以来单元以及服务定义),这里因为我已经把服务的单元文件给删掉了,所以需要重新加载配置文件(看来linux是把单元文件加载到内存中,每次重启服务并不重新读取单元文件)。重启之后,搞定了。
再看service docker status:
Redirecting to /bin/systemctl status -l docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Sat -- :: CST; 19s ago
Docs: http://docs.docker.com
Main PID: (dockerd-current)
CGroup: /system.slice/docker.service
├─ /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald --signature-verification=false
└─ /usr/bin/docker-containerd-current -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 --runtime-args --systemd-cgroup=true
别问我为什么会有override.conf,我也不知道他是怎么出现的。
但是如果提到了override.conf,则需要提到了systemd,其实systemd是Linux的一组基础组建的工具集合(替代centos之前的initd),用于启动守护进程,监控服务等一系列操作系统的基础功能。
服务(属于单元的一种)一般是打包安装,为了不需要修改打包原生的配置文件,systemd提供了一种可以在外部覆盖原生配置文件的方式,这种就是:
systemctl edit unit
修改之后,就会生成/etc/systemd/system/unit.d/override.conf(unit.d在我们这里就是docker.service.d)
后来,安装dcos熟练了,才知道,这是因为dcos在安装的时候会把master以及agent节点都配置为overlay,而修改配置侵入最小的方式就是采用override.conf的方式。我之前的问题就是在于把boot节点(setup节点)同时作为了master节点,所以有此问题。
安装DCOS,关于docker异常引发的调查的更多相关文章
- Docker异常:/lib/x86_64-linux-gnu/libnss_files.so.2: symbol __libc_readline_unlocked, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
当使用docker cp 将容器内数据拷贝至主机时,或是使用docker export 命令归档容器文件时,出现下述异常: Error response from daemon: error proc ...
- 在Ubuntu 14.04安装和使用Docker
Docker是一个开源软件,它可以把一个Linux应用和它所依赖的一切(比如配置文件)都封装到一个容器.然而,Docker与虚拟机不同,它使用了沙箱机制,Docker容器不运行操作系统,它共享主机上的 ...
- [转]在Ubuntu 14.04安装和使用Docker
在Ubuntu 14.04安装和使用Docker 作者:chszs,版权所有,未经同意,不得转载.博主主页:http://blog.csdn.net/chszs Docker是一个开源软件,它可以把一 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- hadoop安装遇到的各种异常及解决办法
hadoop安装遇到的各种异常及解决办法 异常一: 2014-03-13 11:10:23,665 INFO org.apache.hadoop.ipc.Client: Retrying connec ...
- centos中MySQL,VmTools安装,使用及异常
Linux(CentOS)中常用软件安装,使用及异常--MySQL,VmTools 本文主要是为了记录在工作中遇到的常用软件的安装过程,方便以后遇到相同情形时可以快速的查阅.主要讲述了MySQL, V ...
- ubuntu16.04安装最新版docker、docker-compose、docker-machine
安装前说明: 本文将介绍在ubuntu16.04系统下安装和升级docker.docker-compose.docker-machine. docker:有两个版本:docker-ce(社区版)和do ...
- Centos7下安装与卸载docker应用容器引擎
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- Docker的安装和使用说明——Docker for Windows
一.Docker安装 1.1官方方法 官方下载页面:http://www.docker.com/products/docker#/windows 官方下载地址:https://download.doc ...
随机推荐
- EasyNVR无插件直播服务器软件接口调用返回“Unauthorized”最简单的处理方式
背景需求 对于EasyNVR的受众群体十分的广泛,不仅仅有将EasyNVR作为视频直播平台直接使用的,更多的是使用EasyNVR的对应功能集成到自身系统.对于前者,只需要将软件的使用功能搞清楚即可,对 ...
- 注册会计师带你用Python进行探索性风险分析(一)
https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/78519378
- 不怕慢 就怕站 不怕单线程 不怕 裸露ip
import sys import os import requests import threading from time import sleep from bs4 import Beautif ...
- 为system对象添加扩展方法
////扩展方法类:必须为非嵌套,非泛型的静态类 public static class DatetimeEx { //通过this声明扩展的类,这里给DateTime类扩展一个Show方法,只有一个 ...
- Django导出excel中文乱码解决方案
Django官方文档有关于怎么生成csv文件的方法 import csv from django.http import HttpResponse def some_view(request): # ...
- ob 函数讲解
ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面履行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给涉猎器.下面我说说ob的基 ...
- easy_install和pip的安装及使用
在终端输入命令报错后,在网上找到了这篇博客,用easy_install命令安装pip,问题解决 Fatal error in launcher: Unable to create process us ...
- SpringBoot学习笔记(4):添加自定义的过滤器
SpringBoot:学习笔记(4)——添加自定义的过滤器 引入自定义过滤器 SpringBoot提供的前端控制器无法满足我们产品的需求时,我们需要添加自定义的过滤器. SpringBoot添加过滤器 ...
- ubuntu14.04下svn版本管理系统的安装及常用命令的使用整理
ubuntu14.04下安装svn$sudo apt-get install subversion 执行这一步就安装完成了,在ubuntu先安装很方便 安装完成后,创建版本库目录,由于是本地环境,就在 ...
- Android SDK上手指南 2:用户界面设计
http://mobile.51cto.com/ahot-419184.htm 内容简介 我们将为应用程序项目添加布局方案,在这方面XML与Eclipse ADT接口将成为工作中的得力助手——不过在后 ...