解决docker容器之间网络互通 启动web服务只能本地localhost访问无法从外部访问

这篇具有很好参考价值的文章主要介绍了解决docker容器之间网络互通 启动web服务只能本地localhost访问无法从外部访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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地址
 文章来源地址https://www.toymoban.com/news/detail-498379.html

到了这里,关于解决docker容器之间网络互通 启动web服务只能本地localhost访问无法从外部访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Docker服务以及容器如何设置自动启动

    Docker服务以及容器如何设置自动启动

    Linux系统部署Java应用时,经常使用Docker进行安装MySQL、Nginx、Redis等应用,如果碰到服务器断电重启,在没有设置自动启动的情况下,我们所有应用都需要重新手动启动一遍,这样就非常麻烦,不能及时处理,所以本文来讲解一下如果设置自动启动,话不多说,直接开始。 1、

    2024年02月11日
    浏览(8)
  • docker 容器与主机端口 在容器中启动服务 多容器端口冲突问题

    容器内的端口等与主机的端口等是分离的,容器中的环境可理解为是虚拟的. 容器中使用的网络环境与主机保持一致: 示例: docker run -it --network host image:tag 其中: --network host表示容器中使用的端口 IP等都是主机上的。 容器中端口可以映射到主机端口,且多个不同的主机端口

    2024年02月16日
    浏览(6)
  • docker服务器、以及容器设置自动启动

    查看已启动的服务 查看是否设置开机启动 设置开机启动 关闭开机启动 启动时加--restart=always 如果已经过运行的项目

    2024年02月12日
    浏览(32)
  • Docker服务以及容器如何设置设备开机自动启动

    Docker服务以及容器如何设置设备开机自动启动

    如果碰到断电重启,在没有设置自动启动的情况下,我们所有应用(比如redis)都需要重新手动启动一遍,这样就非常麻烦,不能及时处理,所以本文来讲解一下如果设置自动启动,话不多说,直接开始。 使用docker run命令创建容器时没有添加参数 --restart=always ,导致的后果是

    2024年02月04日
    浏览(8)
  • 解决docker启动mysql容器失败问题

    解决docker启动mysql容器失败问题

    声明:我使用的mysql版本为:8.0.21 当我通过docker使用以下命令启动mysql mysql/data 是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。 mysql/log 是数据库主生的log。建议挂载到容器外。 /etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免

    2024年02月11日
    浏览(8)
  • IDEA整合Docker,一键打包服务镜像与启动容器

    IDEA整合Docker,一键打包服务镜像与启动容器

    尝试了IDEA整合Docker,坑有些多,但经过查阅资料都一一解决了,写了个案例,感觉这种方式确实要方便很多。下面来整理下步骤: 一、安装Docker 准备一台Linux,我这里用的是centos 7 mini 版,然后安装Docker 安装Device Mapper: 配置Docker的yum源: 更新yum缓存 安装Docker-ce 等待上述加

    2024年02月02日
    浏览(14)
  • Docker服务重启后让容器自动启动 | restart参数

    问题:服务器断电之后,docker服务挂掉了,需要重启docker,但是我们重启 docker 后,容器也就停止了,不会跟随 docker 启动而启动。那么如果想在docker服务重启之后让容器自动启动,该怎么操作呢? 1.容器还没有创建,在运行容器的时候加入 –restart=always 参数 2.容器已经运行

    2024年02月10日
    浏览(4)
  • 解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示

    解决:docker创建Redis容器成功,但无法启动Redis容器、也无报错提示

    1.修改redis.conf配置文件参数 daemonize 为 no : 由于创建容器实例时,会进行容器数据卷挂载,因此可以直接在外部宿主机里面修改,docker会自动同步该文件到redis容器对应目录里面 2.删除之前创建的redis容器实例 3.复杂使用run命令,再次重新创建redis容器实例。会进行容器数据卷

    2024年02月20日
    浏览(9)
  • Docker 启动容器遇到 operation not permitted 错误的解决

    问题 在 Linux 启动容器报错 operation not permitted ,容器运行失败 (但在 Mac 上运行正常,注 Mac 上的 Docker 版本不同于 Linux) 报错示例: 原因 与 Linux 的权限安全保护相关 https://bugzilla.redhat.com/show_bug.cgi?id=1764152 https://blog.twtnn.com/2021/09/docker-containeroperation-not-permitted.html ...Linux為了

    2024年02月11日
    浏览(9)
  • docker启动容器指定时区 解决mysql时间非北京时间问题

    运行docker镜像的时候可以指定环境变量TZ来设置使用那个时区的时间。如果不指定有些镜像在制作的时候设置了跟自己想用的时区不一样的时区就会出现尴尬的问题。 指定使用东八区时区命令如下: docker run -e TZ=Asia/Shanghai … docker启动mysql容器命令,指定库表编码:

    2024年02月14日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包