


docker 是可以通过内部ip,容器名,自定义网络别名,访问mysql的。一般来说只要mysql与程序在同一个网段都是可以使用内部ip与容器名或者自定义网络的别名进行连接的。如果ip会变化就建议不要写死ip,使用容器名,自定义网络别名来连接。其实一般默认docker内部启动容器网络都是默认使用的bridge网络,容器之间是可以互通的,当然也可以自己创建一个自定义网络,我们这里说一下这种情况。
首先创建一个自定义网络
docker network create --driver bridge mynet
创建后可以查看到,我们刚刚创建的网络
使用自定义网络启动一个mysql容器
docker run -itd --name mysql-test -p 8200:3306 --net mynet --network-alias mynet-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysql/data_test:/var/lib/mysql mysql:8.0.30 --lower_case_table_names=1
这里使用了--network-alias
命令指定了一个网络别名,后面也可以使用这个别名进行连接。
使用自定义网络创建一个.net core api容器
docker run --name=wy_jbland_api --net mynet -p 8003:8003 wy_jbland_api:v1
查看网络状态与尝试容器间互通
docker inspect mynet
可以看到两个容器都是在我们创建的自定义网络中
测试网络互联
进入api对应的容器
docker exec -it wy_jbland_api /bin/bash
装好ping工具,测试ping容器名称,能ping通
测试ping,mysql创建容器时候的那个自定义网络的别名也能ping通
直接ping,mysql容器的内部ip肯定也是可以ping通的
既然能ping通也就是说使用上面三种的任意一种方式都可以连接到mysql(当然前提是mysql能支持远程连接)。
测试通过内部ip,容器名,自定义网络别名,访问mysql
通过上面的分析,理论上连接字符串写成,mysql网络别名连接:
server=mynet-mysql;uid=root;pwd=123456;database=wyarchive;port=8200
以及容器名称连接:
server=mysql-test;uid=root;pwd=123456;database=wyarchive;port=8200
或者直接使用内部ip连接:
server=172.18.0.2;uid=root;pwd=123456;database=wyarchive;port=8200
理论上都是可以连接的,但是经过测试都不行,反而是使用服务器的外部ip访问得行……于是纠结了很久。
后面才发现是不是ip的问题,而是端口的问题!!!!!!,外网ip之所以能连接是因为使用的连接端口是8200,这个是创建mysql容器的时候外部映射的端口,外网ip访问肯定是使用这个端口了,但是通过容器内部的ip去访问不能使用外部宿主机这个端口啊!!!,应该使用mysql容器内部的端口3306去连接!使用内网ip或者容器名称去连接的使用端口修改成3306就可以了!
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
默认昵称
不同宿主机器上的docker能够访问通信吗?主机之间互通,运行在各个主机上的docker访问