【Docker】容器连接到mysql外部数据库(容器互联互通)
当一个docker-compose文件运行的时候,同属一个文件内的所有容器之间会建立一个default的网络,这些容器之间的访问、通讯则都在这个默认的网络下进行。但是通常我们会根据构建更新的频率、业务领域等条件划分不同的docker-compose,而且这些不同的docker-compose的容器之间默认是不支持互相通讯的。那么就需要构建一些公共的网络,然后这些所有的需要相互通讯的容器都加入这个公共网络即可完成通讯。
构建公共网络
1 | docker creae network sharefly[自定义名称] |
需要相互通讯的容器之间定义networks属性
dockercompose声明网络查找和建立连接,在docker-compose.yml的文件底部添加:
1 | networks: |
然后重新build相关容器,完成。
场景:
docker容器实现连接到mysql容器,这里博主是想用nacos容器连接到mysql容器。
前提需要:mysql容器必须有nacos数据库 (必须做好这一步先)
方式一:通过–link互联,适用于容器网络属于docker0
1、启动mysql容器,这里对外暴露端口为3366
1 | docker run -p 3366:3306 \ |
2、启动nacos容器,使用–link到mysql
1 | docker run --name nacos8849 -p 8849:8848 \ |
3、进入到nacos容器
1 | docker exec -it nacos8849的容器id /bin/bash |
4、尝试ping mysql,正常情况下使用mysql01容器名和容器ip都可ping通
5、vim打开nacos的application.properties,修改数据库连接信息。切记端口是3306!
1 | # 注意这里的ip可以用容器名,也可以用mysql容器的ip |
6、修改后重启nacos容器
1 | docker restart nacos8849容器id |
7、看到启动日志成功状态即完成了。
方式二:通过自定义网络互联(推荐)
1、首先创建自定义网络,使用bridge网桥模式
1 | docker network create --driver bridge \ |
2、运行镜像分别创建mysql容器和nacos容器,记得使用–net 指定我们刚创建的网络
1 | # 创建mysql容器 |
3、创建完后进入nacos容器
1 | docker exec -it nacos8850的容器id /bin/bash |
4、虽然nacos容器里能直接ping通mysql容器,但是在nacos配置文件配置上mysql02的连接信息后重新运行nacos容器,发现运行日志报错:连接不上mysql容器
在本机用navicat去远程连接通过自定义网络运行的mysql容器,发现也连接不上!
5、查看原因 (这一步不用跟着敲)
1 | # 查看网络列表 |
查看bridge的网络情况
1 | docker network inspect 825637cadc03 |
我们看到Containers里没有我们刚创建的自定义网络的容器信息,才导致外界连接不上mysql容器。知道原因就好解决了!
6、网络连通,将容器nacos8850和容器mysql02加到bridge网络。
1 | docker network connect bridge nacos8850 |
7、更改nacos8850的application.properties文件。
1 | db.url.0=jdbc:mysql://mysql02:3306/nacos?characterEncoding=utf8 |
8、重新运行拿nacos8850容器,发现启动成功。至此完成。
方式三:
容器内部程序连接外部mysql,需要以远程连接的方式进行访问
开启mysql 远程连接
找到my.cnf配置文件
注释掉 bind-address = 127.0.0.1,
重启mysql
授权root用户可以在任何地址发起连接
create user ‘root‘@’%’ identified by ‘root’;
grant all privileges on . to “root”@’%’;
修改内部程序jdbc连接,不能使用回环地址,需要使用主机IP地址,通过ifconfig查询