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


文章目录



容器之间为什么要互访

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 容器的三种容器之间互访的方法.

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

回到顶部