dockerlocalhost能访问,主机ip访问不了

dockerlocalhost能访问,主机ip访问不了,第1张

容器配置的问题。

1、在启动容器时,使用-p参数将容器端口映射到主机端口。

2、确保主机的防火墙或安全组没有禁止对应端口的访问。可以暂时关闭防火墙或安全组,尝试访问容器的服务,如果可以连接,说明是防火墙或安全组的问题,应该配置允许对应端口的访问。

3、确保主机和容器都连接到同一个网络中。可以使用dockernetworkls命令查看容器网络列表,如果主机和容器分别连接到不同的网络,则无法访问容器内的服务。可以使用dockernetworkconnect命令将主机加入容器所在的网络中。

1创建一个网络(子网掩码设置大一点,这样就有用不完的私网IP了)

docker network create --subnet=17217200/16 my_docker_net

2启动容器的时候 指定网络和IP地址,感觉容器名字包含IP的信息会好记一点,如:

redis:

docker run -itd --name myRedis_0_5 --net my_docker_net --ip 17217205 -p 6379:6379 redis

rabbitMq:

docker run -d --hostname myRabbit --name myRabbit --net my_docker_net --ip 17217206 -p 15672:15672 -p 5672:5672 rabbitmq

docker exec -it myRabbit rabbitmq-plugins enable rabbitmq_management

指定MQ版本:

docker run -d --hostname myRabbit310 --name myRabbit310 --net my_docker_net --ip 17217207 -p 15672:15672 -p 5672:5672 rabbitmq:310-rc-management

docker exec -it myRabbit310 rabbitmq-plugins enable rabbitmq_management

docker exec -it myRabbit310 rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management

mysql:

docker run -itd --name mysql-local --net my_docker_net --ip 17217202 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

xxl-job-admin

docker run -e PARAMS="--springdatasourceurl=jdbc:mysql://17217202:3306/xxl_jobuseUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --springdatasourceusername=root --springdatasourcepassword=root" --net my_docker_net --ip 17217209 -p 8089:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:231

3这样容器就有固定的IP了,会形成如下状态:

容器外面可以使用映射出的端口访问,但是不能通过指定的IP访问

容器内部容器之间可以使用指定的端口访问,但无法通过容器的主机IP+映射的端口访问

这样似乎还是不方便:一个应用在容器外本来可以访问,可是丢到容器内,因为服务地址配置问题会导致不能访问,切换配置也非常麻烦,如果解决

一个好的办法是为容器配置一个环境变量,这样容器中的应用会自动读取环境变量

4通常容器如RIDIS,默认一般没有ifconfig和 ping命令,导致无法查看本机IP地址和PING通对方IP地址,使用如下命令安装:

apt-get update 先升级apt-get,

然后安装

apt install iputils-ping

apt install net-tools

ifconfig 或者 ip addr查看的虚拟ip

如上红字所描述:同一个宿主机上的不同容器之间的网络如何互通的???

我们安装完docker之后,docker daemon会为我们自动创建3个网络,如下:

其实docker有4种网络通信模型,分别是:bridge、host、none、container

默认的使用的网络模型是bridge,也是我们生产上会使用到的网络模型。

下文中跟大家分享docker容器互通原理到时候呢,用到的也是bridge网络模型

另外,当我们安装完docker之后,docker会为我们创建一个叫docker0的网络设备

通过ifconfig命令可以查看到它,看起来它貌似和eth0网络地位相当,像是一张网卡。然而并不是,docker0其实是一个Linux网桥

何以见得?可以通过下面的命令查看 *** 作系统上的网桥信息

那大家怎么理解Linux网桥的概念呢?

其实大家可以把docker0理解成一台虚拟的交换机!然后像下面这样类比着理解,就会豁然开朗

1、它好比是大学在机房上课时,老师旁边的那个大大的交换机设备。

2、把机房里的电脑都连接在交换机上,类比成docker 容器作为一台设备都连接着宿主机上的docker0。

3、把交换机和机房中的机器的ip在同一个网段,类比成docker0、和你启动的docker容器的ip也同属于172网段。

类比成这样:

我们刚才做类比理解docker0的时候说:把机房里的电脑都连接在交换机上,类比成docker 容器作为一台设备都连接着宿主机上的docker0。那具体的实现落地实现用的是啥技术呢?

答案是:veth pair

veth pair的全称是:virtual ethernet,就是虚拟的以太网卡。

说到以太网卡大家都不陌生呀,不就是我们常见的那种叫eth0或者是ens的网络设备吗?

那这个veth pair是怎么玩的呢?有啥用呢?大家可以看下面这张图

veth-pair设备总是会成对的出现,用于连接两个不同network-namespace

就上图来说,从network-namespace1的veth0中发送的数据会出现在 network-namespace2的veth1设备中。

虽然这种特性很好,但是如果出现有多个容器,你就会发现组织架构会越来越复杂,越来越乱

不过好在我们已经循序渐进的了解Linux网桥(docker0),以及这里的veth-pair设备,于是我们可以把整体的架构图重新绘制成下面这样

因为不同容器有自己隔离后的network-namespace所以他们都有自己的网络协议栈

那我们能不能找到容器里面的网卡和物理机上的哪张卡是一对网络vethpair设备呢?

如下:

回到宿主机

意思是就是说,容器545ed62d3abf的eth0网卡和宿主机通过ip addr命令查看的网络设备标号55的设备组成一对vethpair设备,彼此流量互通!

先看个简单的,同一个局域网中的不同主机A、B之间是如何互联交换数据的。如下图

那,既然是同一个局域网中,说明A、B的ip地址在同一个网段,如上图就假设它们都在19216810网段。

还得再看下面这张OSI 7层网络模型图。

主机A向主机B发送数据,对主机A来说数据会从最上层的应用层一路往下层传递。比如应用层使用的>

以上就是关于dockerlocalhost能访问,主机ip访问不了全部的内容,包括:dockerlocalhost能访问,主机ip访问不了、docker如何把自己的ip作为tomcat的访问地址、Docker容器间网络互联原理,讲不明白算我输等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9489428.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存