如果在宿主机上用docker启动一个mysql容器, 我们需要在容器创建时通过
-p 3306:3306
将mysql容器的3306端口映射到宿主机的3306端口上。但是如果另外还有一个应用跑在容器a里,如何让容器a可以访问mysql容器呢?
我是在跑halo时遇到这个问题。办法肯定是有的。主要有以下:
-
直接ip连接
首先通过docker inspect mysql5.7 | grep IPAddress
查询mysql5.7这个容器的ip地址,然后halo容器中使用这个ip地址进行访问。
优点: -
缺点: mysql容器重启后ip是会变的 -
通过
--link
关联
通过docker run halo --link=mysql5.7
将halo链接到mysql5.7这个容器。halo容器中,就能直接通过容器名连接了,如mysql5.7:3306
。
优点: 重启也不会失效
缺点: 如果halo除了要连接mysql5.7容器,还要连接很多其他容器,命令就会比较复杂了,维护性比较差。
原理: 使用--link
时,将mysql5.7的ip写入到halo容器中的/etc/hosts里了。 -
通过docker的桥接网络 bridge(推荐)
# 创建一个网络环境,名为networkName:
docker network create networkName
# 分别将两个容器添加到这个网络中
docker network connect networkName mysql5.7
docker network connect networkName halo
最后,就可以再halo中,使用容器名访问mysql了, 如mysql5.7:3306
优点: 一劳永逸,配置灵活,维护简单
缺点: -
原理: bridge方式与其他方法不同,其他方法共享宿主机上的/etc/resolve.conf(即dns解析),而bridge则使用自己的dns解析信息。更多内容,翻阅官网
相关命令:
# 查看所有网络
docker network ls
# 查看已经添加到networkName网络中的容器
docker network inspect networkName
# 运行容器时就加入到networkName网络中
docker run -ti --name mysql5.7 --network=networkName ...