文章目录
同宿主机Docker网络通信机制
查看容器IP:
1、如果已经进入了容器则查看hosts文件即可:cat /etc/hosts
2、如果没有进入容器则使用:docker inspect 查看其中的NetworkSettings下面的IPAddress字段即为容器IP;
同一个宿主机中,容器与容器之间的通信可以有几种实现方式:
1、通过容器本身的ip相互直接访问对方;
Tomcat互访、Redis互访、MySQL互访
这种方式会导致ip地址的硬编码写死,不方便迁移,容器重启后,ip可能会发生变化,容器启动时是随机生成的一个ip,通过容器ip访问不是一个好的方案,不推荐使用;
2、通过宿主机的ip:port访问
通过宿主机的ip:port访问,需要将宿主机的端口与容器的端口进行映射;
3、通过link建立连接(老版本使用,官方已经不推荐使用)
运行容器时,指定参数link,使得源容器与被链接的容器可以进行相互通信,并且接受的容器可以获得源容器的一些数据,比如:环境变量;
# 源容器:mysql
docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#被链接容器 centos
docker run -d --name test-centos --link test-mysql:mysql centos
#进入test-centos
docker exec -it test-centos /bin/bash
然后在centos中直接通过 link的名字或者link时候取的别名就能进入:
mysql -h test-mysql -uroot -p123456
或者:
mysql -h mysql -uroot -p123456
通过link建立连接的容器,被链接的容器能 ping 通源容器,反过来不行;
4、通过自定义网络通信(官方推荐)
使用docker network命令创建一个桥接网络,在docker run的时候将容器指定到新创建的桥接网络中,这样同一桥接网络中的容器就可以相互访问;
查看当前宿主机有哪些桥接网络:docker network ls
1、创建桥接网络
docker network create my-docker-network
2、启动容器时,加入创建的网络,并指定网络别名
docker run -d --network my-docker-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql
启动被链接的容器
docker run -d --network my-docker-network --network-alias mysql2 -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql
不同宿主机Docker容器之间通信
Docker跨宿主机通信目前有如下几种主流方法:
1、使用路由机制打通网络;
2、使用Open vSwitch(OVS)打通网络 ;
3、使用flannel来打通网络;
4、使用Quagga来实现自动学习路由;
5、借助openstack、k8s等方式打通网络;
我们介绍使用路由机制打通网络方案;
a机192.168.10.128,容器网段172.18.0.1/16,a机起了容器ip是172.18.0.2
b机192.168.10.130,容器网段172.17.0.1/16,b机起了容器ip是172.17.0.2
两台机分别配置路由表
a机,route add -net 172.17.0.0 netmask 255.255.255.0 gw 192.168.10.130
b机,route add -net 172.18.0.0 netmask 255.255.255.0 gw 192.168.10.128
添加好后,查看路由 route
然后a机ping b机容器,发现仍是ping不通,就是数据包会drop掉;
ip_forward配置
我们在b机上使用以下命令查看网络包转发情况,发现会丢失
iptables -t filter -nvL FORWARD
我们需要b机上配置,寻找172.17段ip的网络包不丢失,进行转发;
a机器: iptables -I DOCKER -d 172.17.0.0/16 -j ACCEPT
b机器: iptables -I DOCKER -d 172.18.0.0/16 -j ACCEPT
从而整个网络联通;
修改镜像的名称:
docker tag bedb47dcc893(镜像ID) my_jdk1.8.0_191:latest
Docker部署Spring Cloud
128机器:
Mysql、Rabbitmq、Eureka、Config、Zinkin
130机器:
portal服务、goods服务、orders服务
微服务网络访问图(如下):
部署RabbitMQ:
docker run -d -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 -v /opt/rabbitmq/data:/var/lib/rabbitmq --privileged=true --network my-docker-network --network-alias rabbitmq128 rabbitmq:management
部署mysql:
docker run -d -p 3306:3306 -v /opt/mysql/data:/var/lib/mysql --privileged=true --network my-docker-network --network-alias mysql128 -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql
部署eureka注册中心
docker run -d -p 8761:8761 --network my-docker-network --network-alias eureka128 34-springcloud-service-eureka
部署spring-cloud-config
docker run -d -p 8888:8888 --network my-docker-network --network-alias config128 34-springcloud-service-config
部署zipkin
docker run -d -p 9410:9410 --network my-docker-network --network-alias zipkin128 34-springcloud-service-zipkin
部署goods
docker run -d -p 9100:9100 --network my-docker-network130 --network-alias goods9100 34-springcloud-service-goods-9100