docker 使用 mysql 时选择新建 mysql 容器还是单一容器内新开 mysql 进程?

2017-04-25 14:18:20 +08:00
 tafee

看了网络上的两种在 docker 中使用 mysql 的方法: 1 、新建 mysql 容器,利用 docker-compose 或者其他编排工具与运行程序的容器 link ; 2 、在单一 docker 容器中,利用 supervisord 创建 mysql 进程和程序进程;

V 友们如何选择的?这两种方案的优缺点在哪儿? 个人感觉第二种方案已经失去了 docker 容器化的意义。。。

6224 次点击
所在节点    程序员
60 条回复
Zzzzzzzzz
2017-04-25 18:23:50 +08:00
1, 但生产环境不建议用 docker-compose

@cxbig EBS 的 IO 本来就很烂, 这锅 docker 不背
hugo775128583
2017-04-25 18:27:02 +08:00
docker 跑数据库, data 映射到宿主机没问题。但是多个容器读写竞争怎么处理?
jarlyyn
2017-04-25 18:29:52 +08:00
对了,回到楼主的问题。

我跑 Docker 一般是建一个 subnet

每个服务分配一个内网 ip

直接用内网 Ip+端口访问

以 mysql 为例,大概是这样

docker run --network=vps --ip=10.1.1.2 --name mysql -v /dockers/mysql/data:/var/lib/mysql -v /dockers/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --restart always mysql
HypoChen
2017-04-25 18:30:45 +08:00
@jarlyyn

你说的没错,但是这些是建立在单机应用上的,可以简单的把里面的数据文件夹随便映射到宿主机上一个地方,然后保管好宿主机上这个文件夹就可以了

但是,如果只是这样使用的话是不是和不用 docker 一样,和直接在宿主机上装一个 sql 并保护好本地的文件夹没什么区别。

如果要把文件挂主机上,那么有几个问题怎么做,如果这个机器挂了,我的容器需要快速迁移到别的机器上,如果文件在这个机器上,当机器挂了之后数据是不是就不能用了,当然,你可以提前备份,但是这样是不是和不用 docker 的姿势是一样的。或者说我需要扩容,而且是扩容到多台机器上做高可用,是不是这样并不能算方便快捷。

docker 本来就是是的复杂场景变得方便而有了价值,在面对复杂场景的时候,并不是一个简答的 -v 加一个宿主机文件夹就能解决的。但是换句话说,如果需求很简单,怎么方便怎么了喽
jarlyyn
2017-04-25 18:35:39 +08:00
@HypoChen

docker 最开始不就是提供了一个 namespace 和一个网络配置么……

我也一直把 docker 当成一个单进程的运行环境来用的……

主要看中 docker 的迁移 /独立的版本控制 /相对独立的环境。

看来是我用的太浅了……

机器挂了的问题不是该由数据库的主从同步来处理么。

这里对比的是 使用 docker 和使用原声环境安装进程吧?

你提的问题原生环境直接安装也没办法解决啊。
mobyride
2017-04-25 18:35:50 +08:00
只能说看需求,追求性能肯定不放 docker ,追求部署简便放 docker (单独放一个)
jarlyyn
2017-04-25 18:37:52 +08:00
@HypoChen

再比如机器挂了的问题。

如果是真机挂了,不是应该直接拆硬盘挂到别的跑了同样 Docker 的机器上处理。

而如果是各种云服务,就是开新的计算单元,装好 docker 把云磁盘架过去……

我对 docker 的理解只有这么浅。
lightening
2017-04-25 19:39:42 +08:00
@cxbig 也试一下 EC2 上 apt-get 裸装吧。感觉不一定是 Docker 的问题。
Bardon
2017-04-25 19:45:47 +08:00
你们讨论那么多,我算是明白了

数据究竟该不该存镜像内?假 docker ?

总有种为了 docker 而 docker 的即视感。
gdtv
2017-04-25 19:59:27 +08:00
@cxbig
@jarlyyn
@tafee
我一直想在生产环境用 docker ,但怕性能问题,搜索过很多相关观点,本帖子之前所有观点都说“ docker 造成的性能损失小到可以忽略不计”,但现在你们的说 docker 会给 mysql 造成性能这么大的损失,以网上其他观点完全不同啊。
cxbig
2017-04-25 20:33:08 +08:00
@Bardon 数据从来就不应该在镜像或容器内
cxbig
2017-04-25 20:38:26 +08:00
@gdtv 取决于你在什么环境部署你的项目,如果你有自己的物理服务器,性能不算差。
就目前我用过的 AWS EC2 、 Linode 、 DigitalOcean 这几家的都不理想。
当然测试仅限于小型 VPS , 4 核 16G Ram 左右。大型独占的没有试过。
Bardon
2017-04-25 20:51:10 +08:00
@cxbig 只是看到上面某层楼说假 docker 而有感而发...

另外,没有什么“本来不应该...”,如果性能允许,放镜像内,保留各种 commit 历史,回退是非常方便的,
cloudzhou
2017-04-25 21:02:22 +08:00
@gdtv 考虑是 io 还是 cpu 密集
Bardon
2017-04-25 21:11:35 +08:00
linux 下本来就是基于进程级的,负载差别基本就看 IO 以及内存差别了
当然,容器与宿主机文件系统不同, Volume 挂载后磁盘 IO 会造成很大的差别...
Bardon
2017-04-26 09:32:01 +08:00
说错了, docker 利用的一种类似图层形式的文件系统,使得读写在不同的层次上

所以上面说错了,不存在 docker 与宿主机的文件系统不同。 IO 差别,反而在 aufs,overlay,btrfs 与 devicemapper 之间,以及不同层上读写的差距了。
Bardon
2017-04-26 09:42:49 +08:00
目前, overlay 人气较高, gentoo 下可以直接选择 overlay 这个 use flag 来使得 docker 采用 overlayfs

centos 下还是 devicemapper ,需要一些技巧才能采用 overlayfs

deb 系的没用过,不知道

具体 docker info | grep Driver 查看。
jarlyyn
2017-04-26 09:56:51 +08:00
@Bardon

Storage Driver: devicemapper
Logging Driver: json-file
Cgroup Driver: cgroupfs

debian testing
oop99
2017-04-26 12:49:06 +08:00
单一容器只运行单一的服务, 减小耦合度
自己 MySQL docker 没遇到过问题
wangxiaodong
2017-04-26 13:46:03 +08:00
docker 初衷是隔离应用程序的不同版本及灵活编排程序运行环境,避免互相干扰,同时让操作系统版本依赖更少、更稳定;至于数据目录放哪里及性能损耗,可以按 2/8 原则来分析,并不是每个项目都需要全负荷的运作,满足 80%以上场景即可。

如果非要钻牛角尖,你何止不需要用 docker ,完全可以不用数据库啊,直接 io 写数据到硬盘即可,这样性能肯定比经过数据库运算解析后再存储要高很多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/357237

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX