RDP Monster

Instalacja Dockera na VPS Ubuntu 24.04/22.04: oficjalna metoda

Instalacja Dockera na VPS Ubuntu 24.04/22.04: oficjalna metoda

Zanim zaczniesz: VPS KVM, wspierane Ubuntu i użytkownik z sudo

Docker Engine nie dostarcza własnego jądra. Każdy kontener współdzieli jądro hosta i opiera się na przestrzeniach nazw Linuksa, cgroups oraz netfilter, więc demon potrzebuje VPS-a, na którym to Ty jesteś właścicielem jądra. Daje to VPS KVM (pełna wirtualizacja). W planach opartych na kontenerach, budowanych na OpenVZ lub LXC, jądro należy do dostawcy i Docker albo odmawia uruchomienia, albo działa tylko wtedy, gdy host włączył zagnieżdżanie. Sprawdź to, zanim cokolwiek zainstalujesz:

systemd-detect-virt                          # expect: kvm
. /etc/os-release && echo "$VERSION_CODENAME"   # noble (24.04) or jammy (22.04)
uname -m                                     # x86_64 or aarch64

Docker publikuje pakiety dla 64-bitowego Ubuntu 24.04 LTS (noble) i 22.04 LTS (jammy), na x86_64 oraz arm64. Potrzebujesz też użytkownika z uprawnieniami sudo; poniższe sekcje o grupie docker i trybie rootless zakładają zwykłe konto, a nie roota.

Instalacja Docker Engine z oficjalnego repozytorium apt

Istnieją cztery popularne sposoby instalacji Dockera na Ubuntu i tylko jeden jest metodą, którą Docker dokumentuje i wspiera na serwerach:

MetodaPakietOcena
Repozytorium apt Dockeradocker-ce z download.docker.comZalecane: aktualne wydania, aktualizacje przez apt upgrade, wtyczki Compose i Buildx w komplecie.
Ubuntu universedocker.ioDziała, ale kompilacja Ubuntu jest opóźniona względem upstream i nie zawiera wtyczek.
Snapsnap install dockerInstalacja w izolacji, z własnymi ścieżkami; częste źródło niespodzianek typu „permission denied”. Unikaj na serwerach.
Skrypt ułatwiającyget.docker.comTe same pakiety, ale przekazane bez przeglądu do powłoki roota. Tylko maszyny jednorazowe.

Krok 1: usuń kolidujące pakiety

Jeśli obraz VPS-a zawiera już pakiet docker.io z Ubuntu, stare docker-compose lub podman-docker, usuń je, aby dwie kompilacje nie walczyły o /usr/bin/docker. Ta pętla pochodzi z dokumentacji Dockera i jest nieszkodliwa na czystym systemie; nie narusza /var/lib/docker:

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
  sudo apt-get remove $pkg
done

Krok 2: dodaj klucz GPG i źródło apt Dockera

Klucz trafia do /etc/apt/keyrings/ i jest wskazywany przez signed-by=, co ogranicza jego zaufanie do tego jednego repozytorium zamiast globalnie, jak w przestarzałym apt-key. Nazwa kodowa jest odczytywana z /etc/os-release, więc ten sam blok działa na 24.04 i 22.04:

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

Błąd podpisu przy ostatnim apt-get update prawie zawsze oznacza, że plik klucza jest nieczytelny; wykonaj ponownie polecenie chmod.

Krok 3: zainstaluj silnik i jego wtyczki

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker-ce to demon, docker-ce-cli to klient, containerd.io to leżące niżej środowisko uruchomieniowe, a dwie wtyczki udostępniają docker buildx i docker compose. Na Ubuntu skrypt poinstalacyjny pakietu od razu uruchamia docker.service i włącza go przy starcie systemu.

Krok 4: sprawdź instalację poleceniem hello-world

sudo docker run hello-world
docker --version
sudo docker info | head -n 20

hello-world to rozstrzygający test: klient komunikuje się z demonem, demon pobiera niewielki obraz z Docker Hub, tworzy kontener, uruchamia go i przesyła jego wyjście z powrotem. Jeśli widzisz „Hello from Docker!”, każda warstwa działa. Na sprawnej instalacji 24.04 lub 22.04 docker info raportuje Storage Driver: overlay2 oraz Cgroup Version: 2.

Uruchamianie Dockera bez sudo: grupa docker

Demon nasłuchuje na gnieździe uniksowym /var/run/docker.sock, należącym do root:docker, więc członkowie grupy docker mogą korzystać z CLI bez sudo:

