docker run створює контейнер з образу й запускає його.
docker run -d --name redis --restart unless-stopped -p 127.0.0.1:6379:6379 -v redis-data:/data redis:8-alpine
Основні прапорці:
| Прапорець | Що робить |
|---|---|
-d |
у фоні (detached); без нього - вивід у терміналі |
--name redis |
ім'я замість випадкового (hungry_turing) |
-p 8080:80 |
опублікувати порт контейнера 80 на порту хоста 8080 |
-v назва:/шлях |
іменований том; -v ./src:/app - каталог хоста (bind mount) |
-e KEY=value |
змінна оточення; --env-file .env - з файлу |
--rm |
видалити контейнер після завершення (для разових команд) |
-it |
інтерактивний режим з терміналом (для bash, tinker) |
--restart |
політика перезапуску: no, on-failure, always, unless-stopped |
--network |
приєднати до мережі |
-w /app |
робочий каталог |
--memory 512m, --cpus 1 |
ліміти ресурсів |
--user 1000:1000 |
від імені якого користувача запустити процес |
Команда після образу замінює CMD образу:
docker run --rm -it php:8.5-cli php -v
docker run --rm -v "$PWD":/app -w /app composer:2 composer install
Другий приклад - класичний спосіб запустити інструмент без встановлення на хост: контейнер існує лише на час команди.
Що варто пам'ятати:
- без
--rmзупинені контейнери накопичуються (docker ps -a) разом зі своїми записуваними шарами; - порядок має значення: прапорці Docker - до назви образу, аргументи для процесу - після.
docker run nginx -p 80:80передасть-p 80:80самому nginx; -p 8080:80публікує порт на всіх інтерфейсах хоста - для служб, які не мають бути доступні ззовні, --p 127.0.0.1:8080:80;-vз відносним шляхом без./Docker вважає назвою тому, а не каталогом;--restart alwaysперезапускає навіть контейнер, зупинений вручну, після перезапуску Docker;unless-stopped- поважає ручну зупинку.
Для кількох пов'язаних контейнерів довгі команди docker run швидко стають незручними - їх описують у compose.yaml.