Administrator
Administrator
发布于 2021-11-24 / 435 阅读
0
0

docker容器间互相访问

如果在宿主机上用docker启动一个mysql容器, 我们需要在容器创建时通过 -p 3306:3306将mysql容器的3306端口映射到宿主机的3306端口上。但是如果另外还有一个应用跑在容器a里,如何让容器a可以访问mysql容器呢?

我是在跑halo时遇到这个问题。办法肯定是有的。主要有以下:

  1. 直接ip连接
    首先通过docker inspect mysql5.7 | grep IPAddress查询mysql5.7这个容器的ip地址,然后halo容器中使用这个ip地址进行访问。
    优点: -
    缺点: mysql容器重启后ip是会变的

  2. 通过--link关联
    通过docker run halo --link=mysql5.7将halo链接到mysql5.7这个容器。halo容器中,就能直接通过容器名连接了,如mysql5.7:3306
    优点: 重启也不会失效
    缺点: 如果halo除了要连接mysql5.7容器,还要连接很多其他容器,命令就会比较复杂了,维护性比较差。
    原理: 使用--link时,将mysql5.7的ip写入到halo容器中的/etc/hosts里了。

  3. 通过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 ...

评论