GNU/Linux >> Znalost Linux >  >> Linux

Docker kontejnery se nemohou připojit k internetu ve Fedoře 32?

Přestože OP našel řešení jeho problému a uzavřel tento problém, nenašel kořenový problém. Skutečnost, že výchozí přemostění sítě Docker bridge je připojen k internetu a airflowsetup_default nenaznačuje, že je něco v nepořádku s nastavením sítě Docker.

Udělal jsem nějaký průzkum a ukázalo se, že Fedora 32 se rozhodla, že je jí vlastně jedno, jestli na ní Docker pracuje nebo ne.

Není ani možné nainstalovat Docker způsobem popsaným v dokumentaci a pokud nainstalujete balíček poskytovaný Fedorou, stále nefunguje správně - více informací o tomto problému naleznete zde, zde a zde.

Hlavním problémem je, že uvnitř kontejnerů není žádné internetové připojení, pokud jsou připojeny k jakékoli vlastní přemostěné síti – ať už byla vytvořena pomocí docker network create nebo pomocí docker-compose.

Důvod je jednoduchý – Docker předpokládá, že firewall používaný OS je iptables, ale Fedora 32 standardně používá firewalld. To znamená, že Docker nemůže nakonfigurovat bránu firewall ručně – musí se nakonfigurovat ručně.

Pro referenční účely nejprve popíšu, jak nastavit Docker na čisté instalaci Fedory 32.

Nejprve spusťte následující příkazy:

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER

To nakonfiguruje cgroups tak, aby byly kompatibilní s démonem Docker a umožnily vašemu uživateli používat rozhraní Docker CLI bez sudo.

Poté restartujte systém, abyste použili změny, a spusťte:

sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker

nainstalovat a povolit Docker.

Nyní přejděte do adresáře, který obsahuje váš docker-compose.yml a spusťte docker-compose up -d . Yuo by měl vidět docker-compose vytvoření sítě pro vás a následné vytvoření kontejneru. Pokud váš kontejner vyžaduje připojení k internetu při spuštění (jako OP), nebude možné jej spustit.

Nyní spusťte sudo iptables-save | grep DOCKER a měli byste vidět něco jako:

:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o br-b56fa303f315 -j DOCKER
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-b56fa303f315 ! -o br-b56fa303f315 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b56fa303f315 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-b56fa303f315 -j RETURN

docker0 je výchozí přemostěná síť Dockeru, zatímco br-b56fa303f315 je nová síť vytvořená docker-compose (vaše se může jmenovat jinak). Pokud váš operační systém používal iptables vše by fungovalo podle očekávání, ale nefunguje, takže musíme zkontrolovat konfiguraci docker0 v firewalld .

Spusťte firewall-cmd --get-active-zones a dostanete něco podobného jako:

docker
  interfaces: docker0
public
  interfaces: eth0 eth1

Můžete vidět, že bridge síť je v docker zóny, ale nová síť není. Ve skutečnosti není uveden vůbec, což znamená, že je ve výchozí zóně. Můžete zkontrolovat, co to je, spuštěním firewall-cmd --get-default-zone . V čisté instalaci Fedory 32 je to public .

Takže spusťte (nezapomeňte nahradit br-b56fa303f315 s názvem vašeho rozhraní):

sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315

spustit docker-compose up -d pokud se vaše služba dříve nespustila a voila – váš kontejner má síťové připojení.

Bohužel, pokud restartujete svůj systém, ztratí toto připojení znovu.

Můžete tomu zabránit pomocí:

sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload

Pokud však vytvoříte nějaké nové sítě nebo znovu vytvoříte stávající (například spuštěním docker-compose down a poté docker-compose up -d znovu), budete muset proces opakovat.

Jaké je tedy řešení tohoto problému?

Nejprve si zapište všechna síťová rozhraní, která jsou aktuálně připojena k výchozí zóně – v tomto příkladu eth0 a eth1 .

Poté spusťte následující (nahraďte public s názvem vaší výchozí zóny)

sudo firewall-cmd --set-default-zone=docker
sudo firewall-cmd --permanent --zone=public --add-interface=eth0
sudo firewall-cmd --permanent --zone=public --add-interface=eth1
sudo firewall-cmd --reload

Nyní by tam měla být znovu rozhraní, která byla dříve ve vaší výchozí zóně, ale všechna nová rozhraní (a tedy všechny nové sítě Docker) budou automaticky přidány do docker zónu, která jim poskytne plnou síťovou konektivitu.


Linux
  1. Jak používat Docker Compose

  2. Jak připojit kontejnery Docker

  3. Jak vypsat Docker kontejnery

  1. Docker v Dockeru nemůže připojit svazek

  2. Příkaz Docker se nemůže připojit k démonu Docker

  3. Jak odstranit všechny kontejnery Docker

  1. Úvod do Docker Containers

  2. Proč všichni používají Docker?

  3. Docker:Jsou odkazy Docker zastaralé?