V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
philsky28
V2EX  ›  Docker

mac 中的 docker 如何连接本机的 mysql ,数据库应该用 docker 吗?

  •  
  •   philsky28 · 2020-07-05 15:22:29 +08:00 · 7032 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先描述下我现在本地的是一个 node 项目(nest.js),在连接 mysql 数据库的配置文件里(用的 typeorm )数据库链接地址写了 localhost 发现连接不上去,搜索了一下知道 docker 中的 localhost 不是本机 localhost,要把 localhost 换成 docker0 的 ip 地址才行,但是这时候我有了两个问题: 1,我本地是 mac,mac 中没有 docker0 网卡 2,docker 上传到 vps 生产环境后,他的 ip 地址会变化吗?如果变化的话际开发中如何保证在本地 ok 上生产后那些环境变量也能保证没问题呢?

    网上搜的很多教程是把 mysql 也做成了 docker 镜像,但是好像也有很多人说数据库不应该使用 docker,现在大公司主流的做法究竟是什么呢?我是前端,这块学的很吃力,希望能有大佬解答一下。。。

    45 条回复    2020-07-06 19:27:55 +08:00
    philsky28
        1
    philsky28  
    OP
       2020-07-05 15:29:00 +08:00
    滴滴滴有人吗
    niubee1
        2
    niubee1  
       2020-07-05 15:38:28 +08:00
    数据库不要上 Docker
    waising
        3
    waising  
       2020-07-05 15:41:12 +08:00
    本地 host 模式可以用吗 mac 下的 docker 网络这块好像有点坑
    gigantic222
        4
    gigantic222  
       2020-07-05 16:01:44 +08:00   ❤️ 1
    docker 版本多少?试试 host.docker.internal
    bfme
        5
    bfme  
       2020-07-05 16:51:11 +08:00
    @niubee1 老哥 问一下 mysql 为什么不能用 docker ? 有什么弊端吗?
    niubee1
        6
    niubee1  
       2020-07-05 17:00:56 +08:00
    docker 的容器是要 stateless,本次存文件都不要。数据库是干嘛,数据持久化,完全是背离的东西,干嘛硬要搞到一块儿?
    dagouziwangwang
        7
    dagouziwangwang  
       2020-07-05 17:09:55 +08:00   ❤️ 9
    @niubee1 docker volume 表示一脸懵逼
    hakono
        8
    hakono  
       2020-07-05 17:14:17 +08:00
    whileFalse
        9
    whileFalse  
       2020-07-05 17:15:28 +08:00   ❤️ 1
    链接本机局域网 IP,或者用 host.docker.internal
    whileFalse
        10
    whileFalse  
       2020-07-05 17:16:03 +08:00
    本机环境或者公用测试环境,数据库用 Docker 问题不大
    hakono
        11
    hakono  
       2020-07-05 17:16:08 +08:00
    @niubee1 mount 下 volumn 就完结的事情。如果你说 mac 中的 docker 是跑在虚拟机上的,跑数据库会有那么点性能损失,所以不太推荐的话这里还还算靠谱那么点
    napsterwu
        12
    napsterwu  
       2020-07-05 17:20:10 +08:00
    k8s pvc 表示一脸懵逼,docker 当然可以持久化,不过个人认为不是需要横向扩容的支持集群的 db 也没有太大必要容器化
    SevenJ
        13
    SevenJ  
       2020-07-05 17:24:58 +08:00
    shiny
        14
    shiny  
       2020-07-05 17:30:19 +08:00
    你这种情况,为了方便,完全可以把 MySQL 放容器里,不要太香。
    哪怕是线上环境,多大的量级,就担心数据库放容器里有性能损失了?
    gigantic222
        15
    gigantic222  
       2020-07-05 17:51:03 +08:00
    tidb es 之类的分布式数据库表示 docker 真香
    abowloflrf
        16
    abowloflrf  
       2020-07-05 17:57:00 +08:00 via iPhone
    只是本地开发测试的话,没有网络隔离的需求,启动容器的时候 network 用 host 模式就好了
    niubee1
        17
    niubee1  
       2020-07-05 18:40:43 +08:00   ❤️ 2
    @dagouziwangwang
    @hakono

    你们没有 get 到点,没工夫长篇大论的说。Docker Volume 是什么,是属于实例的还是属于宿主?能做到和这么做好不好也是两码事


    @napsterwu docker 当然可以持久化,但是 docker 的实例要不要有状态,有状态好还是无状态好。就跟讨论面向对象编程和函数式编程一样。

    这种架构的事情,各有各的说法,我也就一说,不愿意深次思考的就继续 mb 吧,你们说得都对
    newtype0092
        18
    newtype0092  
       2020-07-05 19:11:23 +08:00   ❤️ 2
    @niubee1 我觉得是你没搞懂 Docker 怎么用
    作为本机环境来说 Docker 就是个无状态的运行时容器,用来跑 MySQL 程序而已,文件和配置我想存在哪存在哪,想起几个起几个,完全不会干扰。
    你本地安装才会有各种各样和具体机器相关的问题,每个机器上都不一样完全不方便重复部署。。。
    newtype0092
        19
    newtype0092  
       2020-07-05 19:17:10 +08:00
    用 Docker 起 MySQL,在 Dockerfile 里配置好映射的端口,这样宿主机就可以用 localhost+指定端口的形式访问,也可以把 sock 文件映射到宿主机直接用来访问。
    你所有 Docker 内的环境应该都通过 Dockerfile 传进去,这样部署到哪里都不会变。
    jason94
        20
    jason94  
       2020-07-05 19:54:52 +08:00
    我写 nodejs 项目会创建 docker-compose.yml ,把 mysql 、 phpmyadmin 和 redis 写里面 ,然后一行命令就启动好开发环境了,特别是在协同开发的时候非常方便。
    miao1007
        21
    miao1007  
       2020-07-05 20:02:41 +08:00 via iPhone
    自己本地随便折腾 不会有性能问题
    bfme
        22
    bfme  
       2020-07-05 20:04:17 +08:00
    我是来看各位有何高见的。。瓜子板凳已备好。
    bfme
        23
    bfme  
       2020-07-05 20:06:47 +08:00
    就连个数据库 搞得这么麻烦。。
    不用 docker 可以用宿主机内网 Ip+端口号访问啊,要是用 docker 就将数据挂载出来--link 就好了。
    kchum
        24
    kchum  
       2020-07-05 20:40:05 +08:00
    不用 docker-compose 吗? docker-compose 的话用 service name 还是 container name 就可以了,我两个都一样,你测试看看,这两个都不会变的
    rockyou12
        25
    rockyou12  
       2020-07-05 21:40:24 +08:00
    @niubee1 别装了,我生产用容器化的数据库用这么久了屁事都没有,只要应用本身对容器化支持得很好就完全 ok

    mysql 这些只要不是特别高的负载其实随便用的,我之前有个一月写几十个 G 的 pg 数据库也是直接用的容器方案,同样没任何问题(当然,有些调优会麻烦)
    matrix67
        26
    matrix67  
       2020-07-05 21:42:10 +08:00
    seafile 的 sql 就是用的容器
    yanfany
        27
    yanfany  
       2020-07-05 23:17:09 +08:00
    歪个楼,不知道有没有谁知道 在服务器上的 docker 镜像使用不了 cmake gui 怎么解决,会报连接不到 X serve 的错误
    CoderGeek
        28
    CoderGeek  
       2020-07-05 23:26:34 +08:00   ❤️ 1
    看需求 正常情况 用 rds 就已经很成熟了 弹性扩容之类的, 像 db 缓存等暂时还没用到过。
    基本都是些 web 网关 脚本任务 一类的
    CoderGeek
        29
    CoderGeek  
       2020-07-05 23:27:30 +08:00
    还有个人玩 mac 上在搞个容器库也没啥意义啊 本地有的话不省点资源嘛
    LichMscy
        30
    LichMscy  
       2020-07-06 00:15:17 +08:00   ❤️ 4
    问题 1: docker 容器间有 docker 的虚拟网络,docker inspect <containerName>可以查看容器的 IP ;问题 2: 上到生产环境,IP 可能会变,可以在启容器时指定固定 IP 。或者直接 docker-compose 启动,在一个网络下就不会有类似的问题了。docker 跑 mysql 没问题,非 docker 跑也没问题,个人觉得没必要纠结这个,楼主作为前端,快速 run 起来才是真,没必要纠结这些,可以复用别人成熟的方案。

    针对于楼中某些人毫无帮助的言论,容器的确无状态服务会适合点,但是特定场景下有特定方案,statefulset 有状态的完全可以跑,只是横向扩展的分布式 DB 方案不太适合。完全没搞清楚楼主问的什么,上来就数据库不要上 Docker,我 docker 快速启个 MySQL 不行?回帖请看看右下角——“请尽量让自己的回复能够对别人有帮助”
    initd
        31
    initd  
       2020-07-06 03:11:16 +08:00
    建议涉及运行环境的东西 虚拟机跑 Linux, 毕竟线上环境就是 Linux,
    bluehtt
        32
    bluehtt  
       2020-07-06 07:35:17 +08:00 via iPhone
    默认可以用 172.17.0.1 连接宿主机
    594duck
        33
    594duck  
       2020-07-06 09:00:08 +08:00 via iPhone
    @niubee1 老哥那些用 docker 跑数据库还一个月十几 G 的牛逼人物,你就放声他们牛逼就好了,讲道理他们是不会听的。这种粉红程序员缺少社会的毒打。

    就像我最喜欢放生边缘项目用 docker 做生产环境。从朝气满满,怼天怼地到最后看着他们的 SLA 和预算崩盘,一脸苦逼的样子笑出了朱叫。
    caicaiwoshishui
        34
    caicaiwoshishui  
       2020-07-06 09:08:18 +08:00 via iPhone
    进入容器中,cat /etc/hosts 可以看到容器的 ip
    ,如 172.18.0.3,那么 macOS 的 mysql 地址应该是 172.18.0.1 。

    楼主可以先 ping 下,ping 通就应该没有问题
    Actrace
        35
    Actrace  
       2020-07-06 09:14:13 +08:00   ❤️ 1
    @594duck 之前有尝试想用 docker 降低部署成本,不过发现搭建的应用无法获得外部 IP 。最后还是没用上 docker 。
    594duck
        36
    594duck  
       2020-07-06 09:30:30 +08:00   ❤️ 1
    @Actrace Docker 这东西就是程序员们偷懒想出来的,包括 K8S 也是小公司弄不了 Spring boot 搞出来的。

    根据我的观察 90%的公司搞 Docker 只解决一件事,CI/CD 。没了,其它没了。然后上 K8s 也只解决一件事,我们没弄 Spring boot,我们用 Docker 来解决。

    上大规模 K8s 的公司也分二种,一种是头部企业先弄 30 人的团队,专门改造 K8s,然后他们说的 K8s 和你用的 K8s 是二件事。一种是反正我们不知道后年还活着不活着,面向简历,来我们上个 K8s

    如果一公司,运维,测试,QA 全齐的,上不上 Docker 和 K8s 根本没差,因为决定成功的因素根本不在这方面。
    killerv
        37
    killerv  
       2020-07-06 09:55:55 +08:00
    #9 说的没错,可以这么用

    另外 2# 上来就说不要上 Docker,我感觉是无脑。本机又不是生产环境,怎么方便怎么来,我就喜欢在本机用 docker 跑数据库,因为简单、不污染本地环境。

    楼主,Mac 不建议直接跑 docker,磁盘 IO 差到爆炸,你安装个 Linux 虚拟机跑 Docker 都比本机强百倍。
    Martin9
        38
    Martin9  
       2020-07-06 10:06:56 +08:00
    我之前 mac 上装了 docker,坑太多了,建议虚拟机里面装
    1109599636
        39
    1109599636  
       2020-07-06 10:18:33 +08:00
    数据库程序本身可以 docker, 但是数据文件可以用 volume 挂载到 docker
    wuqingdzx
        40
    wuqingdzx  
       2020-07-06 10:52:27 +08:00
    docker.for.mac.localhost
    janxin
        41
    janxin  
       2020-07-06 11:40:42 +08:00
    开发测试环境哪那么多要求,无所谓的

    IP 会变化的,但是 docker 为什么要传到生产环境?这是什么操作
    philsky28
        42
    philsky28  
    OP
       2020-07-06 15:57:31 +08:00
    @kchum docker compase 应该是用的 docker 中的 mysql 吧,应为我看别人说数据库放 docker 里不好所以 docker-compase.yml 里只写了 nodejs 的配置
    philsky28
        43
    philsky28  
    OP
       2020-07-06 16:04:52 +08:00
    @LichMscy 非常感谢!我回去多试试。其实我是挺想做全栈软件研发的,所以想学一下最主流正规的做法
    philsky28
        44
    philsky28  
    OP
       2020-07-06 16:29:35 +08:00
    @LichMscy 所以我想的是最好本地写 compose 直接用 mysql 镜像,上了生产就变成连接宿主机的 mysql
    byzf
        45
    byzf  
       2020-07-06 19:27:55 +08:00
    没有很看懂你配置的环境, 如果你是用 docker 启动 nodejs 项目和 mysql 的话, 可以建一个 docker 网络, 然后在 docker run 里指定这个网络, 然后它们的 localhost 就是通的. 不管开发环境还是线上环境都是这样配置的, 为的就是大家都走 localhost, 方便.

    你把数据库配在另一个网络里, 有点脱裤子那啥.

    mysql 和 PostgreSQL 团队里有专门的测试 docker 性能的文章,cpu 、内存和硬盘 io 都是接近 0 损耗, 但是网络用默认模式每秒处理的请求数会下降的很快, 15%-30%.

    k8s 的默认网络模式用的不是 docker 的 bridge 网络, 一个是靠 kubelet 自己管理 host 文件, 另一个是所有流量都走 kubelet 代理, 前者应该比 bridge 性能好一点, 后者应该差不多. 其它还有几个模式. 这个我没研究过.

    说点生产环境的事, 一个稍微成型的项目用到 3-4 个进程+2-3 个数据库很正常, 每个进程有不一样的环境和配置文件, 每个数据库有不一样的地址, 把这些配置和网络集中到一个 yaml 里, 一键启动一键 debug, 省几个小时何乐不为.

    运维人员的工时和经验才是最贵的, 性能有损失加钱加配置就行了, 少请一个运维才是最省钱的. 生产环境不用 k8s 部署 mysql 不是为了性能, 是为了数据安全, 一般都用托管的. 不过自己系统稳定的话, k8s 上跑数据库的多了去了, 用不用都行.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2804 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:39 · PVG 15:39 · LAX 23:39 · JFK 02:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.