解决docker容器之间网络互通

docker容器之间相互访问


1.查看当前的网络

Copy
[root@host ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3dd4643bb158        bridge              bridge              local
748b765aca52        host                host                local
4d59a0cd3ff4        none                null                local
2.创建一个bridge的网络(如不加参数,默认创建的就是bridge类型的网络)

Copy
[root@host ~]# docker network create my_net
a80ae06b65918f5e653faae643af6dbcbe2f4607053211a0528d24f62e46f649
[root@host ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3dd4643bb158        bridge              bridge              local
748b765aca52        host                host                local
a80ae06b6591        my_net              bridge              local
4d59a0cd3ff4        none                null                local
3.查看该网络的详细信息

Copy
[root@host ~]# docker network inspect my_net
[
    {
        "Name": "my_net",
        "Id": "a80ae06b65918f5e653faae643af6dbcbe2f4607053211a0528d24f62e46f649",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
4.启动容器时指定网络

注:需要使用–name为容器指定一个名字

Copy
[root@host ~]# docker run --name boot1 -d --network my_net bbacc5de5941
7ca3834887355e3ecb4a2ae484694c2dbc0944f12e23498fd4b03237c4c35632
5.将已启动的应用连接至网络

注:需要使用–name为容器指定一个名字

Copy
[root@host ~]# docker run --name boot2 -d b8ea3d603e18
d281bfeb900325724968ec89f7e4623f9add844d101cf4773f3b14c36253f301
[root@host ~]# docker network connect my_net boot2
6.再启动一个centos7容器,同时连接到该网络

Copy
[root@host ~]# docker run -it --name my_centos --network my_net centos:7
[root@b4f27e7db4c0 /]
7.在centos7容器中访问另外的两个容器。

注:这里boot1、boot2是两个spring-boot项目,端口均为8080。

Copy
[root@b4f27e7db4c0 /]# ping -c 4 boot1
PING boot1 (172.18.0.2) 56(84) bytes of data.
64 bytes from boot1.my_net (172.18.0.2): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from boot1.my_net (172.18.0.2): icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from boot1.my_net (172.18.0.2): icmp_seq=3 ttl=64 time=0.097 ms
64 bytes from boot1.my_net (172.18.0.2): icmp_seq=4 ttl=64 time=0.084 ms

--- boot1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3111ms
rtt min/avg/max/mdev = 0.055/0.081/0.097/0.017 ms
[root@b4f27e7db4c0 /]# ping -c 4 boot2
PING boot2 (172.18.0.3) 56(84) bytes of data.
64 bytes from boot2.my_net (172.18.0.3): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from boot2.my_net (172.18.0.3): icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from boot2.my_net (172.18.0.3): icmp_seq=3 ttl=64 time=0.078 ms
64 bytes from boot2.my_net (172.18.0.3): icmp_seq=4 ttl=64 time=0.101 ms

--- boot2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3085ms
rtt min/avg/max/mdev = 0.065/0.083/0.101/0.016 ms
[root@b4f27e7db4c0 /]# curl http://boot1:8080/
Hello Docker World[root@b4f27e7db4c0 /]#
[root@b4f27e7db4c0 /]# curl http://boot2:8080/
Hello Docker helloaaasdfasdf[root@b4f27e7db4c0 /]#
[root@b4f27e7db4c0 /]#
8.查看网络详细信息

注:按组合键ctrl+P+Q退出my_centos容器

Copy
[root@b4f27e7db4c0 /]# [root@host ~]#
[root@host ~]# docker network inspect my_net
[
    {
        "Name": "my_net",
        "Id": "a80ae06b65918f5e653faae643af6dbcbe2f4607053211a0528d24f62e46f649",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "7ca3834887355e3ecb4a2ae484694c2dbc0944f12e23498fd4b03237c4c35632": {
                "Name": "boot1",
                "EndpointID": "10a5dad08d25fb5fbefdf3240b8b94edcf76e6e40ef8f1bb8fe029d288338e75",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "b4f27e7db4c01105ec2d59b34cf7971929d4c8563c3d3c4b6ff8bb61d031fe34": {
                "Name": "my_centos",
                "EndpointID": "9cbb7f1c9747787e70c0f94cc4924c987b084553426fbfa2b62713c178614498",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "d281bfeb900325724968ec89f7e4623f9add844d101cf4773f3b14c36253f301": {
                "Name": "boot2",
                "EndpointID": "19b58907f5209b98f316c83dddba08c0eacc38a677162767250dbdf4fbb9f3fa",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@host ~]#

docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。也就是他会直接使用宿主机的端口,设置端口映射会失效,也就是直接使用默认启动端口,假设多个,他就会让端口递增,比如第一个tomcat是8080,第二个就是8081,所以在使用host模式的时候不需要指定端口映射
 

启动web服务只能本地localhost访问无法从外部访问

现象
java springboot项目启动后,localhost(或127.0.0.1)加端口可以访问,但是使用外网IP却无法访问。

原因及解决方法
springboot 的配置文件(yml 或 properties) 中缺少 server.address 的设置。

解决方法:
在springboot 的配置文件中增加 server.address 的配置。yml 配置文件如下所示:

server.address 用于指定server绑定的地址。

规则1:
server.address 为对应机器ip地址时 ,如 101.12.x.x
此时访问该服务只能使用 ip 访问 。

规则2:

server.address 配置为0.0.0.0

在服务器中,0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。如果想让springboot 应用通过外网ip可以访问,一般情况,将server.address 配置为 0.0.0.0 即可。

一般源码里面都是指定本机网络的,要开发改成0.0.0.0,匹配所有ip地址
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值