跳到主要内容

Docker 容器之间互访的几种形式

· 阅读需 5 分钟
一介布衣
全栈开发者 / 技术写作者

  • 文章目录

    • 容器之间为什么要互访
    • 虚拟IP访问
    • link 访问
      • 启动 mongodb 容器
      • 启动 redis 容器
      • 测试容器互相访问
    • bridge网络互访
      • 创建bridge网络
      • 查询docker网络
      • 镜像连接到指定网络
        • mongodb容器启动
        • redis容器启动
  • 容器之间为什么要互访

docker容器与容器之间是隔离状态,不能互相访问,但如果有些依赖关系的服务要如何访问对方呢?
介绍三种方法来解决容器互访问题.

虚拟IP访问

安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。
运行一个centos镜像, 查看ip地址得到:192.168.32.2

首先通过 docker ps 查看当前电脑上运行的容器实例

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
916eaaea2865 lingpao-server:1.0 "npm start" 5 days ago Up 5 days 0.0.0.0:7000->7000/tcp lingpaoapi
b96cf6fd35e1 mongo "docker-entrypoint.s…" 5 days ago Up 5 days 27017/tcp, 0.0.0.0:27037->27037/tcp mongodb
fb463d69b482 redis "docker-entrypoint.s…" 5 days ago Up 5 days 0.0.0.0:6379->6379/tcp redis

我们选择其中的 mongodb 容器来查看其ip

docker exec -it mongodb bash

进入容器后,执行 ifconfig
得到的ip是 192.168.32.2

然后我们再进入 redis 容器查看其ip

root@fb463d69b482:/data# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.3 netmask 255.255.240.0 broadcast 192.168.47.255
ether 02:42:c0:a8:20:03 txqueuelen 0 (Ethernet)
RX packets 19713 bytes 26380326 (25.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9713 bytes 528968 (516.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 8 bytes 971 (971.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 971 (971.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

redis 容器中我们得到的 ip地址是
192.168.32.3

然后 redis 容器去ping mongodb 容器

link 访问

运行容器的时候加上参数 link

启动 mongodb 容器

docker run --name mongodb -v /Users/zhangzhi/mongodb:/data/db -v /Users/zhangzhi/docker/mongodb/mongo.conf:/data/configdb/mongo.conf -p 27037:27037 -d mongo -f /data/configdb/mongo.conf

上面指定了容器名称 mongodb 的容器启动 mongodb ,并且映射了本地目录和配置文件 查看docker运行mongodb

启动 redis 容器

docker run -p 6379:6379 --name redis --link mongodb -v $PWD/conf/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

启动docker 容器 redis 服务,指定name redis
--link 指向 mongodb (上一个容器的名称)
映射本地文件和配置文件, docker安装redis详细查看这里

测试容器互相访问

首先进入redis 容器

docker exec -it redis bash

ping mongdb 容器

root@fb463d69b482:/data# ping mongodb -c 3
PING mongodb (192.168.32.2) 56(84) bytes of data.
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=1 ttl=64 time=0.318 ms
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=2 ttl=64 time=0.136 ms
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=3 ttl=64 time=0.131 ms

--- mongodb ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 71ms
rtt min/avg/max/mdev = 0.131/0.195/0.318/0.087 ms

bridge网络互访

创建bridge网络

docker network create mynet

查询docker网络

# zhangzhi @ ZhangZhi-MacBook-Pro in ~ [22:51:32] C:127
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
66ae2944993a bridge bridge local
0eb2bfb561b7 host host local
550a08c770f8 mynet bridge local
75c6e21cce62 none null local

除了默认的3种网络外,我们看到有新建的 mynet 网络

镜像连接到指定网络

docker run -it --name <容器名> —network --mynet <网络别名> <镜像名>

mynet 就是我们上面创建的bridge 网络名称
我们重新启动上面的2个容器

mongodb容器启动

docker run -p 6379:6379 --name redis --network mynet -v $PWD/conf/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

redis容器启动

docker run -p 6379:6379 --name redis --network mynet -v $PWD/conf/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

然后进入 redis 容器执行 ping 命令

root@fb463d69b482:/data# ping mongodb -c 3
PING mongodb (192.168.32.2) 56(84) bytes of data.
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=1 ttl=64 time=0.279 ms
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=2 ttl=64 time=0.115 ms
64 bytes from mongodb.lingpao-server_mynet (192.168.32.2): icmp_seq=3 ttl=64 time=0.105 ms

--- mongodb ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 19ms
rtt min/avg/max/mdev = 0.105/0.166/0.279/0.080 ms

可以ping 通,说明在同一个网络下.

以上就是docker 容器的三种容器之间互访的方法.