Перший досвід роботи з Docker

Хотілося б поділитися “граблями”, на які встиг наступити під час роботи з docker, цікавими фішками та взагалі розповісти про цю чудову технологію.

Що за звір такий?

Думаю, сьогодні вже всі чули про docker, але все ж таки:
Docker – контейнеризатор додатків. =)

А тут я зібрав основні властивості технології:

Встановлення

Установка цілком дефолтна, але все ж таки приділю цьому трохи уваги

Перше, що потрібно зробити – перейти на офіційний сайт docker

далі, як показано на знімок з екрана вище, вбираємо вашу систему, і чекаємо на завантаження. Стандартна установка і все, вітаю, Ви встановили собі Docker Desktop.

Вигляд Docker Desktop
Перший запуск

Робота з Docker

Є кілька способів роботи з Docker:

  • Працювати в Docker Desktop (як встановлювати дивитись вище!)
  • За допомогою cmd
  • Через IDE

Перший запуск

Запускаємо наш 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, але все ж таки, уточнимо моменти:

  • 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/