用Docker布置后端开发环境踩坑记录

又名:关于docker container里布置mysql并远程连接的踩坑记录

背景

我要开发一个公司内部用的值班系统,里面需要用到数据库。一开始我是在自己本机Macbook Pro上尝试的,但感觉MacOS的环境毕竟和Linux的不太一样,可能在最终部署时会遇到一些未知问题。所以我打算在本机上启一个docker容器,在docker容器里把所有环境都布置好,直接在里面进行开发和布置数据库。
我自己此前对docker的基本命令较为熟悉,但对网络、数据库相关的事情等于完全没有接触过,这也导致我踩了很多坑

踩坑过程

技术栈的选择

我是跟随这篇教程在走的,感觉对前后端的联通说的比较清楚
https://zhuanlan.zhihu.com/p/146874556

但这里选用了mysql,其实我的数据库量级非常小,倒是没必要用mysql,但既然选择了这个教程,就跟着来,用mysql

Docker镜像的选择

起初,为了追求环境的纯净,我拉取了一个轻量级的纯Ubuntu环境,里面除了ubuntu以外几乎什么都没有,所以我几乎花了一晚上的时间,在各种apt-get install,此外,我还试图在环境里安装python,我选择了先把python源码拉取下来,然后再编译,大家知道编译对环境的要求也比较高,于是我开始装gcc等东西,但安装的时候就会发现A依赖于B和C,去安装B,又发现要装D和E,无限循环下去感觉没有尽头,所以我放弃了这个方案;

布置mysql受阻

第二天听从小伙伴的建议,我拉取了一个python的docker环境,这样里面最起码有了一个python,起初我的规划是,把开发和数据库放在一个环境中,但当去安装mysql的时候,发现存在各种各样的问题,比如我甚至没有办法查看mysql服务的status,看起来是docker容器的限制。 我找了一些回答, 这个是质量高的两个,关于无法在docker里使用systemctl restart mysql的情况:
https://www.cnblogs.com/ivictor/archive/2015/09/25/4837750.html
https://blog.csdn.net/tengdazhang770960436/article/details/78873869

插播:第一次用mysql

show databases没有任何数据库出现

记得要在句末输入分号!,这里引用了网上的回答

解决方法:所以我们得知了,似乎是要以;结尾,如果不是,那他就会默认为你这一语句没有结束,这也就是为什么我再次输入show databases;时候会出现错误,因为它所接收到的语句变成了show databases show databases;自然是没有这样的语言的。那么怎么解决呢?如果你是刚登陆进去mysql,只需要直接输入show databases;就可以了,但是如果你已经输入了show databases,那就先输入“exit;”退出,然后重新登录进去,在输入show databases;就可以了

寻找一个专门的sql镜像

我又去咨询了研发小伙伴,得到的建议是可以直接拉取一个mysql的镜像。这样的话我可以用一个镜像专门做存放代码和启服务的地方,另一个镜像专门放数据库,然后通过宿主机在两个容器之间通信,这样似乎是可行的。所以本着这样的想法,我又继续开始了踩坑。

mysql

启动sql容器

我是跟着这篇教程来启sql的docker容器的https://www.cnblogs.com/ilifeilong/p/11784630.html
这里有提到,启容器的时候端口映射用3306,但当我第一次启的时候就发现本机的3306端口被占用了,当时很自然的换成了8xxx的端口,觉得不会影响

navicat远程连接

用8xxx顺利的run起来了容器,然后在容器里启动了mysql服务,然后试图用navicat去连接,发现无论如何也连不上,但当时不觉得是3306端口的问题。觉得可以是没有找到docker正确的IP,这里我走了弯路,见如下描述:

后来发现如果要用mac连接docker容器里的数据库的话,本机地址不能用localhost,而要用一个叫做docker-machine的工具去查本机的ip,然后又折腾了半天docker-machine。参考:https://www.cnblogs.com/yhtong/p/8070346.html 

建立一个docker-machine虚拟环境的时候,发现一直卡在waiting for ip这步,然后查了下原来vmware不支持在mac上分配ip?(大概是这个意思,和intel有关系)

所以尝试用vmware fusion,通过https://www.cnblogs.com/yjmyzz/p/docker-machine-using-vmware.html 这个博客来解决

最终终于可以正常的docker-machine ip了,但我所得到的ip地址没有任何的作用,输入到navicat里以后依然连不上,所以关于docker-machine的一通折腾感觉没有什么帮助

试试是docker的问题,还是端口的问题,还是玄学问题?

之前有提到我还有另一个用于开发的docker环境,我进入环境里,启了flask,端口映射也提前配置好了,是8889:8089
试图在本机访问,一开始输入的网址localhost,127.0.0.1后面配8089都无法访问,最后试了试0.0.0.0:8089,终于搞通!
这样就排除了docker自身的问题,最起码是可以映射成功的!

找到端口占用

我决定还是关注于3306端口被占用的问题,之所以被占用,可能是和我几天前在本机上装过mysql有关,一开始尝试的是:

lsof -i :3306

然后发现没有任何返回,docker明确说端口有占用,但用这个命令查不出来,为什么呢?搜了教程,果断加上sudo,于是好了,发现被本机的mysql占用了。

删除mysql

去网上搜了下如何卸载mysql,通过命令的方式卸载掉了,但卸载掉以后端口还是占用的,于是果断按照 https://lucifer.blog.csdn.net/article/details/83274290 kill了mysql的进程,感觉还挺残忍的有木有,兴许是内心戏太丰富了。这样kill掉以后,3306端口就释放出来了,于是基于刚才的容器commit出了一个镜像,再把原容器删掉,基于新的镜像创建了一个新的容器,docker run的时候端口映射了3306:3306,一切正在往好的方向发展!

docker容器中重启mysql

嗯,一步简单的操作!

成功!

最后在宿主机上(我的是mac),按照下面这个教程,用navicat软件成功连接上了docker容器里的mysql
https://blog.csdn.net/michaelehome/article/details/103673290

总结:

  1. 虽说是面向度娘的编程,但网上的信息太杂,而且信息质量差,这就需要筛选的时候更加细心,要多看几篇,比较一下,也要看下面的评论。因为一旦跟着一个错误的教程走向一条错误的路,后悔的话绝对不是撤销那么简单。
  2. 找到一篇高质量的教程以后,严格的跟着做,不要freestyle,因为不知道哪一步跟漏了,后面就会出现很多未知的错误,非常影响效率。例如mysql docker容器端口映射的时候,随便设置成了8008,虽然感觉也没有什么错,但用navicat连接的时候就是怎么都连接不上
  3. 从一开始就要尽量选择对布置环境更友好的方案,否则编程一时爽,布置环境呵呵呵
  4. 以前做实验学科科研的时候,我很讨厌和实验本身无关的所有准备工作,比如联系测试地点、准备样品,各种很无聊但是不做又不行的事情;从今天布置环境我发现,可能世界上大多数事情都是这样,一开始的准备工作就会花费80%以上的时间,剩下20%才是看起来“很有趣”的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容