David I did post the relevant line item from the log. I don't think the full stack trace is really going to help but just in case it does I have a larger segment pasted below.
I haven't read the source code but it is pretty clear that that the server es01 attempted to establish a connection to es03 and failed. The logs contain a similar reports for all combinations of es01, es02, and es03. The connection attempt times out.
I suspect that somehow Elasticsearch is not getting the DNS names resolved correctly even though the command line does. I can't think of why that would be.
p3es_es01.1.t417ccm7zh6h@boron | {"type": "server", "timestamp": "2021-11-27T21:15:09,752Z", "level": "INFO", "component": "o.e.c.c.JoinHelper", "cluster.name": "es-docker-cluster", "node.name": "es01", "message": "failed to join {es03}{akrtWEgbR6eI89b-X7mzmw}{-BuBEtuXRTyUPxK7r4GvJA}{10.0.3.189}{10.0.3.189:9300}{dilm}{ml.machine_memory=33668845568, ml.max_open_jobs=20, xpack.installed=true} with JoinRequest{sourceNode={es01}{_r72fbKhTRGsStILTChHhQ}{VF-VL3LMTrK9_cqXx4g6mw}{10.0.0.35}{10.0.0.35:9300}{dilm}{ml.machine_memory=101314478080, xpack.installed=true, ml.max_open_jobs=20}, optionalJoin=Optional[Join{term=11, lastAcceptedTerm=2, lastAcceptedVersion=19, sourceNode={es01}{_r72fbKhTRGsStILTChHhQ}{VF-VL3LMTrK9_cqXx4g6mw}{10.0.0.35}{10.0.0.35:9300}{dilm}{ml.machine_memory=101314478080, xpack.installed=true, ml.max_open_jobs=20}, targetNode={es03}{akrtWEgbR6eI89b-X7mzmw}{-BuBEtuXRTyUPxK7r4GvJA}{10.0.3.189}{10.0.3.189:9300}{dilm}{ml.machine_memory=33668845568, ml.max_open_jobs=20, xpack.installed=true}}]}",
p3es_es01.1.t417ccm7zh6h@boron | "stacktrace": ["org.elasticsearch.transport.RemoteTransportException: [es03][10.0.3.189:9300][internal:cluster/coordination/join]",
p3es_es01.1.t417ccm7zh6h@boron | "Caused by: org.elasticsearch.transport.ConnectTransportException: [es01][10.0.0.35:9300] connect_exception",
p3es_es01.1.t417ccm7zh6h@boron | "at org.elasticsearch.transport.TcpTransport$ChannelsConnectedListener.onFailure(TcpTransport.java:989) ~[elasticsearch-7.5.2.jar:7.5.2]",
p3es_es01.1.t417ccm7zh6h@boron | "at org.elasticsearch.action.ActionListener.lambda$toBiConsumer$3(ActionListener.java:162) ~[elasticsearch-7.5.2.jar:7.5.2]",
p3es_es01.1.t417ccm7zh6h@boron | "at org.elasticsearch.common.concurrent.CompletableContext.lambda$addListener$0(CompletableContext.java:42) ~[elasticsearch-core-7.5.2.jar:7.5.2]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2159) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at org.elasticsearch.common.concurrent.CompletableContext.completeExceptionally(CompletableContext.java:57) ~[elasticsearch-core-7.5.2.jar:7.5.2]",
p3es_es01.1.t417ccm7zh6h@boron | "at org.elasticsearch.transport.netty4.Netty4TcpChannel.lambda$addListener$0(Netty4TcpChannel.java:68) ~[transport-netty4-client-7.5.2.jar:7.5.2]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:570) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:549) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:608) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:263) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:150) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518) [netty-transport-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) [netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.lang.Thread.run(Thread.java:830) [?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "Caused by: java.io.IOException: connection timed out: 10.0.0.35/10.0.0.35:9300",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:261) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:150) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518) [netty-transport-4.1.43.Final.jar:4.1.43.Final]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[?:?]",
p3es_es01.1.t417ccm7zh6h@boron | "at java.lang.Thread.run(Thread.java:830) ~[?:?]"] }