sudo groupadd docker          # usually exists already; harmless if it does
sudo usermod -aG docker $USER
newgrp docker                 # or log out and back in
docker run hello-world

Zrozum, co właśnie przyznałeś. Każdy, kto ma dostęp do tego gniazda, może uruchomić docker run -v /:/host --privileged ... i odczytać lub nadpisać dowolny plik na VPS-ie, co sprawia, że członkostwo w grupie docker jest równoważne uprawnieniom roota, bez pytania o hasło i bez wpisu w logach sudo. Traktuj to dokładnie jak dostęp do sudo; nasz przewodnik o przełączaniu użytkowników i podnoszeniu uprawnień w Ubuntu wyjaśnia, dlaczego to rozróżnienie ma znaczenie na maszynie wielu użytkowników.

Wtyczka Docker Compose

Pakiet docker-compose-plugin udostępnia Compose v2 jako podpolecenie docker compose (ze spacją). Stary pythonowy plik binarny docker-compose nie jest już wspierany i nie powinien być instalowany obok. Sprawdź wersję, a następnie przetestuj minimalny plik compose.yaml:

docker compose version

mkdir -p ~/web && cd ~/web
cat > compose.yaml <<'EOF'
services:
  web:
    image: nginx:alpine
    ports:
      - "127.0.0.1:8080:80"
    restart: unless-stopped
EOF

docker compose up -d
docker compose ps
curl -I http://127.0.0.1:8080
docker compose down

Dwa szczegóły są zamierzone: restart: unless-stopped przywraca kontener po ponownym uruchomieniu, a port jest przypisany do 127.0.0.1, a nie do wszystkich interfejsów, z powodów wyjaśnionych w sekcji o zaporze.

Tryb rootless: demon, który nie jest rootem

Tryb rootless uruchamia demona i kontenery wewnątrz przestrzeni nazw użytkownika, więc ucieczka z kontenera prowadzi do konta bez uprawnień, a nie do roota. To właściwy wybór, gdy z VPS-a korzysta kilka osób. Wymagania to podrzędne zakresy UID/GID (Ubuntu tworzy je dla zwykłych użytkowników w /etc/subuid i /etc/subgid), narzędzia uidmap, sesja D-Bus użytkownika oraz dodatki rootless od Dockera:

sudo apt-get install -y uidmap dbus-user-session docker-ce-rootless-extras
grep "^$USER:" /etc/subuid /etc/subgid   # each should show a range of 65536 IDs

# optional: stop the system-wide daemon if you only want rootless
sudo systemctl disable --now docker.service docker.socket

dockerd-rootless-setuptool.sh install

Narzędzie konfiguracyjne tworzy jednostkę systemd dla użytkownika i wypisuje dwie zmienne potrzebne Twojej powłoce. Dodaj je do ~/.bashrc, a następnie spraw, by demon użytkownika startował przy uruchomieniu systemu bez logowania:

export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock

systemctl --user enable docker
sudo loginctl enable-linger $(whoami)

Tryb rootless ma realne ograniczenia: portów poniżej 1024 nie można publikować, chyba że wykonasz sudo setcap cap_net_bind_service=ep $(which rootlesskit) i zrestartujesz demona użytkownika, sieci overlay są niedostępne, a dane znajdują się w ~/.local/share/docker. Na Ubuntu 24.04 AppArmor ogranicza nieuprzywilejowane przestrzenie nazw użytkownika; pakiety deb dostarczają profil wymagany przez rootlesskit, ale instalacja z pliku statycznego wymaga dodania go ręcznie, zgodnie z dokumentacją trybu rootless.

Zachowanie przy starcie, magazyn danych i rotacja logów

O tym, czy kontenery działają po ponownym uruchomieniu, decydują dwie odrębne rzeczy: demon musi być włączony, a każdy kontener musi mieć politykę restartu. Pakiety Ubuntu włączają usługę za Ciebie; potwierdź to, a jeśli stany jednostek wyglądają nieznajomo, nasz przewodnik o wyświetlaniu usług za pomocą systemctl omawia każdą kolumnę:

systemctl is-enabled docker.service containerd.service
sudo systemctl enable docker.service containerd.service   # only if the line above said disabled

Kontenery uruchomione bez --restart pozostają wyłączone po restarcie; dla wszystkiego, co ma działać na stałe, użyj --restart unless-stopped w wierszu poleceń lub restart: unless-stopped w Compose.

