最近延续之前的开发流程,使用docker进行环境搭配,但发现使用docker进行数据库的连接会比较麻烦,所以写写文章记录一下下
docker拉取镜像
有桌面端的可以直接搜索直接pull
没有的话直接就docker pull就好了
docker pull mysql
接下来就是启动我们的mysql镜像了,这里就不建议用桌面端了,直接打开我们的cmd或powershell就行了
输入这个
#原 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag #修改后 docker run --name some-mysql -p 3307:3306-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql #这里的some-mysql是我设定的容器名称,MYSQL_ROOT_PASSWORD是你的密码,我设定的是my-secret-pw, -d后面跟的是镜像mysql
ok,然后我们就能看见直接docker里的容器都有啥了
docker ps
接下来进入我们的容器里
使用的是
docker exec -it 容器ID /bin/bash
然后进入我们的sql
因为设置的密码是my-secret-pw
所以-p后面写他
这边启动完了,我们可以试试在navicat上连接试试
填上我们的信息,这里讲一个小点,因为docker容器跑着本机,主机地址也是直接就是localhost就行,端口刚刚启动的时候,设置的是3307.
这样便连接成功了
那个localhost也可写你主机的ip地址,怎么找呢
在cmd里输入这个就好了
这里的ipv4地址就是我们的localhost了
跨容器连接
因为我另一个容器跑的是django,所以就以django作为演示了
我们可以看见如果按照桌面上的配置,它跑不通,会报错,django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '172.xxxx' ([Errno 111] Connection refused)")
那咋办呢?
我们换成localhost试试
还是报错,这个属于是容器隔离的锅,那么是不是说,只要我们是一个容器就行了,但是一个容器的话,我们得重写dockerfile很难受,而且这样服务端跟客户端不分离也难受,这样的话,理论上,只要我们是一个ip就行,那该咋做呢??
我们只需要把我们俩个容器放到一个network里就好了
打开powershell
写
docker network create mynetwork docker network connect mynetwork some-mysql docker network connect mynetwork fervent_panini
容器名记得写对,别写了我的了。
连上了之后,我们再试试
还是不行,咋办呢,只要我们把host改成容器名就好了
这样跨容器的mysql就配置好了