dockerfile expose对于端口映射以及微服务注册的影响
前提
Dockerfile:
expose:9096
docker run 无-p端口映射
在不设置expose时,服务注册到nacos后,依旧可以通过微服务请求方式调通,只是ip注册地址为docker内部ip地址,无法在容器外服务器 访问通过,curl直接拒绝连接
而在设置expose参数后,
curl能够访问通过,且nacos 服务注册地址为内网地址,而非容器内ip地址
疑问:为什么会造成这样情况?
在无expose配置与-p -P命令时,进入到容器内,查看Hosts配置,发现有如下配置
ifconfig查看容器内Ip后
docker inspect—查看docker 容器、镜像或网络的详细信息
docker 能够正常外部访问的shell 脚本
docker run --name datasec -d --restart=always -e NACOS_DISCOVERY_ADDR=192.168.8.53:8848 -e NACOS_CONFIG_ADDR=192.168.8.53:8848 192.168.8.188/navigator/navigator-datasec:bootstrap
该脚本创建镜像后,注册地址依旧为容器私有ip,但通过外网访问该容器所在服务器ip+port能够访问通过服务
docker run --name datasec -d --network=host --restart=always -e NACOS_DISCOVERY_ADDR=192.168.8.53:8848 -e NACOS_CONFIG_ADDR=192.168.8.53:8848 192.168.8.188/navigator/navigator-datasec:bootstrap
–network=host 含义是将容器加入到主机网络中
私有ip依旧存在,但是在docker inspect中不再展示,可进入容器内后通过ifconfig来查看
总结:
docker容器的ip地址是在Dokcer内部网络中分类的私有ip地址,并不会直接映射到宿主机的IP地址上。在默认情况下,docker会为每个容器创建Bridge的虚拟网络,并在该网络为容器分配一个Ip地址,默认是以172.17.0.X的形式分配
之所以在没有声明expose与-p也能实现注册的原因是 容器与nacos注册地址在一台服务器,通过私有ip也能进行访问