Wszystko, co Docker przechowuje (warstwy obrazów, systemy plików kontenerów, wolumeny, logi), znajduje się w /var/lib/docker, a na małym VPS-ie to właśnie ten katalog zapełnia dysk. Obserwuj go poleceniem docker system df, odzyskuj miejsce po osieroconych warstwach przez docker system prune i przeczytaj komunikat, zanim dodasz -a, które usuwa także każdy obraz nieużywany przez działający kontener. Jeśli VPS ma drugi dysk, wskaż na niego data-root w /etc/docker/daemon.json, zanim pobierzesz coś dużego.

Logi zasługują na osobne ostrzeżenie. Domyślny sterownik json-file zapisuje każdy wiersz standardowego wyjścia kontenera do /var/lib/docker/containers/<id>/<id>-json.log i nie wykonuje rotacji, dopóki jej nie skonfigurujesz. Gadatliwy kontener potrafi pochłonąć cały dysk w tydzień. Ustaw limity na poziomie demona od pierwszego dnia:

sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" },
  "live-restore": true
}
EOF
sudo systemctl restart docker

Opcje logowania dotyczą kontenerów utworzonych po restarcie, więc raz odtwórz te długo działające. live-restore pozwala zrestartować demona na potrzeby aktualizacji bez zabijania działających kontenerów.

Docker i ufw: publikowane porty omijają Twoją zaporę

To część, która zaskakuje większość osób na publicznym VPS-ie. Docker zarządza własnymi regułami iptables: gdy publikujesz port przez -p 8080:80, demon wstawia regułę DNAT w łańcuchu PREROUTING tabeli nat oraz regułę akceptującą w FORWARD. Reguły ufw znajdują się w INPUT, przez który ruch przekazywany nigdy nie przechodzi. Dlatego ufw deny 8080 nie działa, a kontener bazy danych opublikowany na 0.0.0.0:5432 jest osiągalny z całego internetu, podczas gdy ufw raportuje port jako zablokowany. Szukaj 0.0.0.0: w kolumnie PORTS polecenia docker ps lub uruchom ss -tlnp; nasz przewodnik o sprawdzaniu otwartych portów w Linuksie pokazuje, jak czytać to wyjście i potwierdzić ekspozycję z zewnątrz.

Dwa czyste rozwiązania, w kolejności preferencji:

  1. Przypisz publikowane porty do pętli zwrotnej. -p 127.0.0.1:8080:80 sprawia, że usługa jest osiągalna tylko z samego VPS-a, zwykle za odwrotnym proxy takim jak nginx czy Caddy, które udostępniasz świadomie. Kontenery rozmawiające wyłącznie ze sobą w ogóle nie potrzebują -p.
  2. Filtruj w łańcuchu DOCKER-USER. Docker przetwarza ten łańcuch przed własnymi regułami FORWARD i nigdy go nie nadpisuje. Ponieważ DNAT już nastąpił, zanim pakiet do niego dotrze, dopasuj oryginalny port przy użyciu conntrack:
sudo iptables -I DOCKER-USER -i eth0 ! -s 203.0.113.10 -p tcp \
  -m conntrack --ctorigdstport 8080 --ctdir ORIGINAL -j DROP

Zastąp eth0 swoim publicznym interfejsem, a 203.0.113.10 adresem, któremu zezwalasz na dostęp. Te reguły nie są trwałe; zapisz je przy użyciu pakietu iptables-persistent. Ustawienie "iptables": false w daemon.json psuje sieć kontenerów w sposób trudny do zdiagnozowania; nie ruszaj tego.

Całkowite odinstalowanie Dockera

Najpierw usuń pakiety wraz z konfiguracją, potem skasuj katalogi z danymi, które apt celowo pozostawia:

sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker /var/lib/containerd
sudo rm -f /etc/apt/sources.list.d/docker.list /etc/apt/keyrings/docker.asc
sudo apt-get autoremove -y

W przypadku instalacji rootless uruchom najpierw jako użytkownik dockerd-rootless-setuptool.sh uninstall, a następnie usuń ~/.local/share/docker.

Wszystko to zakłada serwer, na którym masz roota, kontrolujesz jądro i możesz przepisywać iptables bez niczyjej zgody. Jeśli takiej maszyny właśnie potrzebujesz, VPS Linux KVM z pełnym dostępem root od rdp.monster dostarcza Ubuntu 24.04 lub 22.04 z dedykowanym CPU i RAM, nielimitowanym transferem (fair-use), bez KYC, z płatnością kryptowalutami, od $8.99 miesięcznie, i jest dostarczany około 10 sekund po potwierdzeniu płatności, więc możesz wykonać powyższy test hello-world na własnym serwerze zaraz po zakupie.

