docker 使用 mysql 时选择新建 mysql 容器还是单一容器内新开 mysql 进程? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tafee
V2EX    程序员

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

  •  
  •   tafee 2017-04-25 14:18:20 +08:00 6782 次点击
    这是一个创建于 3172 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    60 条回复    2017-04-26 13:46:03 +08:00
    windfarer
        2
    windfarer  
       2017-04-25 14:48:45 +08:00   1
    别在 docker 上跑数据库,会被坑死的
    araraloren
        3
    araraloren  
       2017-04-25 15:19:38 +08:00
    ~~ 感觉 数据库跑在 container 里各种不顺利
    还是搁在外面好
    latyas
        4
    latyas  
       2017-04-25 15:31:25 +08:00 via Android
    别在 docker 里跑数据库,会被坑死的
    brucedone
        5
    brucedone  
       2017-04-25 15:46:35 +08:00
    @windfarer 坑在哪?内存还是什么?我自己的博客就是 docker-compose 一套,跑的满正常的啊
    debye
        6
    debye  
       2017-04-25 15:52:31 +08:00
    别在 docker 里跑数据库,会被坑死的
    jarlyyn
        7
    jarlyyn  
       2017-04-25 15:59:26 +08:00
    docker 跑数据库有什么问题。

    博客不论,我公司的 gitlab owncloud 数据库都在 Docker 里啊
    tafee
        8
    tafee  
    OP
       2017-04-25 16:01:21 +08:00
    大家都说会被坑死,具体是有哪些坑呢
    jarlyyn
        9
    jarlyyn  
       2017-04-25 16:03:39 +08:00
    我目前在 docker 中跑过的数据库包括

    mysql (for blog/owncloud)
    postgresql(for gitlab)
    redis

    可能运气好,暂时还没被坑到
    Bardon
        10
    Bardon  
       2017-04-25 16:11:36 +08:00
    data 不会放容器里,放在其他专有目录
    容器里运行数据库程序进程,通过 -v 去读写 data 目录
    sunjourney
        11
    sunjourney  
       2017-04-25 16:12:19 +08:00 via iPhone
    想问哪些坑,我的网站、论坛都跑在 docker 里,几个月了都没问题,有什么隐患?
    Miy4mori
        12
    Miy4mori  
       2017-04-25 16:16:40 +08:00 via iPhone
    完全不懂说被坑的是怎么回事,莫非没用官方镜像自己 build 出了问题?
    Bardon
        13
    Bardon  
       2017-04-25 16:22:02 +08:00   2
    想起了昨天有个人说,重启容器数据没了,于是说 docker 的不好的梗 ^_^
    xyjtou
        14
    xyjtou  
       2017-04-25 16:40:10 +08:00 via Android   1
    数据库不舍得单独买服务器也就算了,还放 docker 里,这是图个啥呢,又不是需要 docker 容器横向扩容。
    jarlyyn
        15
    jarlyyn  
       2017-04-25 16:45:49 +08:00
    @xyjtou

    数据库表示一脸蒙蔽,放在 docker 里有单独服务器与否有关系和冲突么?

    人家不过是为了保证 正式 /开发 /测试 的环境一致以及迁移方便用 dcoker 了,怎么就成舍得不舍得了?
    jarlyyn
        16
    jarlyyn  
       2017-04-25 16:48:04 +08:00
    @xyjtou

    随便搜了下,看来京东也是个很抠门的公司

    http://dbaplus.cn/news-11-1118-1.html
    junnplus
        17
    junnplus  
       2017-04-25 16:51:20 +08:00
    搞不懂楼上在喊“别在 docker 里跑数据库,会被坑死的”的原因在哪,现在有些云厂商提供的 rds 都是跑在 docker 上的,压根没啥坑,当然你把数据放在容器里面能怪 docker 。。。
    windfarer
        18
    windfarer  
       2017-04-25 16:51:38 +08:00
    @brucedone 自己博客的数据库用 docker 跑还行,但生产环境中就要慎重使用。具体为什么,请看一楼发的链接
    ohhe
        19
    ohhe  
       2017-04-25 16:52:31 +08:00
    当然第一种方案了。
    程序和数据库分开比较好。因为数据库一般单独运行。程序可能需要负载均衡之类。
    ohhe
        20
    ohhe  
       2017-04-25 16:54:06 +08:00
    不过不是对外提供数据库服务的话。确实数据库没必要放 docker 里面。不方便管理数据库啊。
    jarlyyn
        21
    jarlyyn  
       2017-04-25 16:55:27 +08:00
    @windfarer

    一楼发的链接到底说了什么数据库不能放在 Docker 的理由?

    突然挂掉后丢数据?
    xyjtou
        22
    xyjtou  
       2017-04-25 16:58:21 +08:00 via Android
    @jarlyyn 数据库要什么环境一致?生产机的数据库优化方案在开发机上根本没必要搞,搞了没哪个数据量级也没用。
    jarlyyn
        23
    jarlyyn  
       2017-04-25 16:58:30 +08:00
    @windfarer

    顺便, 1 楼的链接,假设他是最原始的链接,上一片文章是

    https://myopsblog.wordpress.com/2017/01/02/20-things-ive-done-in-2016/#more-1987

    2016 年完成的 20 件事,嗯嗯,
    jarlyyn
        24
    jarlyyn  
       2017-04-25 16:59:43 +08:00
    @xyjtou

    是哦,测试环境和开发环境也不需要一样的版本。

    开发环境的数据版本比正式环境高一点也没关系,可以把正式环境升级一下么, so easy.
    junnplus
        25
    junnplus  
       2017-04-25 17:00:42 +08:00
    @windfarer 请看文章下面的评论
    junnplus
        26
    junnplus  
       2017-04-25 17:01:52 +08:00
    @ohhe 有没有必要放在 docke 里面和方不方便管理数据库没有关系吧
    jarlyyn
        27
    jarlyyn  
       2017-04-25 17:03:37 +08:00
    @junnplus

    大概是他不习惯 Docker -exec -ti bash

    又遇到宿主机客户端和容器服务器不兼容?
    cxbig
        28
    cxbig  
       2017-04-25 17:12:04 +08:00   1
    Docker 的理念就是一个服务独占一个容器。所以 MySQL 要独立开一个。

    目前的测试感受,用 Docker 跑 MySQL ,无论是内置 volume 还是 mount 到 host 文件夹,性能都远不如直接装 MySQL 来得快。

    我司一个 dump , gzip -9 压缩大概 1G 上下,导入速度参考:
    AWS RDS m4.large 25mins
    AWS EC2 m4.large Ubuntu 16.04 Apt 安装 30mins
    MBP 13 寸 13 年款 Brew 安装 40~50mins
    MBP 13 寸 13 年款 Docker App 4core 8g 内置 volume 3hrs 20mins
    MBP 13 寸 13 年款 DockerApp 4core 8g host 挂载 volume 4~5hrs
    jarlyyn
        29
    jarlyyn  
       2017-04-25 17:13:27 +08:00
    @cxbig

    性能肯定是有损失的,特别是文件读写。
    cxbig
        30
    cxbig  
       2017-04-25 17:17:08 +08:00
    @jarlyyn
    默认配置做的测试,性能相差太远。所以暂时没有明确的解决途径,就没多折腾。
    公司也不想我折腾,宁愿在 AWS 上砸钱求稳定。
    tafee
        31
    tafee  
    OP
       2017-04-25 17:19:50 +08:00
    @cxbig 从性能上看,“别在 docker 上跑数据库,会被坑死的” 也是没错了
    jarlyyn
        32
    jarlyyn  
       2017-04-25 17:20:57 +08:00
    @cxbig

    不过看了下你的数据。

    你 docker 在 mac 下跑得?那还要转一层虚拟机啊。

    应该是在同一环境的原生 linux/docker 对比才行吧?
    cxbig
        33
    cxbig  
       2017-04-25 17:25:36 +08:00
    @jarlyyn
    Docker for Mac 在运算性能上不差,唯独差在 I/O 。 Linux 下我也试过,没有明显改善。
    jarlyyn
        34
    jarlyyn  
       2017-04-25 17:26:56 +08:00
    @cxbig

    http://www.dockerinfo.net/729.html

    看到的资料没看到 docker 的性能有很大的差距。

    不行晚上回家在我自己的电脑上跑下对比测试看看。
    lightening
        35
    lightening  
       2017-04-25 17:29:44 +08:00
    只好会配置,数据库跑在 Docker 里也是没什么问题。但是配置比较麻烦。
    如果用 swarm ,怎么配置多个 replica ?怎么配 cross-machine volume ?
    如果 docker 占了全部硬盘空间,要清理,不小心一条命令删了 volume 也是很有可能的事情。

    这些问题只要会配都没问题,但是就怕不熟练不小心搞错不是么。




    @cxbig Mac 上的 Docker 是运行在虚拟机里的啊,你这么看到的是虚拟机的性能开销。找个 Linux 机器试试。
    cxbig
        36
    cxbig  
       2017-04-25 17:35:06 +08:00
    @lightening 在 EC2 上试过, I/O 性能上不如 RDS 。
    cxbig
        37
    cxbig  
       2017-04-25 17:41:27 +08:00   1
    另外 Docker Image 有 Layer 的因素,碎片文件特别多,对 inode 敏感的机器也是不小的压力。
    AWS EC2 开过 32G 的 General Purpose SSD (GP2),只分配了 2M 的 inode ,仅仅只是 pull 了几个常用的 image 就吃掉了 80%的 inode 。用了 5G 空间就报 No space left on device 。
    Hyponet
        38
    Hyponet  
       2017-04-25 18:10:24 +08:00   1
    其实并没有什么争论的,至于是不是坑,我只能说,任何软件,工具,轮子都可能被用成坑

    首先容器会降低性能,毋庸置疑,无论 网络 还是 磁盘 io , docker 慢众所周知,但是他部署扩容快啊,看你取舍喽。当然包括上面说 Image 对磁盘的压力,是另一方面,毕竟数据库镜像不经常更新 Layer 。

    然后就是把数据库放容器里,因为数据库的特殊性(存储数据以及版本不经常变动),我一般是不建议把这东西放容器里的。
    首先是数据问题, docker 并不建议把数据放在容器里,并有了 volume ,数据库这种数据优先的程序更是,无论是把数据放在 volume 还是其他 driver ,都徒增对这些数据的管理(以及风险),而这些管理却一定程度上依赖了 docker 。
    然后就是 docker 引入的问题,无论什么数据库,现在的解决方案是非常完善的,但是引入 docker 之后,在一定程度会受到 docker 的影响,比如 daemon 挂了而你恰好要要对数据库这个容器操作,你是打算先修 docker 呢 还是先修 docker 呢。

    总之呢, mysql 放在容器里说白了也不过就是一个文件夹的数据和一个进程而已,如果处理的好(对 docker 很熟,没有人为失误)而且运气足够好(遇不到 docker 的 bug ),而且对性能要求不大,那么放哪都一样,怎么喜欢怎么来。

    啥?你只是把容器里的 data 目录映射到了宿主机提供数据库服务?我认为你用的是假 Docker 。
    Hyponet
        39
    Hyponet  
       2017-04-25 18:15:30 +08:00
    不过扯回楼主的主题, docker 建议是单一进程的,也就是这一个容器里只跑一个进程。也就是第一个选择更好一些。
    原因很简单,比如这个唯一进程挂掉了,容器也就挂掉了, docker 可以很方便的发现这点并进行后续操作,比如 restart 。
    jarlyyn
        40
    jarlyyn  
       2017-04-25 18:17:50 +08:00
    @HypoChen

    “然后就是 docker 引入的问题,无论什么数据库,现在的解决方案是非常完善的,但是引入 docker 之后,在一定程度会受到 docker 的影响,比如 daemon 挂了而你恰好要要对数据库这个容器操作,你是打算先修 docker 呢 还是先修 docker 呢。 ”

    不是应该把 data 文件夹 cp 出来 /通过别的方式挂载使用么……

    “然后就是 docker 引入的问题,无论什么数据库,现在的解决方案是非常完善的,但是引入 docker 之后,在一定程度会受到 docker 的影响,比如 daemon 挂了而你恰好要要对数据库这个容器操作,你是打算先修 docker 呢 还是先修 docker 呢。 ”

    这句话没看懂。

    数据库进 docker 不是应该 -v 配置文件夹和数据文件夹的吗?
    Zzzzzzzzz
        41
    Zzzzzzzzz  
       2017-04-25 18:23:50 +08:00
    1, 但生产环境不建议用 docker-compose

    @cxbig EBS 的 IO 本来就很烂, 这锅 docker 不背
    hugo775128583
        42
    hugo775128583  
       2017-04-25 18:27:02 +08:00 via Android
    docker 跑数据库, data 映射到宿主机没问题。但是多个容器读写竞争怎么处理?
    jarlyyn
        43
    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
    Hyponet
        44
    Hyponet  
       2017-04-25 18:30:45 +08:00   2
    @jarlyyn

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

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

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

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

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

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

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

    看来是我用的太浅了……

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

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

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

    再比如机器挂了的问题。

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

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

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

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

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

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

    所以上面说错了,不存在 docker 与宿主机的文件系统不同。 IO 差别,反而在 aufs,overlay,btrfs 与 devicemapper 之间,以及不同层上读写的差距了。
    Bardon
        57
    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
        58
    jarlyyn  
       2017-04-26 09:56:51 +08:00
    @Bardon

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

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

    如果非要钻牛角尖,你何止不需要用 docker ,完全可以不用数据库啊,直接 io 写数据到硬盘即可,这样性能肯定比经过数据库运算解析后再存储要高很多。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2154 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 112ms UTC 16:00 PVG 00:00 LAX 08:00 JFK 11:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86