nickjj.docker
Co to jest ansible-docker? 
To jest rola Ansible, która:
- Instaluje Docker (wsparcie dla edycji, kanałów i wersji)
- Instaluje Docker Compose v2 i / lub Docker Compose v1 (wsparcie dla wersji)
- Instaluję pakiet
docker
PIP, aby modułydocker_*
w Ansible działały - Zarządza danymi logowania do rejestru Docker
- Konfiguruje jednego lub więcej użytkowników do uruchamiania Dockera bez dostępu root
- Konfiguruje opcje demona Dockera i zmienne środowiskowe
- Konfiguruje zadanie cron do wykonywania poleceń czyszczenia Docker
Dlaczego warto użyć tej roli?
Jeżeli tak jak ja, lubisz Dockera, to ta rola dostarcza wszystko, co potrzebujesz, aby rozpocząć pracę z gotowym do użycia hostem Docker.
Jeśli nie wiesz, czym jest Docker, lub chcesz stać się ekspertem w tej dziedzinie, zajrzyj do Dive into Docker: The Complete Docker Course for Developers.
Obsługiwane platformy
- Ubuntu 20.04 LTS (Focal Fossa)
- Ubuntu 22.04 LTS (Jammy Jellyfish)
- Debian 11 (Bullseye)
- Debian 12 (Bookworm)
Poprzednie wersje mogą działać lub nie, ale nie są oficjalnie wspierane.
Patrzysz na dokumentację gałęzi master, która może być zaktualizowana w stosunku do najnowszej wersji. Przełącz na najnowszą wersję.
Szybki start
Filozofia moich ról polega na tym, aby ułatwić rozpoczęcie pracy, ale także zapewnić możliwość dostosowania niemal wszystkiego.
Co jest skonfigurowane domyślnie?
Zainstalowana zostanie najnowsza stabilna wersja Docker CE i Docker Compose v2, oczyszczanie dysku Docker odbywa się raz w tygodniu, a logi kontenerów Docker będą wysyłane do journald
.
Przykład playbooka
---
# docker.yml
- name: Przykład
hosts: "all"
become: true
roles:
- role: "nickjj.docker"
tags: ["docker"]
Użycie: ansible-playbook docker.yml
Instalacja
$ ansible-galaxy install nickjj.docker
Domyślne zmienne roli
Instalacja Dockera
Kanał
Chcesz używać kanału "stable" czy "test"? Możesz dodać więcej niż jeden (kolejność ma znaczenie).
docker__channel: ["stable"]
Wersja
- Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Dockera
- Gdy ustawione na konkretną wersję, ta wersja Dockera zostanie zainstalowana i przypięta
docker__version: ""
# Na przykład, przypinając do wersji 25.0.
docker__version: "25.0"
# Na przykład, przypinając do bardziej precyzyjnej wersji 25.0.
docker__version: "25.0.5"
Wersje są przypinane z *
na końcu wersji pakietu, więc dostaniesz mniejsze i poprawki zabezpieczeń, chyba że przypniesz dokładną wersję.
Strategia aktualizacji
- Gdy ustawione na
"present"
, uruchomienie tej roli w przyszłości nie zainstaluje nowszych wersji (jeśli są dostępne) - Gdy ustawione na
"latest"
, uruchomienie tej roli w przyszłości zainstaluje nowsze wersje (jeśli są dostępne)
docker__state: "present"
Strategia downgrade
Najłatwiejszym sposobem na downgrade byłoby ręczne odinstalowanie pakietu Docker, a następnie uruchomienie tej roli z przypiętą konkretną wersją Dockera.
# Komenda Ansible do zatrzymania i usunięcia pakietu Docker CE na wszystkich hostach.
ansible all -m systemd -a "name=docker-ce state=stopped" \
-m apt -a "name=docker-ce autoremove=true purge=true state=absent" -b
Instalacja Docker Compose v2
Docker Compose v2 zostanie zainstalowane przy użyciu oficjalnego
docker-compose-plugin
, którym zarządza Docker.
Wersja
- Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Docker Compose v2
- Gdy ustawione na konkretną wersję, ta wersja Docker Compose v2 zostanie zainstalowana i przypięta
docker__compose_v2_version: ""
# Na przykład, przypinając do wersji 2.29.
docker__compose_v2_version: "2.29"
# Na przykład, przypinając do bardziej precyzyjnej wersji 2.29.1.
docker__compose_v2_version: "2.29.1"
Strategia aktualizacji
Będzie korzystać z zmiennej docker__state
opisanej powyżej w sekcji Docker z tymi samymi zasadami.
Strategia downgrade
Jak w przypadku samego Dockera, najłatwiejszym sposobem na odinstalowanie Docker Compose v2 jest ręczne uruchomienie poniższej komendy, a następnie przypięcie konkretnej wersji Docker Compose v2.
# Komenda Ansible do usunięcia pakietu Docker Compose Plugin na wszystkich hostach.
ansible all -m apt -a "name=docker-compose-plugin autoremove=true purge=true state=absent" -b
Instalacja Docker Compose v1
Domyślnie ta rola nie instaluje Docker Compose v1, ponieważ jest on oficjalnie wycofany i nie otrzymuje już aktualizacji od Dockera. Jednak ta rola jest w stanie go zainstalować. Wystarczy ustawić
docker__pip_docker_compose_state: "present"
, ponieważ ta rola domyślnie ustawia tę wartość na absent
.
Technicznie obie wersje mogą być zainstalowane razem, ponieważ v1 uzyskuje dostęp za pomocą docker-compose
, a v2 za pomocą docker compose
(zwróć uwagę na brak myślnika).
Sugerowałbym, aby nie instalować v1, chyba że naprawdę go potrzebujesz do celów legacy. Jeśli zdecydujesz się go zainstalować, możesz skonfigurować, która wersja zostanie zainstalowana poniżej. Jeśli nie zostanie ustawiona do zainstalowania, te wersje zostaną pozostawione nieużywane:
Wersja
- Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Docker Compose v1
- Gdy ustawione na konkretną wersję, ta wersja Docker Compose v1 zostanie zainstalowana i przypięta
docker__compose_version: ""
# Na przykład, przypinając do wersji 1.29.
docker__compose_version: "1.29"
# Na przykład, przypinając do bardziej precyzyjnej wersji 1.29.
docker__compose_version: "1.29.2"
Strategie aktualizacji i downgrade będą opisane w innej sekcji tego dokumentu.
Konfigurowanie użytkowników do uruchamiania Dockera bez root
Lista użytkowników, którzy mają zostać dodani do grupy docker
.
Pamiętaj, że ten użytkownik musi już istnieć, ta rola go nie tworzy. Jeśli chcesz tworzyć użytkowników, sprawdź moją rolę użytkownika.
Ta rola nie konfiguruje Namespace Użytkownika ani innych funkcji bezpieczeństwa domyślnie. Jeśli dodany tutaj użytkownik ma dostęp SSH do serwera, to effectively dajesz mu dostęp root do serwera, ponieważ może uruchamiać Dockera bez sudo
i mapować woluminy w dowolnej lokalizacji w systemie plików.
W kontrolowanym środowisku jest to bezpieczne, ale jak w przypadku wszystkiego związane z bezpieczeństwem, warto to wiedzieć na wstępie. Możesz włączyć Namespace Użytkownika i wszelkie inne opcje za pomocą zmiennej docker__daemon_json
, która jest opisana później.
# Domyślnie próbuj użyć użytkownika sudo, ale wróć do root.
docker__users: ["{{ ansible_env.SUDO_USER | d('root') }}"]
# Na przykład, jeśli użytkownik, którego chcesz ustawić jest inny niż użytkownik sudo.
docker__users: ["admin"]
Konfigurowanie logowania do rejestru Docker
Zaloguj się do jednego lub więcej rejestrów Docker (takich jak Docker Hub).
# Twoje dane logowania trafią do katalogu domowego tego użytkownika.
docker__login_become_user: "{{ docker__users | first | d('root') }}"
# 0 lub więcej rejestrów do logowania.
docker__registries:
- #registry_url: "https://index.docker.io/v1/"
username: "twoja_nazwa_użytkownika_docker_hub"
password: "twoje_hasło_docker_hub"
#email: "twó[email protected]"
#reauthorize: false
#config_path: "$HOME/.docker/config.json"
#state: "present"
docker__registries: []
Właściwości poprzedzone * są wymagane.
registry_url
domyślnie ustawione nahttps://index.docker.io/v1/
- *
username
to twoja nazwa użytkownika rejestru Docker - *
password
to twoje hasło rejestru Docker email
domyślnie nie jest używane (nie wszystkie rejestry go używają)reauthorize
domyślnie ustawione nafalse
, a gdytrue
to aktualizuje twoje dane logowaniaconfig_path
domyślnie do katalogudocker__login_become_user
's$HOME
state
domyślnie ustawione na "present", gdy "absent" logowanie zostanie usunięte
Konfigurowanie opcji demona Docker (json)
Domyślne opcje demona Docker, jakie miałyby być w /etc/docker/daemon.json
.
docker__default_daemon_json: |
"log-driver": "journald",
"features": {
"buildkit": true
}
# Dodaj swoje własne dodatkowe opcje demona bez nadpisywania domyślnych opcji.
# Trzyma się tego samego formatu co domyślne opcje, i nie martw się o
# rozpoczęcie od przecinka. Szablon doda przecinek, jeśli będzie to potrzebne.
docker__daemon_json: ""
Konfigurowanie opcji demona Docker (flagi)
Flagi, które są ustawiane podczas uruchamiania demona Docker, nie mogą być zmieniane w pliku daemon.json
. Domyślnie Docker ustawia -H unix://
, co oznacza, że ta opcja nie może być zmieniana za pomocą opcji json.
Dodaj lub zmień flagi startowe demona Docker podając je dokładnie tak, jak miałyby się pojawić w wierszu poleceń.
# Każda flaga wiersza poleceń powinna być osobnym elementem na liście.
#
# Używasz wersji Dockera sprzed 18.09?
# Musisz ustawić `-H fd://` zamiast `-H unix://`.
docker__daemon_flags:
- "-H unix://"
Jeżeli nie dostarczysz jakiegoś rodzaju flagi -H
tutaj, Docker nie uruchomi się.
Konfigurowanie zmiennych środowiskowych demona Docker
docker__daemon_environment: []
# Na przykład, oto jak ustawić kilka zmiennych środowiskowych proxy.
docker__daemon_environment:
- "HTTP_PROXY=http://proxy.example.com:80"
- "HTTPS_PROXY=https://proxy.example.com:443"
Konfigurowanie zaawansowanych dyrektyw systemd
Ta rola pozwala pakietowi Docker zarządzać swoim własnym plikiem jednostki systemd i dostosowywać takie rzeczy jak flagi demona Docker i zmienne środowiskowe, używając wzoru nadpisania systemd.
Jeśli wiesz, co robisz, możesz nadpisać lub dodać do jakiejkolwiek dyrektywy systemd Dockera, ustawiając tę zmienną. Cokolwiek dodasz do tego ciągu, zostanie zapisane w /etc/systemd/system/docker.service.d/custom.conf
tak, jak jest.
docker__systemd_override: ""
Konfigurowanie związanych z Docker zadania cron
Domyślnie to zadanie bezpiecznie zwolni miejsce na dysku używane przez Dockera w każdą niedzielę o północy.
# `a` usuwa nieużywane obrazy (przydatne w produkcji).
# `f` wymusza, aby to się zdarzyło bez pytania o zgodę.
docker__cron_jobs_prune_flags: "af"
# Kontroluje harmonogram czyszczenia systemu Dockera.
docker__cron_jobs_prune_schedule: ["0", "0", "*", "*", "0"]
docker__cron_jobs:
- name: "Czyszczenie dysku Docker"
job: "docker system prune -{{ docker__cron_jobs_prune_flags }} > /dev/null 2>&1"
schedule: "{{ docker__cron_jobs_prune_schedule }}"
cron_file: "docker-disk-clean-up"
#user: "{{ (docker__users | first) | d('root') }}"
#state: "present"
Właściwości poprzedzone * są wymagane.
- *
name
to opis zadania cron - *
job
to polecenie, które ma być uruchomione w zadaniu cron - *
schedule
to format standardowego zadania cron na każdą niedzielę o północy - *
cron_file
zapisuje plik cron w/etc/cron.d
, zamiast w indywidualnej crontabie użytkownika user
domyślnie ustawione na pierwszego użytkownikadocker__users
lub root, jeśli ten nie jest dostępnystate
domyślnie ustawione na "present", gdy "absent" plik cron zostanie usunięty
Konfigurowanie menedżera pakietów APT
Docker wymaga zainstalowania kilku zależności, aby działał. Nie powinieneś musieć edytować żadnej z tych zmiennych.
# Lista pakietów do zainstalowania.
docker__package_dependencies:
- "apt-transport-https"
- "ca-certificates"
- "cron"
- "gnupg2"
- "software-properties-common"
# Ansible identyfikuje architektury CPU inaczej niż Docker.
docker__architecture_map:
"x86_64": "amd64"
"aarch64": "arm64"
"aarch": "arm64"
"armhf": "armhf"
"armv7l": "armhf"
# Adres URL klucza GPG Dockera.
docker__apt_repository_url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}"
# Wartość sumy kontrolnej klucza GPG Dockera.
docker__apt_key_checksum: "sha256:1500c1f56fa9e26b9b8f42452a553675796ade0807cdce11975eb98170b3a570"
# Górny rejestr APT Dockera.
docker__apt_repository: >
deb [arch={{ docker__architecture_map[ansible_architecture] }}
signed-by=/etc/apt/keyrings/docker.asc]
{{ docker__apt_repository_url }}
{{ ansible_distribution_release }} {{ docker__channel | join(' ') }}
Instalacja pakietów Pythona z Virtualenv i PIP
Konfigurowanie Virtualenv
Zamiast zanieczyszczać wersję Pythona na serwerze, wszystkie pakiety PIP są instalowane w Virtualenv według twojego wyboru.
docker__pip_virtualenv: "/usr/local/lib/docker/virtualenv"
Instalacja PIP i jego zależności
Ta rola instaluje PIP, ponieważ Docker Compose v1 jest instalowane za pomocą pakietu docker-compose
PIP, a moduły docker_*
w Ansible używają pakietu docker
PIP.
docker__pip_dependencies:
- "gcc"
- "python3-setuptools"
- "python3-dev"
- "python3-pip"
- "virtualenv"
Instalacja pakietów PIP
docker__default_pip_packages:
- name: "docker"
state: "{{ docker__pip_docker_state }}"
- name: "docker-compose"
version: "{{ docker__compose_version }}"
path: "/usr/local/bin/docker-compose"
src: "{{ docker__pip_virtualenv + '/bin/docker-compose' }}"
state: "{{ docker__pip_docker_compose_state }}"
# Dodaj swoje własne pakiety PIP z tymi samymi właściwościami jak powyżej.
docker__pip_packages: []
Właściwości poprzedzone * są wymagane.
- *
name
to nazwa pakietu version
to wersja pakietu do zainstalowania (lub "" jeśli nie jest to określone)path
to docelowa ścieżka symlinkasrc
to źródłowa ścieżka do symlinkastate
domyślnie ustawione na "present", inne wartości mogą być "forcereinstall" lub "absent"
Stan pakietu PIP
- Gdy ustawione na
"present"
, pakiet zostanie zainstalowany, ale nie zaktualizowany w przyszłych uruchomieniach - Gdy ustawione na
"forcereinstall"
, pakiet zawsze zostanie (re)zainstalowany i zaktualizowany w przyszłych uruchomieniach - Gdy ustawione na
"absent"
, pakiet zostanie pominięty lub usunięty
docker__pip_docker_state: "present"
docker__pip_docker_compose_state: "absent"
Praca z modułami docker_*
w Ansible
Ta rola używa docker_login
do logowania się do rejestru Docker, ale możesz też używać innych modułów docker_*
w swoich rolach. Nie będą one działać, jeśli nie poinstruujesz Ansible, aby użył Virtualenv tej roli.
Na poziomie inwentarza, playbooka lub zadania musisz ustawić
ansible_python_interpreter: "/usr/local/bin/python3-docker"
. To działa, ponieważ ta rola tworzy skrypt proxy z binarnym plikiem Pythona Virtualenv do python3-docker
.
Możesz spojrzeć na zadanie docker_login
tej roli jako przykład, jak to zrobić na poziomie zadania.
Licencja
MIT
Install and configure Docker / Docker Compose.
ansible-galaxy install nickjj.docker