Пошук уроків, статей та іншого контенту
Навчіться запускати контейнери командою docker run і налаштовувати їхні порти, імена, змінні середовища та режими роботи.
Контейнер — це ізольований процес, який запускається з образу. Образ містить усе необхідне для роботи застосунку: файли, залежності та початкову команду.
Для створення і запуску контейнера використовується команда:
docker run [опції] IMAGE [команда] [аргументи]Наприклад:
docker run nginx:alpineDocker:
знаходить образ nginx:alpine локально;
за потреби завантажує його з реєстру;
створює контейнер;
запускає процес усередині контейнера.
Якщо образ не вказати явно, Docker використає тег latest, але краще вказувати конкретний тег, наприклад nginx:alpine.
Без додаткових опцій контейнер працює у foreground-режимі — термінал під’єднаний до основного процесу контейнера.
docker run nginx:alpineУ цьому прикладі термінал зайнятий процесом Nginx. Щоб зупинити контейнер, натисніть Ctrl+C.
Після зупинки контейнер не обов’язково видаляється. Перелік усіх контейнерів, зокрема зупинених, можна переглянути командою:
docker ps -aЩоб запустити контейнер у background-режимі, використовуйте опцію -d або --detach:
docker run -d nginx:alpineDocker поверне ідентифікатор контейнера, а термінал одразу стане доступним для наступних команд.
Переглянути запущені контейнери можна так:
docker psУ результаті буде видно:
ідентифікатор контейнера;
використаний образ;
команду;
час роботи;
опубліковані порти;
ім’я контейнера.
Щоб переглянути журнали контейнера:
docker logs CONTAINER_IDЗамість CONTAINER_ID можна використовувати ім’я контейнера, якщо воно задане.
Якщо ім’я не вказати, Docker автоматично згенерує випадкове ім’я. Для власного імені використовуйте --name:
docker run --name lesson-web nginx:alpineПісля цього до контейнера можна звертатися за іменем:
docker logs lesson-webІм’я має бути унікальним серед контейнерів. Повторна команда з таким самим ім’ям завершиться помилкою, якщо контейнер уже існує.
Щоб видалити зупинений контейнер:
docker rm lesson-webЯкщо контейнер ще працює, спочатку зупиніть його:
docker stop lesson-web
docker rm lesson-webОпція --rm автоматично видаляє контейнер після його зупинки:
docker run --rm alpine:3.20 echo "Контейнер завершив роботу"Контейнер запуститься, виконає команду echo, виведе повідомлення і завершиться. Після цього його не залишиться у списку контейнерів.
Це зручно для короткочасних команд і тестів.
Порти контейнера ізольовані від операційної системи. Щоб отримати доступ до сервісу з хоста, потрібно опублікувати порт за допомогою опції -p:
docker run --name lesson-web -p 8080:80 -d nginx:alpineФормат опції:
-p ПОРТ_ХОСТА:ПОРТ_КОНТЕЙНЕРАУ прикладі:
8080 — порт на вашому комп’ютері;
80 — порт усередині контейнера;
Nginx працює всередині контейнера на порту 80;
звертатися до нього з хоста можна через порт 8080.
Відкрийте у браузері адресу:
http://localhost:8080Або виконайте запит у терміналі:
curl http://localhost:8080Переглянути опубліковані порти можна командою:
docker psЗа замовчуванням опція -p 8080:80 робить порт доступним через усі мережеві інтерфейси хоста. Для доступу лише з цього комп’ютера можна вказати адресу 127.0.0.1:
docker run --name local-web -p 127.0.0.1:8080:80 -d nginx:alpineТепер сервіс доступний через localhost:8080, але не публікується на інших мережевих інтерфейсах.
docker stop lesson-web
docker rm lesson-webЯкщо контейнер потрібно видаляти автоматично після зупинки, запустіть його з --rm:
docker run --rm --name temporary-web -p 8080:80 -d nginx:alpineЗмінні середовища передають конфігураційні значення процесу всередині контейнера. Для цього використовується опція -e або --env:
docker run --rm -e APP_ENV=development alpine:3.20 \
sh -c 'echo "Середовище: $APP_ENV"'Команда виведе:
Середовище: developmentЗначення змінної можна передати окремою парою ключ-значення:
docker run --rm \
-e APP_NAME=demo \
-e APP_PORT=8080 \
alpine:3.20 \
sh -c 'echo "$APP_NAME працює на порту $APP_PORT"'Також можна передати змінну середовища з поточного shell:
APP_ENV=production
docker run --rm -e APP_ENV alpine:3.20 \
sh -c 'echo "Значення APP_ENV: $APP_ENV"'У цьому випадку -e APP_ENV передає контейнеру значення змінної APP_ENV, яка вже існує на хості.
Змінні середовища доступні лише процесам усередині контейнера. Сам Docker не змінює ними налаштування програми автоматично: застосунок має самостійно читати ці змінні.
Для взаємодії з командою всередині контейнера використовують:
-i або --interactive — залишає стандартний ввід відкритим;
-t або --tty — створює псевдотермінал.
Зазвичай ці опції використовують разом як -it:
docker run --rm -it alpine:3.20 shПісля запуску ви опинитеся всередині оболонки контейнера. Можна виконати команди:
echo "Я всередині контейнера"
uname -aЩоб вийти з оболонки і завершити контейнер:
exitОпція --rm після цього автоматично видалить контейнер.
Опції docker run можна комбінувати. Наприклад, команда нижче:
docker run \
--name lesson-web \
--publish 8080:80 \
--env APP_ENV=development \
--detach \
nginx:alpineробить таке:
створює контейнер з іменем lesson-web;
публікує порт 80 контейнера на порт 8080 хоста;
передає змінну APP_ENV;
запускає контейнер у фоновому режимі;
використовує образ nginx:alpine.
Короткі та повні форми основних опцій:
| Коротка форма | Повна форма | Призначення | |---|---|---| | -d | --detach | запуск у фоновому режимі | | --name | --name | ім’я контейнера | | -p | --publish | публікація порту | | -e | --env | змінна середовища | | -i | --interactive | відкритий стандартний ввід | | -t | --tty | псевдотермінал | | --rm | --rm | автоматичне видалення після завершення |
Нижче наведено повний сценарій запуску вебконтейнера:
# Запускаємо Nginx у фоновому режимі з власним ім’ям і портом
docker run --name demo-web --publish 8080:80 --detach nginx:alpine
# Перевіряємо, що контейнер працює
docker ps
# Перевіряємо відповідь вебсерверу
curl http://localhost:8080
# Переглядаємо журнали контейнера
docker logs demo-web
# Зупиняємо контейнер
docker stop demo-web
# Видаляємо зупинений контейнер
docker rm demo-webЯкщо порт 8080 уже зайнятий іншою програмою, використайте інший порт хоста, наприклад:
docker run --name demo-web --publish 8081:80 --detach nginx:alpineУ такому випадку сервіс буде доступний за адресою http://localhost:8081.
Помилка виникає, якщо інший процес або контейнер уже використовує порт хоста:
Bind for 0.0.0.0:8080 failed: port is already allocatedВикористайте інший порт:
docker run --name another-web -p 8081:80 -d nginx:alpineЯкщо контейнер demo-web уже створений, повторний запуск із таким самим іменем не спрацює.
Перегляньте всі контейнери:
docker ps -aЗупиніть і видаліть старий контейнер:
docker stop demo-web
docker rm demo-webАбо використайте інше ім’я.
У записі:
-p 8080:80перше число — порт хоста, друге — порт контейнера.
Якщо помилково написати -p 80:8080, Docker опублікує порт 8080 контейнера, але Nginx, який слухає порт 80, не буде доступний через цей mapping.
Контейнер працює доти, доки працює його основний процес. Наприклад, контейнер із командою echo завершиться одразу після виведення тексту:
docker run --rm alpine:3.20 echo "Готово"Це нормальна поведінка. Для довготривалого запуску потрібен процес, який продовжує працювати, наприклад вебсервер:
docker run --name running-web -d nginx:alpineОпція -e лише передає значення всередину контейнера. Програма повинна підтримувати відповідну змінну і читати її. Наявність змінної сама по собі не змінює конфігурацію довільного застосунку.
docker run створює і запускає контейнер з образу.
-d запускає контейнер у фоновому режимі.
--name задає зрозуміле ім’я контейнера.
-p HOST_PORT:CONTAINER_PORT публікує порт контейнера на хості.
-e NAME=value передає змінну середовища всередину контейнера.
-it запускає контейнер у режимі інтерактивної роботи.
--rm автоматично видаляє контейнер після завершення.
docker ps показує запущені контейнери.
docker stop зупиняє контейнер, а docker rm видаляє його.