[英]Docker Swarm Access Container to Container on Published Port?
我見過至少 10 個這樣的問題,但找不到答案。
我正在從 Rancher 遷移到 Docker Swarm。
我使用 docker-compose 來部署堆棧。
我正在使用 linux 主機。
➜ swarm git:(master) ✗ docker --version
Docker version 20.10.9, build c2ea9bc
➜ swarm git:(master) ✗ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
我遇到的問題是我有一個容器(服務) smtp
偵聽端口2525
。 在來自其他服務的 swarm 中,我需要將此服務引用為smtp:25
而不是2525
。 當然,我只是做了一個端口映射。 但是其他服務只能在2525
上訪問端口25
上的服務。
請注意,為了進行測試,我嘗試將映射設為2526->2525
以排除任何權限問題。
我的 docker-compose 條目如下所示:
smtp:
image: <my repository>
user: node
environment:
- NODE_ENV=production
privileged: true
ports:
- published: 2526
target: 2525
protocol: tcp
mode: ingress # I don't need this on the host, just on the swarm vip.
deploy:
replicas: 2
placement:
constraints:
- node.labels.scheme == task
restart_policy:
condition: on-failure
delay: 5s # how long to wait between retarts
window: 20s # How long to determine if startup has succeeded
healthcheck:
test: netstat -l | grep 2525
interval: 10s
timeout: 10s
retries: 10
start_period: 20s
從一個 busybox 容器,我可以成功telnet smtp 2525
但telnet smtp 2526
讓我connection refused
。 另外,我也無法從 smtp 容器內部 telnet 到 smtp:2526。
Docker 對服務的檢查顯示
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 2525,
"PublishedPort": 2526,
"PublishMode": "ingress"
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 2525,
"PublishedPort": 2526,
"PublishMode": "ingress"
}
],
"VirtualIPs": [
{
"NetworkID": "wv8fe0yih5ql9ye09chcl6y1b",
"Addr": "10.0.0.41/24"
},
{
"NetworkID": "5a9tjqidsvphi9lphldit62tm",
"Addr": "10.0.2.145/24"
}
]
}
Netstat 揭示
~/app $ netstat -tulpn | grep LISTEN
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:2525 0.0.0.0:* LISTEN 13/node
tcp 0 0 127.0.0.11:42381 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN -
有任何想法嗎? 我不允許這樣做嗎?
首先,在 docker swarm 上,您使用docker stack deploy
而不是docker compose
來部署服務。
Docker swarm 管理與覆蓋網絡的服務連接:當您部署堆棧 ( docker stack deploy
) 時,會隱式創建覆蓋網絡並將服務附加到它。 連接到覆蓋網絡的所有服務都可以使用 docker 的網狀網絡 dns 發現相互發現。
因此,實際上,您可以使用經過修改的堆棧文件來部署您的 smtp 服務,使其看起來更像這樣:
version: "3.9"
networks:
public:
attachable: true
driver: overlay
name: smtp
services:
smtp:
image: ...
command: .... --listen :25
networks:
- public
ports:
- 2525:25
healthcheck:
test: netstat -l | grep 25
...
進一步的警告:當服務使用 dockers 網橋或覆蓋網絡相互連接時,沒有端口重新映射。 “ports”指令僅適用於入口,即從 swarm 外部到達 docker 節點的需要路由到服務的數據包。 因此,要使服務到服務的流量通過 :25 進行通信,則需要將 smtp 容器配置為偵聽 :25。
完成后,您可以通過指定目標網絡從容器和服務連接到 smtp:
因此,我假設可以將 smtp 服務配置為偵聽 :25 我將該服務顯式附加到撰寫文件中名為“public”的網絡。 這個網絡是用全局名稱“smtp”創建的,它被標記為可附加,因此可以將臨時容器附加到它。 它明確聲明為“覆蓋”,因為 docker compose 將部署此 compose 並嘗試將其創建為bridge
網絡。
然后,為了驗證這是否有效,可以使用 netshoot 容器。 只需將它附加到現在可用的網絡並驗證 dns 解析該網絡上的“smtp”名稱,並且端口 25 是可訪問的。
docker run --network smtp --rm -it nicolaka/netshoot
$ telnet smtp 25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.