Хотілося б поділитися “граблями”, на які встиг наступити під час роботи з docker, цікавими фішками та взагалі розповісти про цю чудову технологію.
Що за звір такий?
Думаю, сьогодні вже всі чули про docker, але все ж таки:
Docker – контейнеризатор додатків. =)
А тут я зібрав основні властивості технології:
Встановлення
Установка цілком дефолтна, але все ж таки приділю цьому трохи уваги
Перше, що потрібно зробити – перейти на офіційний сайт docker
далі, як показано на знімок з екрана вище, вбираємо вашу систему, і чекаємо на завантаження. Стандартна установка і все, вітаю, Ви встановили собі Docker Desktop.


Робота з Docker
Є кілька способів роботи з Docker:
Перший запуск
Запускаємо наш Docker Desktop та відкриваємо командний рядок. Після запуску програми, у Вас має відображатись наступна іконка (у прихованих значках):

У командному терміні пишемо наступну команду:
docker
і якщо все правильно зроблено, то у Вас з’явиться список всіх доступних команд та їх опис:

cmd
Якщо командний рядок каже, що не знає такої команди, як “docker”
Сподіваюся у Вас все добре, і команда docker запрацювала та опис команд з’явився. Тепер можна і скопіювати команду з Docker Desktop

Посилання на сайт “Quickstart: Run SQL Server Linux container images with Docker”
Про це команду йдеться та виконати її у командному рядку. За ідеєю має вийти таке:

І що ми зробили? Створили та запустили контейнер docker/getting-started на порту 80.Повернемося до нашого Docker Desktop та бачимо наступне:

Запущений контейнер
Вітаю – ми запустили контейнер.
Перейдемо у вкладку Images і побачимо наступне:

Бачимо образ, на основі якого утворився наш контейнер. (Це всі ми зробили командою вище)Подивитися інформацію можна повернувшись у командний рядок і прописавши команду:
docker info
тоді побачимо наступне

Бачимо всю інформацію про всі контейнери та образи.
Давайте вже побачимо, що в нас вийшло. Переходимо в Docker Desktop у вкладку Containers/Apps і натискаємо наступне:

Hello world! по docker-ськи

Можемо насолодитися виконаною роботою)
Контейнери та образи
Контейнери, образи – щооооо?! Давайте тепер трохи теорії (зовсім трохи)
Образ (Image) – готове рішення, що містить якийсь функціонал (не можна змінювати), на його основі можемо створити свій контейнер
Контейнер (Container) – це зібраний проєкт, що складається з образів: упакований (контейнеризовано) додаток на основі образів
Подивимося на картинку нижче:

Тут наочно показаний принцип роботи технології docker, але все ж таки, уточнимо моменти:
- Docker deamon – проміжний api для знаходження та звантаження потрібного image
- Docker hub – місце збирання різних образів
- Images-образи
- Containers-контейнери
Встановлення образу
Спробуймо розгорнути якийсь контейнер (щось веселіше стартової сторінки).
- Заходимо на сайт docker
- Переходимо у вкладку: Explore
- У пошуку вводимо назву потрібного образу (я завантажуватиму образ java- ви можете вибрати будь-який інший)

знаходимо наступне

натискаємо, бачимо відразу готову команду:
docker pull bitwarden/mssql
Команда вибрана як приклад, так можна взяти абсолютно будь-який образ.
Копіюємо і вставляємо в командний рядок -> цим встановлюємо собі образ mssql:

Запуск образу
Давайте тепер створимо і запустимо контейнер на основі щойно завантаженого образу.
docker run ім'я_образу
“Стоп” – скажіть Ви. А де взяти ім’я образу? А ось від куди:
docker images
На вас вивалиться список образів, знаходимо там потрібний та вставляємо в команду вище:

Пошук імені контейнера Docker
Як правило, нам потрібно повідомити docker exec назву (або ID) контейнера, з яким ми хочемо працювати. Ми можемо знайти цю інформацію за допомогою команди docker ps:
docker ps
Ця команда виводить список усіх контейнерів Docker, які запущені на сервері, та надає високорівневу інформацію про них:
PS C:\Users\Kir> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f17c8ff330ea mcr.microsoft.com/mssql/server "/opt/mssql/bin/perm…" 25 hours ago Up 2 seconds 0.0.0.0:1433->1433/tcp mssql-study
У цьому прикладі вказано ID та назву контейнера. Ви можете використовувати будь-яке значення, щоб повідомити команду docker exec, з яким контейнером потрібно працювати.
Перейменувати контейнер можна за допомогою команди docker rename:
docker rename container-name new-name
Далі ми розглянемо кілька прикладів використання docker exec для виконання команд у запущеному контейнері Docker.
Запуск інтерактивної оболонки у контейнері Docker
Запустити інтерактивну оболонку в контейнері Docker (можливо для вивчення файлової системи або налагодження запущених процесів) можна за допомогою docker exec із прапорами -i та -t.
Прапор -i відкриває введення контейнера, а -t створює псевдо-термінал, через який можна під’єднатися якоболонка. Ці прапори можна комбінувати так:
docker exec -it container-name sh
Команда запустить базову оболонку sh у зазначеному контейнері.

