簡體   English   中英

docker-compose 網絡創建讓我無法使用 ssh

[英]docker-compose network creation kicks me out of ssh

由於docker-compose網絡,我需要幫助理解我的網絡日志。

我通過 ssh 進入了一個VM ,並且我有兩個使用 docker-compose 的項目。 第一個簡單地使用docker-compose up 當我嘗試啟動第二個時,我的 ssh 會話凍結了,我無法再通過 ssh 進入虛擬機。 經過大量試驗和錯誤,並在閱讀本文后,我嘗試將以下內容附加到我的第二個項目的docker-compose.yml文件中:

networks:
  default:
    external:
      name: abcdef_default

其中abcdef_default是第一個項目的abcdef_default docker-compose up創建的網絡名稱。 有了這個,第二個項目的docker-compose up不會把我踢出 ssh 會話。

我尾日志中/var/log/*.log ,並在這里在網絡部分的輸出docker-compose.yml文件(沒有時間戳前綴: Jan 19 09:13:42 hostname kernel: [420096.305357]

aufs au_opts_verify:1597:dockerd[13813]: dirperm1 breaks the protection by the permission bits on the lower branch
device veth6a84537 entered promiscuous mode
IPv6: ADDRCONF(NETDEV_UP): veth6a84537: link is not ready
eth0: renamed from veth2480623
IPv6: ADDRCONF(NETDEV_CHANGE): veth6a84537: link becomes ready
br-fe0deb0149df: port 18(veth6a84537) entered forwarding state
br-fe0deb0149df: port 18(veth6a84537) entered forwarding state
aufs au_opts_verify:1597:dockerd[25317]: dirperm1 breaks the protection by the permission bits on the lower branch
device veth1a3c1e3 entered promiscuous mode
IPv6: ADDRCONF(NETDEV_UP): veth1a3c1e3: link is not ready
br-fe0deb0149df: port 22(veth1a3c1e3) entered forwarding state
br-fe0deb0149df: port 22(veth1a3c1e3) entered forwarding state
eth0: renamed from veth54e576d
IPv6: ADDRCONF(NETDEV_CHANGE): veth1a3c1e3: link becomes ready
br-fe0deb0149df: port 22(veth1a3c1e3) entered disabled state
veth54e576d: renamed from eth0
br-fe0deb0149df: port 22(veth1a3c1e3) entered disabled state
device veth1a3c1e3 left promiscuous mode
br-fe0deb0149df: port 22(veth1a3c1e3) entered disabled state
br-fe0deb0149df: port 18(veth6a84537) entered forwarding state

這是沒有networks部分的輸出(即當我被踢出 ssh 會話時):

IPv6: ADDRCONF(NETDEV_UP): br-55349b03453a: link is not ready
aufs au_opts_verify:1597:dockerd[26982]: dirperm1 breaks the protection by the permission bits on the lower branch
aufs au_opts_verify:1597:dockerd[26982]: dirperm1 breaks the protection by the permission bits on the lower branch
aufs au_opts_verify:1597:dockerd[3051]: dirperm1 breaks the protection by the permission bits on the lower branch
device veth7a1bcde entered promiscuous mode
IPv6: ADDRCONF(NETDEV_UP): veth7a1bcde: link is not ready
br-55349b03453a: port 1(veth7a1bcde) entered forwarding state
br-55349b03453a: port 1(veth7a1bcde) entered forwarding state
br-55349b03453a: port 1(veth7a1bcde) entered disabled state
eth0: renamed from veth5d8a2ea
IPv6: ADDRCONF(NETDEV_CHANGE): veth7a1bcde: link becomes ready
br-55349b03453a: port 1(veth7a1bcde) entered forwarding state
br-55349b03453a: port 1(veth7a1bcde) entered forwarding state
IPv6: ADDRCONF(NETDEV_CHANGE): br-55349b03453a: link becomes ready
aufs au_opts_verify:1597:dockerd[13814]: dirperm1 breaks the protection by the permission bits on the lower branch
aufs au_opts_verify:1597:dockerd[13814]: dirperm1 breaks the protection by the permission bits on the lower branch
aufs au_opts_verify:1597:dockerd[13922]: dirperm1 breaks the protection by the permission bits on the lower branch
device veth3253bd4 entered promiscuous mode
IPv6: ADDRCONF(NETDEV_UP): veth3253bd4: link is not ready
br-55349b03453a: port 2(veth3253bd4) entered forwarding state
br-55349b03453a: port 2(veth3253bd4) entered forwarding state
br-55349b03453a: port 2(veth3253bd4) entered disabled state
eth0: renamed from veth9c8aaa3
IPv6: ADDRCONF(NETDEV_CHANGE): veth3253bd4: link becomes ready
br-55349b03453a: port 2(veth3253bd4) entered forwarding state
br-55349b03453a: port 2(veth3253bd4) entered forwarding state
br-55349b03453a: port 2(veth3253bd4) entered disabled state
veth9c8aaa3: renamed from eth0
br-55349b03453a: port 2(veth3253bd4) entered disabled state
device veth3253bd4 left promiscuous mode
br-55349b03453a: port 2(veth3253bd4) entered disabled state
br-55349b03453a: port 1(veth7a1bcde) entered forwarding state
br-55349b03453a: port 1(veth7a1bcde) entered disabled state
veth5d8a2ea: renamed from eth0
br-55349b03453a: port 1(veth7a1bcde) entered disabled state
device veth7a1bcde left promiscuous mode
br-55349b03453a: port 1(veth7a1bcde) entered disabled state

我真的不明白如何閱讀這些日志。 也是我的ifconfig 有人可以幫我閱讀日志並找出問題所在嗎?

診斷

我們的團隊正在使用運行 Ubuntu 18.04 的 AWS EC2 實例作為開發服務器。 我們最近收到報告稱 docker-compose 破壞了 SSH 連接。 即使重新啟動后,開發服務器仍然無法訪問。 於是我開始調查。

我能夠通過僅使用 docker 進行復制來排除 docker-compose 的原因。

ubuntu@ip-172-31-115-116:~$ docker network create -d bridge my-bridge-network
aca5884d60f146cef81ac55c8cccd231a43f40927d645168642d9b28c5e009a6

ubuntu@ip-172-31-115-116:~$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
my-bridge-network

ubuntu@ip-172-31-115-116:~$ docker network create -d bridge my-bridge-network
f0a7a06a9627bc2de00eb60091a92010451690626d95e077f622f3058cc3a07c

ubuntu@ip-172-31-115-116:~$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
my-bridge-network

ubuntu@ip-172-31-115-116:~$ docker network create -d bridge my-bridge-network
Connection reset by 172.31.115.116 port 22

然后我想到了根本原因。

根本原因

  • 我們的 docker-compose 文件使用橋接網絡模式,默認情況下會創建一個新的橋接網絡。 當運行docker-compose downdocker network prune ,橋接網絡將被拆除。 並且下一次docker-compose rundocker network create將創建一個新的橋接網絡。
  • docker0 網橋適配器的默認 IP 范圍是172.17.0.0/16
  • 當我第一次運行docker network create -d bridge my-bridge-network命令時,它為172.18.0.0/16創建了一個新的網橋適配器。
  • 第二個網橋適配器是為172.19.0.0/16創建的。
  • 自然,第三個網橋適配器是為172.20.0.0/16創建的。 但是,這是我們的工程 VPN IP 范圍。 因此重疊導致服務器無法與我們的筆記本電腦通信。

解決方案

解決方案是確保新的 docker 網橋網絡將跳過我們的 VPN IP 范圍。

臨時解決方案

如果我們將跳過的 IP 范圍添加到系統路由表中,docker 會自動跳過它們。 因此,只要開發服務器重新啟動,我們就可以運行以下腳本。

sudo route add -net [our VPN IP range] netmask 255.255.0.0 gw [our gateway]

這個方案不完美,重啟機器后新路由會被丟棄。

主要解決方案

我們應該將路由更改永久應用於所有開發服務器。

echo "            routes:" | sudo tee -a /etc/netplan/50-cloud-init.yaml
echo "            - to: [our VPN IP range]" | sudo tee -a /etc/netplan/50-cloud-init.yaml
echo "              via: [our gateway]" | sudo tee -a /etc/netplan/50-cloud-init.yaml
sudo netplan apply

Docker IP 更改

我們還計划修改 docker default-address-pools 以重新定義 docker IP 范圍。 參考https://github.com/docker/compose/issues/4336#issuecomment-457326123 我會說修改/etc/docker/daemon.json更好。

BR-XXXXXXX是泊塢窗和VETH XXXXXXX橋接口的容器的虛擬接口,碼頭工人使用這些VETH接口,但不直接交互,他們使用IPv6地址,也沒有IPv4。 Docker無法創建NAT接口,它只能為容器創建IPv6橋接和veth。 您可以將網橋鏈接到主機的任何物理或虛擬接口。

所以它的工作方式如下:

為eth0(你的接口,或者如果你想V型接口)↔BR XXXXX(泊塢窗橋)↔VETH XXXXX(你的容器的V型接口)

這就是我所能說的,我不確定別人會回答,沒有很多Docker專家,所以我給你所有信息,我可以幫助你理解你的日志。

我有同樣的問題,我通過在docker compose上設置network_mode選項來解決它(請參閱此處的文檔。解決方案來自此線程 )。

services:
  my_service:
    image: ...
    network_mode: "host"

我終於最終運行了一個docker network ls 輸出是超過15個網絡的列表,這些網絡非常古老。 我運行了一個docker ps以確保與這些網絡無關的任何內容仍在運行。 一個容器確實仍在運行(redis),它位於名為bridge的網絡上。 我停下了容器。 然后我開始通過docker network rm <network name>瀏覽所有網絡,直到我留下了4個網絡:網橋,主機,無網絡,以及唯一仍在工作的網絡。 然后我可以像往常一樣再次使用docker-compose up啟動新的網絡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM