![](/img/trans.png)
[英]nfs volume mount to mysql docker container inside a ubuntu virtualbox fail
[英]Mysql container can not mount data to a nfs folder
通过群集模式,容器可以部署在任何连接的节点中。 我在host1上创建了一个共享的nfs文件夹作为mysql数据文件夹。
mkdir -p /nfs/data-volume
在另一个host2中,它安装到此共享文件夹。 并添加了必要的许可。 我通过读取和写入一些文本文件来尝试这个nfs共享文件夹。 它工作得很好。 (没有权限错误)在这些nfs配置之后,我像这样定义了我的容器卷;
mysqldb-read:
image: demo/db-slave
ports:
- "3308:3306"
volumes:
- /nfs/data-volume:/var/lib/mysql
结果是:如果mysql容器在host1上运行,效果非常好。 如果mysql容器在host2上运行,则它不会启动。 但是容器没有退出,线程停留在那里看起来像是在等待。 通过运行check log命令:
docker logs -f mymysql
它显示如下日志:
2017-06-07T02:40:13.627195Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-06-07T02:40:13.632313Z 0 [Note] mysqld (mysqld 5.7.18-log) starting as process 52 ...
2017-06-07T02:40:13.648010Z 0 [Note] InnoDB: PUNCH HOLE support available
2017-06-07T02:40:13.648054Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-06-07T02:40:13.648059Z 0 [Note] InnoDB: Uses event mutexes
2017-06-07T02:40:13.648062Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2017-06-07T02:40:13.648066Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-06-07T02:40:13.648069Z 0 [Note] InnoDB: Using Linux native AIO
2017-06-07T02:40:13.648326Z 0 [Note] InnoDB: Number of pools: 1
2017-06-07T02:40:13.648770Z 0 [Note] InnoDB: Using CPU crc32 instructions
2017-06-07T02:40:13.651011Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2017-06-07T02:40:13.760444Z 0 [Note] InnoDB: Completed initialization of buffer pool
2017-06-07T02:40:13.829981Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
此日志上没有更多内容,它在此行停止。 我试着登录容器,然后输入命令
mysqld -uroot -proot
显示日志完全相同。
我觉得这是由nfs引起的。 但我用Google搜索并发现几乎所有材料都建议使用nfs来共享数据。 是否有人成功完成这项工作? 或者对我有什么建议?
谢谢
Q1:有没有人成功完成这项工作?
我的经历是...... 不 。 几个月前我尝试过NFS,MySQL和Docker Swarm(v1.12),但我也确实失败了。
从MySQL文档来看,它们非常清楚:
使用NFS与MySQL
在考虑将NFS与MySQL一起使用时,建议小心。 潜在问题因操作系统和NFS版本而异,包括:
- 放置在NFS卷上的MySQL数据和日志文件变为锁定且无法使用...
- 数据不一致......
- 最大文件大小限制
我也经历过文件锁 ,慢查询和慢写...
Q2:或者对我有什么建议?
docker-swarm
棘手的一部分确实是数据,尤其是数据库。 你不知道在女主机上将运行mysql容器。 我使用了两种替代品,所以克服了这个:
1. Swarm模式服务创建--constraint
选项
此选项将指示docker始终在同一主机上部署MySQL容器,例如:
mysqldb-read:
image: demo/db-slave
ports:
- "3308:3306"
volumes:
- /nfs/data-volume:/var/lib/mysql
deploy:
placement:
constraints: [node.hostname == host1]
如果mysqldb-read
swarm service mysqldb-read
重新启动,则它将始终位于host1
节点上。
2. Docker卷
另一种选择是在启动之前将共享docker volume
动态连接到MySQL服务。 文件说明 :
如果您希望数据保持不变,请使用可识别多主机的命名卷和卷驱动程序,以便可以从任何节点访问数据...
有一些docker volume插件可以让你这样做。 我亲自在AWS环境中尝试过牧场主的车队 ,但是我还有其他卷删除,同步等问题......
您还可以查看有关swarm和docker卷的这个流行的SO线程 。
PS:关于NFS
我不是说你应该放弃NFS用于其他docker服务,我仍然将它用于read-only
配置文件(Apache Tomcat和Nginx配置等等),但是对于MySQL来说它是不行的。
希望我的经验会有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.