mac 中的 docker 如何连接本机的 mysql ,数据库应该用 docker 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
philsky28
V2EX    Docker

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

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

    首先描述下我现在本地的是一个 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 是跑在虚拟机上的,跑数据库会有那么点性能损失,所以不太推荐的话这里还还算靠谱那么点
    orcusfox
        12
    orcusfox  
       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  
    PRO
       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 +0: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     Solana     1141 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 17:50 PVG 01:50 LAX 09:50 JFK 12:50
    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