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