一、同宿主机Docker网络通信机制

在这里插入图片描述

1、查看容器IP:

1、如果已经进入了容器则查看hosts文件即可:cat /etc/hosts、
2、如果没有进入容器则使用:docker inspect 查看其中的NetworkSettings下面的IPAddress字段即为容器IP;
在这里插入图片描述

2、容器访问宿主机 / 宿主机访问容器

  • 宿主机ping容器
    在这里插入图片描述
  • 容器ping宿主机
    在这里插入图片描述- 容器访问外网
    在这里插入图片描述- 宿主机访问外网
    在这里插入图片描述
  • 外网访问容器,
    外网访问容器,则需要通过端口映射,即宿主机的端口映射容器内服务的端口;
    外界–>宿主机8080端口–>容器8080端口
    (要求:宿主机8080端口 映射到 容器8080端口)

3、同宿主机中容器和容器之间的访问

同一个宿主机中,容器与容器之间的通信可以有几种实现方式:

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

在这里插入图片描述
在这里插入图片描述

4、不同宿主机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.129,容器网段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.129
    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

-从而整个网络联通
在这里插入图片描述
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