Docker系列5--一些问题及解决
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"
- 只能尝试容器内部使用的log4j框架写日志的时候修改格式了。
- 参考:解决log4j.properties配置文件生成的log日志文件读写权限问题
- 而要想对文件权限修改,框架版本当前太低又不支持(T_T),filePermissions只有在2.9以上的版本才有,参考:log4j2设置日志文件读写权限(filePermissions)
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--一些问题及解决的更多相关文章
- 8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍
docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多 公司保守起见或不到万不得已基本上不会去变更现有模式. ...
- Docker系列07—Dockerfile 详解
本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...
- Docker系列开篇之Virtual Machine VS Container(一)
前言 本节开始我们正式进入Docker系列,网上关于Docker相关文章如数家珍,写博客至今,我也一直在朝着如何写出通俗易懂且不枯燥的文章这个目标前进,喃喃自语的同时也希望看到文章的童鞋能明白我在讲什 ...
- Docker系列之常用命令操作手册
目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...
- Docker系列之MySQL安装教程
Docker系列之MySQL安装教程 有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程 mysql镜像查询命令 docker search mysql 几个 ...
- Docker系列-(3) Docker-compose使用与负载均衡
上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...
- docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...
- Docker系列——Grafana+Prometheus+Node-exporter钉钉推送(四)
近期搭建的服务器监控平台,来进行一个总结.主要分为监控平台的搭建.告警中心的配置以及消息的推送.推送的话,支持多种终端.具体详细可查看之前的博文,在这里罗列下,方便查看. Docker系列--Graf ...
- Docker系列06—基于容器制作镜像并上传到Docker Registry
本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...
随机推荐
- Go By Example-值类型
Go By Example-值类型 Go语言的数据类型可以分为值类型和引用类型,这里先说值类型. 值类型 值类型:在Go语言中int.float.bool和string这些类型都属于值类型,使用这些类 ...
- Linux 一条命令杀死占用端口的所有进程
Linux 一条命令杀死占用端口的所有进程 2018年05月28日 19:43:05 gq97 阅读数 7655更多 分类专栏: Linux 版权声明:本文为博主原创文章,遵循CC 4.0 BY- ...
- Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示
在Android中加载ImageView一般都不会给ImageView的宽高设置一个确切的值,一般都是直接写成: <ImageView android:id="@+id/iv_test ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考) 1.返回顶部 1. #undef(C# 参考) 2018/06/30 #undef 允许你定义一个符 ...
- java最简单复制文件方法,不依赖任何框架
java最简单复制文件方法 把java2.txt内容复制到java.txt中 import java.io.File; import java.io.IOException; import jav ...
- win7电脑删除保存的凭据
win7电脑删除保存的凭据: 控制面板-> 用户账户 -> 管理您的凭据
- 【linux基础】如何开机自启动某个程序-linux工具-ubuntu
前言 实际使用中应用程序或者服务需要开机自启动,而不是人为手动开启运行,那么,该如何做呢,本文对此进行介绍. 操作过程 1. 确定系统的桌面环境: 具体可参考here; 2. 如何自启动: 博主ubu ...
- laravel的workflow流程插件
原文地址:https://github.com/brexis/laravel-workflow
- 涨停复盘:5G概念持续活跃,军工股强势崛起
午后银行股快速拉升,三大股指大幅拉升,沪指一度临近2800点,但未能持续随后沪指小幅下行,题材股表现强势,证券板块高开低走.截止收盘,沪指涨0.93%,创业板指涨1.51%. 盘面上,银行板块午后拉升 ...
- 【计算机视觉】Selective Search for Object Recognition论文阅读3
Selective Search for Object Recoginition surgewong@gmail.com http://blog.csdn.net/surgewong 在前 ...