Najczęściej zadawane pytania

Którą wersję Dockera instaluje apt na Ubuntu i jak ją aktualizować?

Repozytorium instaluje najnowszą stabilną wersję Docker Engine, a apt upgrade utrzymuje ją aktualną.
Po skonfigurowaniu repozytorium apt Dockera polecenie apt-get install docker-ce pobiera najnowsze stabilne wydanie dostępne dla Twojej nazwy kodowej Ubuntu, a każde późniejsze sudo apt-get update && sudo apt-get upgrade przenosi Cię naprzód. Uruchom docker version, aby zobaczyć wersję klienta i serwera. Aby przypiąć konkretne wydanie, wypisz kandydatów poleceniem apt-cache madison docker-ce i zainstaluj docker-ce=<version> razem z pasującym docker-ce-cli, a następnie wykonaj apt-mark hold na obu pakietach.

Dlaczego pojawia się błąd „permission denied while trying to connect to the Docker daemon socket”?

Twój użytkownik nie może odczytać /var/run/docker.sock; dołącz do grupy docker lub użyj sudo.
Gniazdo demona należy do root:docker, więc zwykły użytkownik otrzymuje permission denied. Albo poprzedzaj polecenia przez sudo, albo dodaj się poleceniem sudo usermod -aG docker $USER i rozpocznij nową sesję logowania (lub uruchom newgrp docker), ponieważ zmiany grup dotyczą wyłącznie nowych sesji. Jeśli błąd nadal występuje, sprawdź groups, aby potwierdzić członkostwo, zweryfikuj działanie demona poleceniem systemctl status docker i upewnij się, że DOCKER_HOST nie wskazuje na nieistniejące gniazdo rootless.

Instalować Dockera przez snap czy apt na Ubuntu Server?

Użyj apt z repozytorium Dockera; snap wnosi dziwactwa izolacji bez żadnych korzyści na serwerze.
Wybierz apt z własnego repozytorium Dockera. Snap jest ściśle izolowany: bez dodatkowych połączeń interfejsów nie odczyta plików spoza Twojego katalogu domowego, używa innych ścieżek dla daemon.json i danych, a tempo jego aktualizacji kontroluje snapd, a nie Ty. Te dziwactwa objawiają się jako tajemnicze permission denied i awarie montowania bind. Pakiety apt trzymają się standardowych konwencji Ubuntu, normalnie integrują się z systemd i otrzymują aktualizacje upstream przez to samo apt upgrade, które już wykonujesz.

Ile RAM-u i miejsca na dysku potrzebuje VPS pod Dockera?

Sam silnik jest lekki; VPS-a dobieraj pod kontenery i ich obrazy.
Docker Engine w spoczynku zużywa kilkadziesiąt megabajtów RAM-u, więc prawdziwy budżet wyznacza Twoje obciążenie. Pojedyncza niewielka aplikacja webowa z bazą danych działa komfortowo w 2 GB; cięższe stosy lub kilka projektów wymagają 4 GB lub więcej. Dysk ma większe znaczenie, niż się wydaje: obrazy, pamięć podręczna kompilacji i logi trafiają do /var/lib/docker, a 20 GB zapełnia się szybko bez docker system prune i rotacji logów. Wybieraj dedykowany CPU i RAM zamiast zasobów współdzielonych, ponieważ kompilacje mocno obciążają procesor, a kontenery nie znoszą dobrze swapowania.

Adrien Roche, Redaktor ds. infrastruktury i hostingu

Inżynier systemowy z ponad 10-letnim doświadczeniem w utrzymaniu flot Windows Server i Linux. Adrien prowadzi dokumentację infrastruktury rdp.monster i pisze nasze poradniki o RDP, hostingu VPS, administracji serwerami, sieciach i narzędziach prywatności.

Zarejestruj się w naszym programie resellerskim

Twoje dane

Jeśli masz pytania, contact us by clicking here !
Imię i nazwisko(Wymagane)
Podaj swój adres e-mail. Musisz mieć konto na manager.rdp.monster !

Twoja firma

Podaj adres swojej strony, jeśli ją masz
Krótko wyjaśnij, w jaki sposób zamierzasz sprzedawać usługi swoim klientom. Na przykład rozmawiając z ludźmi na forach.

Używamy plików cookie !

Używamy plików cookie, aby poprawić Twoje doświadczenie przeglądania, oferować spersonalizowane reklamy lub treści i analizować nasz ruch. Klikając „Akceptuję”, wyrażasz zgodę na używanie przez nas plików cookie.