🢂Docker ‑ Zadania rekrutacyjne i odpowiedzi

Te zadania mają na celu ocenę wiedzy kandydatów na temat praktycznego wykorzystania Dockera.

Zadania i odpowiedzi mogą być użyteczne podczas rekrutacji na stanowiska związane z obsługą i zarządzaniem kontenerami Docker, od deweloperów po administratorów systemów i inżynierów DevOps.

Zadanie 1: Podstawy Dockera

  • Pytanie: Jakie polecenie użyjesz do uruchomienia kontenera Docker z obrazu nginx, aby był dostępny pod portem 8080 na hoście, mapując go na port 80 w kontenerze?
  • Odpowiedź: Użyłbym polecenia docker run -d -p 8080:80 nginx. Opcja -d uruchamia kontener w tle, a -p 8080:80 mapuje port 8080 na hoście na port 80 w kontenerze.

Zadanie 2: Dockerfile

  • Pytanie: Napisz prosty Dockerfile dla aplikacji Node.js, która nasłuchuje na porcie 3000. Załóż, że plik startowy to app.js.
  • Odpowiedź:
FROM node:alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Ten Dockerfile zaczyna od obrazu bazowego node:alpine, kopiuje pliki aplikacji, instaluje zależności i uruchamia aplikację.

Zadanie 3: Docker Compose

  • Pytanie: Jak skonfigurować docker-compose.yml dla aplikacji webowej uruchomionej w kontenerze web i bazy danych MySQL w kontenerze db?
  • Odpowiedź:
version: '3'
services:
    web:
        image: webapp:latest
        depends_on:
            - db
        ports:
            - '8000:8000'
    db:
        image: mysql:5.7
        environment:
            MYSQL_ROOT_PASSWORD: example

Konfiguracja ta definiuje dwie usługi: web i db, gdzie web zależy od db, a MySQL jest konfigurowany z hasłem roota.

Zadanie 4: Sieci w Dockerze

  • Pytanie: Jak stworzyć niestandardową sieć w Dockerze i uruchomić w niej dwa kontenery, tak aby mogły się ze sobą komunikować?
  • Odpowiedź: Stwórz sieć:
docker network create moja_siec

Uruchom kontenery w tej sieci, np.:

docker run -d --name kontener1 --network moja_siec alpine sleep infinity
docker run -d --name kontener2 --network moja_siec alpine sleep infinity

Kontenery będą mogły się komunikować, używając nazw kontener1 i kontener2 jako adresów.

Zadanie 5: Zarządzanie Obrazami

  • Pytanie: Jak zbudować obraz z Dockerfile znajdującego się w bieżącym katalogu i otagować go jako mojaaplikacja:1.0?
  • Odpowiedź: Użyłbym polecenia docker build -t mojaaplikacja:1.0 ., gdzie -t mojaaplikacja:1.0 oznacza tagowanie zbudowanego obrazu, a . wskazuje na bieżący katalog jako kontekst budowania.

Zadanie 6: Optymalizacja Obrazów Dockera

  • Pytanie: Jak zmniejszyć rozmiar obrazu Dockera dla aplikacji napisanej w Pythonie?
  • Odpowiedź: Aby zmniejszyć rozmiar obrazu:
    • Użyj obrazu bazowego Pythona z tagiem alpine, np., FROM python:3.8-alpine.
    • Zminimalizuj liczbę warstw, łącząc polecenia, gdzie to możliwe, używając && w RUN.
    • Usuń niepotrzebne pliki i zależności po ich instalacji w Dockerfile.
    • Skorzystaj z multi-stage builds, jeśli to możliwe, aby zbudować aplikację w jednym etapie, a następnie skopiować tylko potrzebne artefakty do ostatecznego obrazu.

Zadanie 7: Docker Networking

  • Pytanie: Wyjaśnij, jak zabezpieczyć komunikację między kontenerami Dockera w ramach tej samej sieci.
  • Odpowiedź: Aby zabezpieczyć komunikację:
    • Użyj sieci typu overlay dla aplikacji rozproszonych na wielu hostach Docker, co zapewnia izolację i bezpieczną sieć.
    • Stosuj zasady firewalla na hoście i wewnątrz kontenerów, aby ograniczyć ruch tylko do upoważnionych usług.
    • Wykorzystaj Docker Secret i Docker Swarm do zarządzania poufnymi danymi, zapewniając bezpieczną komunikację między kontenerami.

Zadanie 8: Docker Volumes

  • Pytanie: Jak przenieść dane między hostem a kontenerem Dockera?
  • Odpowiedź: Aby przenieść dane, użyj wolumenów Docker:
    • Podczas uruchamiania kontenera użyj opcji -v lub --mount aby zamontować wolumin lub katalog z hosta do kontenera, np., docker run -v /ścieżka/na/hoście:/ścieżka/w/kontenerze.
    • Możesz też użyć polecenia docker cp do kopiowania danych między kontenerem a hostem.

Zadanie 9: Docker Logs

  • Pytanie: Jak śledzić i zarządzać logami generowanymi przez kontenery Dockera?
  • Odpowiedź: Do zarządzania logami:
    • Użyj docker logs [ID_KONTENERA] do wyświetlenia logów kontenera.
    • Skonfiguruj sterownik logowania na poziomie kontenera lub demona Dockera, aby logi były przekazywane do systemu zewnętrznego, np. systemu agregacji logów.
    • Można też wykorzystać narzędzia i usługi zewnętrzne, takie jak ELK Stack lub Fluentd, do bardziej zaawansowanego gromadzenia i analizy logów.

Zadanie 10: Docker Security

  • Pytanie: Jakie są najlepsze praktyki dotyczące bezpieczeństwa kontenerów Dockera?
  • Odpowiedź: Do najlepszych praktyk należą:
    • Regularne aktualizowanie Dockera i obrazów kontenerów do najnowszych wersji, aby minimalizować ryzyko podatności.
    • Używanie obrazów z zaufanych źródeł i skanowanie ich pod kątem podatności za pomocą narzędzi takich jak Clair.
    • Ograniczanie dostępu do kontenerów za pomocą zasad sieciowych i zarządzania użytkownikami.
    • Stosowanie zasad najmniejszych uprawnień dla procesów wewnątrz kontenerów.
    • Wykorzystanie mechanizmów Docker Secrets lub innych narzędzi do zarządzania poufnymi danymi, unikając ich eksponowania w konfiguracji.