9月5
假设我有一个包含一些静态数据的Docker容器。
通过docker-compose配置文件volumes参数
docker-compose.yml文件:
配置文件示例:
volumes:
- /var/run/:/host/var/run/
- /channel-artifacts:/var/hyperledger/configs
- /data/logs:/tmp/logs/
把容器中/tmp/logs目录映射到宿主机根据目录下的/data/logs目录下。这两个目录会共享数据。
当使用命名卷并检查它时,它的工作方式与预期类似。
通过docker-compose配置文件volumes参数
docker-compose.yml文件:
配置文件示例:
volumes:
- /var/run/:/host/var/run/
- /channel-artifacts:/var/hyperledger/configs
- /data/logs:/tmp/logs/
把容器中/tmp/logs目录映射到宿主机根据目录下的/data/logs目录下。这两个目录会共享数据。
当使用命名卷并检查它时,它的工作方式与预期类似。
9月5
一. 问题描述
在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?
二. 原因分析
在进行docker部署的时候我们采用的是bridge网桥的模式。
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。
三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld
2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题
四. 小结
docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
在docker部署nacos的时候遇到了这个样子的问题No route to host 导致了nacos容器无法连接宿主机的docker数据库。
然后我就进入到了nacos容器里面,ping了宿主机的地址,结果是通着的,然后使用telnet测试了3306端口,结果也会报出这个异常。
原因是什么呢?明明数据库外部可以正常连接访问,但是宿主机内部容器确实无法访问?
二. 原因分析
在进行docker部署的时候我们采用的是bridge网桥的模式。
启动docker时,docker进程会创建一个名为docker0的虚拟网桥,用于宿主机与容器之间的通信。当启动一个docker容器时,docker容器将会附加到虚拟网桥上,容器内的报文通过docker0向外转发。
如果docker容器访问宿主机,那么docker0网桥将报文直接转发到本机,报文的源地址是docker0网段的地址。而如果docker容器访问宿主机以外的机器,docker的SNAT网桥会将报文的源地址转换为宿主机的地址,通过宿主机的网卡向外发送。
因此,当docker容器访问宿主机时,如果宿主机服务端口会被防火墙拦截,从而无法连通宿主机,出现No route to host的错误。
而访问宿主机所在局域网内的其他机器,由于报文的源地址是宿主机ip,因此,不会被目的机器防火墙拦截,所以可以访问。
三. 解决方案
1> 关闭宿主机的防火墙
systemctl stop firewalld
2> 在防火墙上开发指定的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --reload
注:在进行完防火墙的操作之后最好是要进行以下docker的重启,systemctl restart docker,否则容器到因为虚拟网桥失效而导致的iptables failed问题
四. 小结
docker的容器网络连接一直是一个问题,容器与容器之间,容器与宿主机之间,容器跨主机访问,所以在涉及到容器的网络连接的时候要注意网络的问题。
9月5
Nacos微服务注册中心无法调用Docker容器中的服务
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: '3'
services:
iap-system:
build:
context: ./
dockerfile: Dockerfile-system
restart: always
ports:
- 19002:19002
container_name: iap-system
hostname: iap-system
image: iap-system
network_mode: "host" # 与宿主机共有一个IP
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请赞赏鼓励!
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: '3'
services:
iap-system:
build:
context: ./
dockerfile: Dockerfile-system
restart: always
ports:
- 19002:19002
container_name: iap-system
hostname: iap-system
image: iap-system
network_mode: "host" # 与宿主机共有一个IP
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请赞赏鼓励!
9月5
ocker 中的服务注册到nacos时默认是docker容器内网的IP地址,使用--network=host 是宿主机所在的局域网的ip 我想把公网ip注册到nacos上
可以使用以下两种方式:
1、如果docker网络采用的是主机模式即--network=host,那么这时候注册就是宿主机的ip。
2、nacos服务发现时添加ip即可。spring:
cloud:
nacos:
discovery:
ip: ${HOST:10.128.1.122}
可以使用以下两种方式:
1、如果docker网络采用的是主机模式即--network=host,那么这时候注册就是宿主机的ip。
2、nacos服务发现时添加ip即可。spring:
cloud:
nacos:
discovery:
ip: ${HOST:10.128.1.122}




