1. 存储问题

1.1 挂载目录权限问题

  • 在使用swarm创建服务的时候要挂载存储来获取运行文件,及写日志出去。
  • 可运行文件相当于在集群中所有地方应该都能访问到,所以使用了NFS文件系统,在集群中所有机器上都挂载
  • 写日志出去,挂载一个可读可写的目录,在容器内部生成日志目录结构。
  • 但是发现打出来的日志权限都是root:root,其他用户可能无法查看,故查看挂载设置。挂载设置上唯有RW相关,比的都不相干
"Mounts": [
{
"Type": "bind",
"Source": "/data/service/0_yztest_0-0-4",
"Destination": "/home/service/0_yztest_0-0-4",
"Mode": "",
"RW": false,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/log/container",
"Destination": "/home/service/0_yztest_0-0-4/log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
  • 发现容器内是root运行的,导致创建的文件是root:root。发现在运行容器或服务的时候可以指定运行用户,但是发现该用户指的是容器内部镜像的用户,如果用宿主机用户,会报错。参考:https://github.com/moby/moby/issues/22323
[container]$ docker run --help | grep user
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
--userns string User namespace to use
[container]$ docker service create --help | grep user
--group list Set one or more supplementary user groups for the container
-u, --user string Username or UID (format: <name|uid>[:<group|gid>]) 在运行服务的时候如果指定宿主机用户和用户组,而容器内部又没有该用户的时候会报错:
"starting container failed: linux spec user: unable to find user cloud: no matching entries in passwd file"

1.2 容器启动失败read-only file system错误

  • 容器启动报错如下,奇怪的是基本一样的服务,有些能成功,有些却报错失败了。而且看不出来规律。
  • 容器启动不成功,报错:read-only file system。以多个关键字搜索都无果。最后没办法把挂载的volume改成了可读可写,可以启动成功了。
time="2018-04-18T10:25:06.513315356+08:00" level=error msg="fatal task error" error="starting container failed: OCI runtime create failed: container_linux.go:348: starting container process caused \"process_linux.go:402: container init caused \\\"rootfs_linux.go:58: mounting \\\\\\\"/data/docker/volumes/log-724_5703.0.11416.1523967154/_data\\\\\\\" to rootfs \\\\\\\"/data/docker/overlay2/39f5cf87ad44b70665f4ebbd30be797606b281e47bf86aadece71b1c1f4290d0/merged\\\\\\\" at \\\\\\\"/data/docker/overlay2/39f5cf87ad44b70665f4ebbd30be797606b281e47bf86aadece71b1c1f4290d0/merged/home/service/0_test_0-0-10/log\\\\\\\" caused \\\\\\\"mkdir /data/docker/overlay2/39f5cf87ad44b70665f4ebbd30be797606b281e47bf86aadece71b1c1f4290d0/merged/home/service/0_test_0-0-10/log: read-only file system\\\\\\\"\\\"\": unknown" module=node/agent/taskmanager node.id=21grc3cvehywhuz9paqqcv7hr service.id=6aop0ts679fva758dattmlxjt task.id=mni2i8crkj6ijg72jgh17xt5i

2. 网络问题

  • 背景:容器启动不成功,容器没有状态,docker start 容器的时候报错提示:Cannot start container exit status 1,FATA[0000] Error: failed to start one or more containers,docker "ExitCode": 128。在docker daemon的日志里有: Failed to allocate and map port: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 54052 ! -i docker0 -j DNAT --to-destination 192.168.42.70:14129: iptables: No chain/target/match by that name.错误。
  • 原因:暴露端口的时候需要iptables的规则链做转发,但是放假前改动了那个规则链没了。所以容器创建处理不能启动,不能暴露端口了,所以启动不成功。
  • 正常情况下,docker在bridge网络模式下暴露端口的时候会在iptables的规则链上做转发,如下:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT)
target prot opt source destination Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.42.2 tcp dpt:14129
ACCEPT tcp -- anywhere 192.168.42.3 tcp dpt:14129
ACCEPT tcp -- anywhere 192.168.42.4 tcp dpt:14129
ACCEPT tcp -- anywhere 192.168.42.5 tcp dpt:14129
ACCEPT tcp -- anywhere 192.168.42.6 tcp dpt:14129
ACCEPT tcp -- anywhere 192.168.42.7 tcp dpt:14129
  • 如果iptables规则链修改了,没有了名为DOCKER的链,就会出现上面的问题。

  • 原理:

  • docker 服务启动的时候,docker服务会向iptables注册一个链,以便让docker服务管理的containner所暴露的端口之间进行通信。通过命令iptables -L可以查看iptables 链。

  • 在开发环境中,如果你删除了iptables中的docker链,或者iptables的规则被丢失了(例如重启firewalld),docker就会报iptables error例如:failed programming external connectivity … iptables: No chain/target/match by that name

  • 要解决这个问题,只要重启docker服务,之后,正确的iptables规则就会被创建出来

Docker系列5--一些问题及解决的更多相关文章

  1. 8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍

    docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多 公司保守起见或不到万不得已基本上不会去变更现有模式. ...

  2. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  3. Docker系列开篇之Virtual Machine VS Container(一)

    前言 本节开始我们正式进入Docker系列,网上关于Docker相关文章如数家珍,写博客至今,我也一直在朝着如何写出通俗易懂且不枯燥的文章这个目标前进,喃喃自语的同时也希望看到文章的童鞋能明白我在讲什 ...

  4. Docker系列之常用命令操作手册

    目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...

  5. Docker系列之MySQL安装教程

    Docker系列之MySQL安装教程 有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程 mysql镜像查询命令 docker search mysql 几个 ...

  6. Docker系列-(3) Docker-compose使用与负载均衡

    上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...

  7. docker系列四之docker镜像与容器的常用命令

    docker镜像与容器的常用命令 一.概述   docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...

  8. Docker系列——Grafana+Prometheus+Node-exporter钉钉推送(四)

    近期搭建的服务器监控平台,来进行一个总结.主要分为监控平台的搭建.告警中心的配置以及消息的推送.推送的话,支持多种终端.具体详细可查看之前的博文,在这里罗列下,方便查看. Docker系列--Graf ...

  9. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

随机推荐

  1. rethinkDB python入门

    Start the server For a more detailed look, make sure to read the quickstart. $ rethinkdb Import the ...

  2. 【解决方案】IP代理池设计与解决方案

    一.背景 爬虫服务请求量大,为了应对反爬措施,增加爬虫的爬取效率和代理IP使用率,需要设计一个IP代理池,满足以下需求: 定时任务获取第三方代理 及时剔除IP代理池中失效的IP 业务隔离IP 若IP未 ...

  3. qt mvc2

    继续上次的例子,对于list才说只有行,讨论列是没有意义的. bool insertRows(int row, int count, const QModelIndex &parent); b ...

  4. 使用 If-Then-Else 逻辑进行分支

    If-then-else 逻辑看似简单,功能却十分强大,它可以根据不同条件执行不同的操作.If-then-else 逻辑可理解为:如果某个条件为 true (IF),则执行某个操作:如果条件为 fal ...

  5. ASP程序中调用Now()总显示“上午”和“下午”,如何解决?

    ASP程序中调用Now()总显示这样的格式:“2007-4-20 下午 06:06:38”,我要的正确格式为“2007-4-20 18:06:38”,我已经通过控制面板==>区域和语言选项==& ...

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_04-方法授权-方法授权实现

    2.3 方法授权实现 2.3.1资源服务添加授权控制 1.要想在资源服务使用方法授权,首先在资源服务配置授权控制 1)添加spring-cloud-starter-oauth2依赖. 2)拷贝授权配置 ...

  7. 最简单的freemarker用法实例

          1.下载freemarker-2.3.19.jar到web项目的lib下. 2.新建freemarker引擎协助类 package com.bxsurvey.sys.process.uti ...

  8. CDS视图篇 1

    CDS视图概览 CDS是Core Data Services的简称,是HANA数据库向上层ABAP应用层提供数据的一种高效的方式,CDS模型是基于数据库data definition language ...

  9. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  10. EOF使用

    1.cat向文件覆盖内容 cat > local.repo << EOF [local]name=localbaseurl=file:///mnt/cdromgpgcheck=0en ...