docker 通过内部ip,内网ip,容器名,自定义网络别名,访问mysql。以及无法连接问题排查 电脑版发表于:2022/9/6 11:41 docker 是可以通过内部ip,容器名,自定义网络别名,访问mysql的。一般来说只要mysql与程序在同一个网段都是可以使用内部ip与容器名或者自定义网络的别名进行连接的。如果ip会变化就建议不要写死ip,使用容器名,自定义网络别名来连接。其实一般默认docker内部启动容器网络都是默认使用的bridge网络,容器之间是可以互通的,当然也可以自己创建一个自定义网络,我们这里说一下这种情况。 ### 首先创建一个自定义网络 ``` docker network create --driver bridge mynet ``` 创建后可以查看到,我们刚刚创建的网络 ![](https://img.tnblog.net/arcimg/aojiancc2/a801b472fe79475fb7f4700ef69e0a44.png) ### 使用自定义网络启动一个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 ``` 可以看到两个容器都是在我们创建的自定义网络中 ![](https://img.tnblog.net/arcimg/aojiancc2/f057644353e6457ebf96c8a7ca46d4e6.png) #### 测试网络互联 进入api对应的容器 ``` docker exec -it wy_jbland_api /bin/bash ``` 装好ping工具,测试ping容器名称,能ping通 ![](https://img.tnblog.net/arcimg/aojiancc2/799fda9b6c8b4dcb842b217659689236.png) 测试ping,mysql创建容器时候的那个自定义网络的别名也能ping通 ![](https://img.tnblog.net/arcimg/aojiancc2/c06736f5b884453da42eca5a0204614a.png) 直接ping,mysql容器的内部ip肯定也是可以ping通的 ![](https://img.tnblog.net/arcimg/aojiancc2/bf78242a2ab94bff8eb4e16f96638f70.png) 既然能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访问得行......于是纠结了很久。 tn4>后面才发现是不是ip的问题,而是端口的问题!!!!!!,外网ip之所以能连接是因为使用的连接端口是8200,这个是创建mysql容器的时候外部映射的端口,外网ip访问肯定是使用这个端口了,但是通过容器内部的ip去访问不能使用外部宿主机这个端口啊!!!,应该使用mysql容器内部的端口3306去连接!使用内网ip或者容器名称去连接的使用端口修改成3306就可以了!