如何解决容器的时区问题?
方案一:让容器与宿主机的时间以及时区保持一致,即将宿主机的时间时区配置文件挂载到容器上对应配置上。这样无论宿主机下有多少个容器也能保证时间时区一样。
docker run -v /etc/localtime:/etc/localtime /etc/timezone:/etc/timezone `你的容器名称或容器ID`
注意:有一些宿主机会出现没有timezone这个配置文件,可以通过命令
echo "Asia/Shanghai" > /etc/timezone
来创建它。
方案二:在创建容器时设置时区的环境变量。
docker run -e TZ="Asia/Shanghai" `你的容器名称或容器ID`
微服务架构下,如何保证不同宿主机的容器能够相互通信?
网络模式 | 配置 | 描述 | 特性 |
birdge |
| docker服务启动时,会创建一个docker0的虚拟网桥。以该模式运行的容器都会连接到这个虚拟网桥上,这里虚拟网桥相当于物料交换机的作用,容器通过交换机连在一个二层网络中。从docker0子网分配一个ip给到容器,并设置自己的ip为默认网关。在宿主机创建一对虚拟网卡veth pair设备,将设备的一端放在容器内,作为容器的网卡eth0。另一端则放在主机中并加入到在docker0的网桥中。 | 为容器自动分配一个172.x.x.x开头的私有内网IP,只能被宿主机及本机docker内所访问呢,而无法跨宿主机访问。如果是微服务架构下,注册到nacos还会以172开头的地址。 |
host |
| 该模式下的容器不会获得一个独立的Network Namespace,而是同宿主机公用一个Network Namespace。不会虚拟出自己的网卡以及配置IP,而是使用宿主机的IP和端口。但容器其他方面如文件系统、进程列表还是和宿主机隔离。 | 直接使用宿主机IP与外网通信,网络性能比较好。 |
container |
| 该模式下新创建的容器将与指定的容器共享一个Network Namespace,不会获取一个独立的Network Namespace, 更不是宿主机共享。除了网络方面外,其他方面还是隔离。 | - |
none |
| 该模式下创建的容器会获得一个独立的Network Namespace,但没有任何网络配置。只有io回环网络,没有网卡、IP、路由信息。 | 无法联网。 |
方案一:将各容器应用端口分别与对应宿主机进行端口映射,但需要 格外配置 spring.cloud.nacos.discovery.ip = 宿主机的IP
从而保证服务注册到nacos使用的是宿主机IP。
方案二:可以将容器的网络模式配置为host模式,即不再为容器分配私有IP,而是让容器共用宿主机IP。