Щоб вийти з контейнера, введіть exit і натисніть ENTER:
exit
Якщо образ контейнера включає більш просунуту оболонку, наприклад bash, можна замінити sh на bash.
Запуск неінтерактивної команди у контейнері Docker
Якщо вам потрібно виконати неінтерактивну команду у працюючому контейнері Docker, запустіть docker exec без прапорів:
docker exec container-name tail /var/log/date.log
Ця команда виконає tail /var/log/date.log у контейнері container-name та виведе результати. За замовчанням команда tail виводить останні десять рядків файлу. Якщо ви запускаєте демо-контейнер, який ми встановили на першому етапі, висновок буде приблизно наступним:

Що отримали
Запустити образ без контейнера неможливо – суперечить принципу docker, тому у нас створився контейнер на основі нашого образу, який ми намагалися запустити.

Запустімо наш контейнер в інтерактивному режимі та переконаємося, що ми все зробили правильно. Вводимо команду для запуску (даємо своє ім’я тут я обізвав його як mssql-study):
docker run mssql-study
Отримуємо запущений контейнер:

Підключення до контейнера:
docker exec -it mssql-study /bin/sh

Підключення до бази MSSQL:
/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P 'YourStrongPassword' -C

Виконання команд в альтернативному каталозі
Запустити команду у певному каталозі контейнера можна за допомогою прапора — workdir:
docker exec --workdir /tmp container-name pwd
У цьому прикладі команда встановлює каталог /tmp як робочий, а потім запускає pwd, яка виводить поточний робочий каталог:
/tmp
pwd підтверджує, що робочий каталог – / tmp.
Виконання команд від імені іншого користувача
Додати прапор –user, щоб запустити команду від імені іншого користувача всередині контейнера:
docker exec --user guest container-name whoami
Для виконання команди whoami в контейнері використовуватиметься користувач guest. Команда whoami виводить ім’я поточного користувача:
guest
whoami підтверджує, що поточний користувач контейнера – guest.
Передача змінних оточення
Іноді разом з командою, що виконується, в контейнер потрібно передати змінні оточення. Прапор -e дозволяє вказати змінну оточення:
docker exec -e TEST = MSSQL container-name env
Ця команда встановлює для змінної оточення TEST значення MSSQL, а потім запускає команду env у контейнері. Потім env виводить усі змінні оточення:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST = MSSQL
HOME=/root
Для змінної TEST встановлюється значення MSSQL.
Щоб встановити кілька змінних, повторіть прапорець -e для кожної:
docker exec -e TEST = MSSQL -e ENVIRONMENT = prod container-name env
Якщо ви бажаєте передати файл зі значеннями змінних оточення, ви можете зробити це за допомогою прапорця -env-file.
Спочатку створіть файл за допомогою текстового редактора. Ми відкриємо новий файл через nano, але ви можете використовувати будь-який інший редактор:
nano .env
Назвемо файл .env, тому що це популярний стандарт для використання файлів такого типу (для керування інформацією поза системою контролю версій).
Запишіть змінні KEY=value у файл, по одному у рядку:
TEST = MSSQL
ENVIRONMENT=prod
Збережіть та закрийте файл. У nano натисніть CTRL+O, ENTER і CTRL+X.
Тепер запустіть команду docker exec, вказавши правильне ім’я файлу після –env-file:
docker exec --env-file .env container-name env
Результат буде таким:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST = MSSQL
ENVIRONMENT=prod
HOME=/root
Тепер у файлі встановлено дві змінні.
Ви можете вказати більше файлів за допомогою кількох прапорів -env-file. Якщо перемінні файли перетинаються, то файл, який був вказаний останнім у команді, перезапише попередні.
Часті помилки
При роботі з командою docker exec ви можете зіткнутися з такими помилками:
Error: No such container: container-name
Помилка No such container означає, що зазначеного контейнера немає, а також може вказувати на неправильне написання імені контейнера. Виконайте docker ps, щоб вивести список запущених контейнерів та перевірити його назву.
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
Повідомлення не running означає, що контейнер існує, але він зупинений. Ви можете запустити контейнер за допомогою docker start container-name.
Error response from daemon: Container container-name is paused, unpause the container before exec
Помилка Container is paused досить зрозуміло пояснює проблему. Потрібно розблокувати контейнер за допомогою docker unpause container-name, перш ніж приступати до подальшої роботи.
Висновки
У цьому мануалі ми розглянули виконання команд у запущеному контейнері Docker та деякі опції командного рядка.
Оригінал статті: https://habr.com/ru/articles/663026/
