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. CodeForces - 1183E Subsequences (easy version) (字符串bfs)

    The only difference between the easy and the hard versions is constraints. A subsequence is a string ...

  2. 如何十倍提高你的webpack构建效率

    前言 http://jafeney.com/2016/07/10/2016-07-10-webpack/     webpack 是个好东西,和 NPM 搭配起来使用管理模块实在非常方便.而 Babe ...

  3. dom 加载监听事件 及解析

    document.addEventListener("DOMContentLoaded", function (_event) { console.log("初始DOM ...

  4. django 2 ORM操作 ORM进阶 cookie和session 中间件

    ORM操作 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  5. SQL注入自学[第一学:一个简单的注入环境的编写]

    /* 转载请注明出处 ID:珍惜少年时 */ CODE区域: /*注:现在mysql_connect的这种连接方式已经被放弃了,也就是说不用了,老夫也是新手上路故,下载了一个wampserver2.2 ...

  6. ASP如何将table导出EXCEL表格

    网页导出excel表格非常常用,对于一些加载<table>的数据网页,经常会用到这种功能,下面和大家分享一下ASP如何导出EXCEL表格 工具/原料   ASP编辑器 方法/步骤     ...

  7. Rust基础笔记:闭包

    语法 Closure看上去是这样的: let plus_one = |x: i32| x + 1; assert_eq!(2, plus_one(1)); 首先创建一个绑定plus_one,然后将它分 ...

  8. 123457123456#0#-----com.twoapp.YiZhiFanPai08--前拼后广--儿童益智记忆翻牌jiemei

    com.twoapp.YiZhiFanPai08--前拼后广--儿童益智记忆翻牌jiemei

  9. Go项目部署到服务器

    -bash: ./main: cannot execute binary file 将 go build main.go 生成的文件上传到服务器后,./main 运行后出新的报错 env GOOS=l ...

  10. 在node.js中使用Set

    var set = new Set(); set.add(1); console.log("test1 : " + set.has(1) + " ; " + s ...