首先描述下我现在本地的是一个 node 项目(nest.js),在连接 mysql 数据库的配置文件里(用的 typeorm )数据库链接地址写了 localhost 发现连接不上去,搜索了一下知道 docker 中的 localhost 不是本机 localhost,要把 localhost 换成 docker0 的 ip 地址才行,但是这时候我有了两个问题: 1,我本地是 mac,mac 中没有 docker0 网卡 2,docker 上传到 vps 生产环境后,他的 ip 地址会变化吗?如果变化的话际开发中如何保证在本地 ok 上生产后那些环境变量也能保证没问题呢?
网上搜的很多教程是把 mysql 也做成了 docker 镜像,但是好像也有很多人说数据库不应该使用 docker,现在大公司主流的做法究竟是什么呢?我是前端,这块学的很吃力,希望能有大佬解答一下。。。
1
philsky28 OP 滴滴滴有人吗
|
2
niubee1 2020-07-05 15:38:28 +08:00
数据库不要上 Docker
|
3
waising 2020-07-05 15:41:12 +08:00
本地 host 模式可以用吗 mac 下的 docker 网络这块好像有点坑
|
4
gigantic222 2020-07-05 16:01:44 +08:00 1
docker 版本多少?试试 host.docker.internal
|
6
niubee1 2020-07-05 17:00:56 +08:00
docker 的容器是要 stateless,本次存文件都不要。数据库是干嘛,数据持久化,完全是背离的东西,干嘛硬要搞到一块儿?
|
7
dagouziwangwang 2020-07-05 17:09:55 +08:00 9
@niubee1 docker volume 表示一脸懵逼
|
8
hakono 2020-07-05 17:14:17 +08:00
|
9
whileFalse 2020-07-05 17:15:28 +08:00 1
链接本机局域网 IP,或者用 host.docker.internal
|
10
whileFalse 2020-07-05 17:16:03 +08:00
本机环境或者公用测试环境,数据库用 Docker 问题不大
|
11
hakono 2020-07-05 17:16:08 +08:00
@niubee1 mount 下 volumn 就完结的事情。如果你说 mac 中的 docker 是跑在虚拟机上的,跑数据库会有那么点性能损失,所以不太推荐的话这里还还算靠谱那么点
|
12
napsterwu 2020-07-05 17:20:10 +08:00
k8s pvc 表示一脸懵逼,docker 当然可以持久化,不过个人认为不是需要横向扩容的支持集群的 db 也没有太大必要容器化
|
13
SevenJ 2020-07-05 17:24:58 +08:00
|
14
shiny 2020-07-05 17:30:19 +08:00
你这种情况,为了方便,完全可以把 MySQL 放容器里,不要太香。
哪怕是线上环境,多大的量级,就担心数据库放容器里有性能损失了? |
15
gigantic222 2020-07-05 17:51:03 +08:00
tidb es 之类的分布式数据库表示 docker 真香
|
16
abowloflrf 2020-07-05 17:57:00 +08:00 via iPhone
只是本地开发测试的话,没有网络隔离的需求,启动容器的时候 network 用 host 模式就好了
|
17
niubee1 2020-07-05 18:40:43 +08:00 2
@dagouziwangwang
@hakono 你们没有 get 到点,没工夫长篇大论的说。Docker Volume 是什么,是属于实例的还是属于宿主?能做到和这么做好不好也是两码事 @napsterwu docker 当然可以持久化,但是 docker 的实例要不要有状态,有状态好还是无状态好。就跟讨论面向对象编程和函数式编程一样。 这种架构的事情,各有各的说法,我也就一说,不愿意深次思考的就继续 mb 吧,你们说得都对 |
18
newtype0092 2020-07-05 19:11:23 +08:00 2
@niubee1 我觉得是你没搞懂 Docker 怎么用
作为本机环境来说 Docker 就是个无状态的运行时容器,用来跑 MySQL 程序而已,文件和配置我想存在哪存在哪,想起几个起几个,完全不会干扰。 你本地安装才会有各种各样和具体机器相关的问题,每个机器上都不一样完全不方便重复部署。。。 |
19
newtype0092 2020-07-05 19:17:10 +08:00
用 Docker 起 MySQL,在 Dockerfile 里配置好映射的端口,这样宿主机就可以用 localhost+指定端口的形式访问,也可以把 sock 文件映射到宿主机直接用来访问。
你所有 Docker 内的环境应该都通过 Dockerfile 传进去,这样部署到哪里都不会变。 |
20
jason94 2020-07-05 19:54:52 +08:00
我写 nodejs 项目会创建 docker-compose.yml ,把 mysql 、 phpmyadmin 和 redis 写里面 ,然后一行命令就启动好开发环境了,特别是在协同开发的时候非常方便。
|
21
miao1007 2020-07-05 20:02:41 +08:00 via iPhone
自己本地随便折腾 不会有性能问题
|
22
bfme 2020-07-05 20:04:17 +08:00
我是来看各位有何高见的。。瓜子板凳已备好。
|
23
bfme 2020-07-05 20:06:47 +08:00
就连个数据库 搞得这么麻烦。。
不用 docker 可以用宿主机内网 Ip+端口号访问啊,要是用 docker 就将数据挂载出来--link 就好了。 |
24
kchum 2020-07-05 20:40:05 +08:00
不用 docker-compose 吗? docker-compose 的话用 service name 还是 container name 就可以了,我两个都一样,你测试看看,这两个都不会变的
|
25
rockyou12 2020-07-05 21:40:24 +08:00
@niubee1 别装了,我生产用容器化的数据库用这么久了屁事都没有,只要应用本身对容器化支持得很好就完全 ok
mysql 这些只要不是特别高的负载其实随便用的,我之前有个一月写几十个 G 的 pg 数据库也是直接用的容器方案,同样没任何问题(当然,有些调优会麻烦) |
26
matrix67 2020-07-05 21:42:10 +08:00
seafile 的 sql 就是用的容器
|
27
yanfany 2020-07-05 23:17:09 +08:00
歪个楼,不知道有没有谁知道 在服务器上的 docker 镜像使用不了 cmake gui 怎么解决,会报连接不到 X serve 的错误
|
28
CoderGeek 2020-07-05 23:26:34 +08:00 1
看需求 正常情况 用 rds 就已经很成熟了 弹性扩容之类的, 像 db 缓存等暂时还没用到过。
基本都是些 web 网关 脚本任务 一类的 |
29
CoderGeek 2020-07-05 23:27:30 +08:00
还有个人玩 mac 上在搞个容器库也没啥意义啊 本地有的话不省点资源嘛
|
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 不行?回帖请看看右下角——“请尽量让自己的回复能够对别人有帮助” |
31
initd 2020-07-06 03:11:16 +08:00
建议涉及运行环境的东西 虚拟机跑 Linux, 毕竟线上环境就是 Linux,
|
32
bluehtt 2020-07-06 07:35:17 +08:00 via iPhone
默认可以用 172.17.0.1 连接宿主机
|
33
594duck 2020-07-06 09:00:08 +08:00 via iPhone
@niubee1 老哥那些用 docker 跑数据库还一个月十几 G 的牛逼人物,你就放声他们牛逼就好了,讲道理他们是不会听的。这种粉红程序员缺少社会的毒打。
就像我最喜欢放生边缘项目用 docker 做生产环境。从朝气满满,怼天怼地到最后看着他们的 SLA 和预算崩盘,一脸苦逼的样子笑出了朱叫。 |
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 通就应该没有问题 |
35
Actrace 2020-07-06 09:14:13 +08:00 1
@594duck 之前有尝试想用 docker 降低部署成本,不过发现搭建的应用无法获得外部 IP 。最后还是没用上 docker 。
|
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 根本没差,因为决定成功的因素根本不在这方面。 |
37
killerv 2020-07-06 09:55:55 +08:00
#9 说的没错,可以这么用
另外 2# 上来就说不要上 Docker,我感觉是无脑。本机又不是生产环境,怎么方便怎么来,我就喜欢在本机用 docker 跑数据库,因为简单、不污染本地环境。 楼主,Mac 不建议直接跑 docker,磁盘 IO 差到爆炸,你安装个 Linux 虚拟机跑 Docker 都比本机强百倍。 |
38
Martin9 2020-07-06 10:06:56 +08:00
我之前 mac 上装了 docker,坑太多了,建议虚拟机里面装
|
39
1109599636 2020-07-06 10:18:33 +08:00
数据库程序本身可以 docker, 但是数据文件可以用 volume 挂载到 docker
|
40
wuqingdzx 2020-07-06 10:52:27 +08:00
docker.for.mac.localhost
|
41
janxin 2020-07-06 11:40:42 +08:00
开发测试环境哪那么多要求,无所谓的
IP 会变化的,但是 docker 为什么要传到生产环境?这是什么操作 |
42
philsky28 OP @kchum docker compase 应该是用的 docker 中的 mysql 吧,应为我看别人说数据库放 docker 里不好所以 docker-compase.yml 里只写了 nodejs 的配置
|
44
philsky28 OP @LichMscy 所以我想的是最好本地写 compose 直接用 mysql 镜像,上了生产就变成连接宿主机的 mysql
|
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 上跑数据库的多了去了, 用不用都行. |