docker 通过内部ip,内网ip,容器名,自定义网络别名,访问mysql。以及无法连接问题排查 电脑版发表于:2022/9/6 11:41 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访问得行......于是纠结了很久。 tn4>后面才发现是不是ip的问题,而是端口的问题!!!!!!,外网ip之所以能连接是因为使用的连接端口是8200,这个是创建mysql容器的时候外部映射的端口,外网ip访问肯定是使用这个端口了,但是通过容器内部的ip去访问不能使用外部宿主机这个端口啊!!!,应该使用mysql容器内部的端口3306去连接!使用内网ip或者容器名称去连接的使用端口修改成3306就可以了!