Початок роботи з Doker.

Докером (docker) називався робітник, який переносив товари на судна та назад, коли ті стояли в портах.

Там були ящики та вантажі різних розмірів та форм, і досвідчені докери цінувалися за те, що вони спроможні вручну помістити товари на кораблі економічно ефективним способом.

Найняти людей для переміщення цих вантажів було недешево, але альтернативи не було.

Це має бути знайоме всім, хто працює у сфері програмного забезпечення.

Багато часу та інтелектуальної енергії витрачається на перенесення програмного забезпечення на різні системи та сервери.

doker

На рис показано, як можна заощадити час та гроші за допомогою Docker концепції.

Коли ми купуємо потужний сервер, що складається з безлічі процесорів і пам’яті, виникає потреба його ‘розпиляти’ на дрібніші сервера.

І потім кожен сервер повісити свій процес, сайт, сервіс тощо.

Тобто. створюється гіпервізор (основна операційна система) і в нього встановлюються гостьові операційні системи (віртуальні сервери).

Кожному віртуальному серверу виділяються обмежені ресурси пам’яті процесорам тощо. Це так само робить безпечним ситуацію злому віртуального сервера, коли страждає лише він.

Docker може використовуватися для заміни віртуальних машин у багатьох ситуаціях. Якщо вас хвилює лише програма, а не операційна система, Docker може замінити віртуальну машину, а ви можете залишити турботу про операційну систему комусь іншому.

Docker не тільки швидше, ніж віртуальна машина, призначена для запуску, він легший у переміщенні, і завдяки його багаторівневій файловій системі ви можете легше та швидше ділитися змінами з іншими. Він також міцно вкорінений у командному рядку та найвищою мірою придатний для написання сценаріїв.

Якщо ви хочете швидко поекспериментувати з програмним забезпеченням, не порушуючи існуюче налаштування і не проходячи через труднощі, пов’язані з підготовкою віртуальної машини, Docker може надати “пісочницю” за мілісекунди. Звільняючий ефект цього процесу важко зрозуміти, поки ви не відчуєте його на собі.

Докер включає 2 поняття - це образ і контейнер.

Образ - це зібраний проект з урахуванням операційної системи, що містить усе необхідне його роботи.

Контейнер – це запущений, працюючий образ. Таким чином, один раз зібраний образ може бути запущений в необмеженій кількості контейнерів.

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

Безперервна доставка

Це парадигма доставки програмного забезпечення, заснована на конвеєрі, який перебудовує систему при кожній зміні, а потім здійснює доставку у виробництво (або “наживо”) за допомогою автоматизованого (або частково автоматизованого) процесу.

Оскільки ви можете більш точно контролювати стан середовища складання, складання Docker більш відтворювані, ніж традиційні методи складання програмного забезпечення. Це робить реалізацію безперервної доставки набагато простіше.

Установка на Ubuntu

Ставимо необхідні бібліотеки.

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common

Копіюємо GPG ключ.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Додаємо репозиторій.

sudo add-apt-repository \

“deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable”

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

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

Ключові концепції та команди.

doker

Перш ніж запускати команди Docker, найкраще розібратися з поняттями образів, контейнерів та шарів. Коротко кажучи, контейнери запускають системи, визначені образами. Ці образи складаються з одного або декількох шарів (або наборів відмінностей) плюс деякі метадані Docker.

Основна функція Docker – створювати, відправляти та запускати програмне забезпечення у будь-якому місці, де є Docker.

Для кінцевого користувача Docker це програма з командним рядком, яку вони запускають.

docker build Зібрати образ Docker

docker run Запустити образ Docker як контейнер

docker commit Зберегти контейнер Docker як образ

docker tag Присвоїти тег образу Docker

Один із способів поглянути на образи та контейнери – це розглядати їх як програми та процеси. Так само процес може розглядатися як «додаток, що виконується», контейнер Docker може розглядатися як образ, що виконується Docker.

Якщо ви знайомі з принципами об’єктно-орієнтованого програмування, ще один спосіб поглянути на образи та контейнери – це розглядати образи як класи, а контейнери – як об’єкти.

Контейнери запускають один процес під час запуску. Коли процес завершується, контейнер зупиняється.

Наприклад, з одного образу можна запустити 3 контейнери:

  • django

  • mysql

  • nginx

Способи створення образів.

Їх є кілька.

  1. Запустити контейнер у командному рядку, вказавши його параметри у команді docker run. Потім можна перенести контейнер образ за допомогою docker commit.

Підійде якщо ви хочете перевірити, чи працює ваш просес установки.

  1. Виконати збірку з відомого базового образу, вказавши її в Dockerfile.

Dockerfile – це текстовий файл, який містить серію команд.

doker

Основні команди.

FROM : Визначає базовий образ.

COPY : Копіює файли з локальної папки в образ.

ADD :Схожа на COPY тільки розархівує у разі архіву.

RUN : Запускає команду всередині образу та зберігає всі зміни в образі, які вносить команда.

ENTRYPOINT [““, ““, …] : Конфігурує команду за замовчуванням всередині контейнера, якщо не вказано, то виконується за замовчуванням така команда /bin/sh -c .

CMD [““, …] : Визначення параметрів команди запуску, враховуючи, що за дефолтом /bin/sh -c, ми можемо до нього додати параметри через CMD.

WORKDIR

: Встановлює робочу директорію для наступних команд таких як RUN, CMD, ENTRYPOINT, COPY, та ADD.

Файл Dockerfile починається з базового образу за допомогою команди FROM. У цьому прикладі використовується образ Node.js, тому у вас є доступ до двійкових файлів Node.js. Офіційний образ Node.js називається node.

git вже встановлений у базовому образі, але це не стосується всіх образів.

WORKDIR - не тільки змінює директорію, але й визначає, в якому каталозі ви будете перебувати при запуску програми.

EXPOSE - повідомляє Docker, що контейнери із зібраного образу повинні прослуховувати цей порт.

Как видим Dockerfile – це проста послідовність обмеженого набору команд, що виконуються у строгому порядку.

Тут команда RUN впливає на файлову систему, перевіряючи та встановлюючи програми, а команди EXPOSE, CMD та WORKDIR – на метадані образи.

Складання образу.

doker

Після закінчення зборки нам видадуть остаточний ідентифікатор образу, готовий до присвоєння тега.

Successfully built 66c76cea05bb

Присвоїти тег можна командою

docker tag 66c76cea05bb mytag

Запуск контейнера з образу.

doker run -i -t -p 8000:8000 --name example1 mytag

-p - перенаправляє порт із контейнера (перший) на хост комп’ютера (другий)

Підкоманда docker diff показує, які файли торкнулися з моменту створення примірника образу як контейнера.

Іноді може виникнути помилка доступу (permisson denite) до сокету докеру. Тоді допомагає таке встановлення прав на сокет.

sudo chmod 666 /var/run/docker.sock

Слои Docker

Шари Docker допомагають подолати велику проблему, яка виникає, коли ви використовуєте контейнери в широкому масштабі.

Уявіть собі, що станеться, якщо ви запустите сотні або навіть тисячі програм, і кожній із них знадобиться копія файлів для зберігання в будь-якому місці.

Як ви можете уявити, дисковий простір закінчиться досить швидко!

doker

За промовчанням Docker внутрішньо використовує механізм копіювання під час запису, щоб зменшити обсяг потрібного дискового простору.

Стисло суть методу.

Ідея підходу copy-on-write полягає в тому, що при читанні області даних використовується спільна копія, у разі зміни даних створюється нова копія.

При створенні образу Doker створює шари файлової системи та їх використовує під час створення нових образів. Наприклад, якщо два образи використовують одну ОС Ubuntu, то вона не буде скопійована в обидва, а вони будуть використовувати один і той же шар, що містить цю операційну систему.

Архітектура Docker

doker

Виходячи з малюнка видно, що докер-образи в реєстрі ми можемо зберігати як на своєму сервері, так і на офіційному сайті Docker Hub або інших не офіційних.

Коли ми запускаємо контейнер, процес взаємодії з ним включає 2 сутності: клієнт Doker і демон Doker.

Щоразу, коли вводимо команду, ми її повідомляємо клієнту, той у свою чергу смикає демона по HTTP і повертає нам результат.

Демон – це сервер, який отримує запити та повертає відповіді від клієнта за протоколом HTTP.

У свою чергу, він відправлятиме запити до інших служб для надсилання та отримання образів, також використовуючи протокол HTTP.

Демон також відповідає за турботу про ваші образи і контейнери за лаштунками, тоді як клієнт виступає посередником між вами та інтерфейсом RESTful.

Демон Docker

Демон – це процес, який виконується у фоновому режимі режимі, а не під безпосереднім контролем користувача. Сервер – процес, який приймає запити від клієнта та відповідає.

Демони часто також є серверами, які приймають запити від клієнтів для виконання дій їм.

Команда docker – це клієнт, а демон Docker виступає як сервер, що виконує обробку ваших контейнерів та образів Docker.

Демон Docker це центр ваших взаємодій з Docker, і тому він є найкращим місцем, де ви можете почати розуміти всі відповідні елементи.

Він контролює доступ до Docker на вашому комп’ютері, керує станом контейнерів та образів, а також взаємодіє із зовнішнім світом.

Робимо доступним демон із вне.

Хоча за замовчуванням ваш демон Docker доступний тільки на вашому хості, мо- можуть бути причини, щоб дозволити іншим доступ до нього.

Хоча цей метод може бути потужним та корисним, він вважається небезпечним. Сокет Docker може бути використаний будь-ким, хто має доступ (включаючи контейнери з підключеним сокетом) Docker) для отримання привілеїв користувача root.

РІШЕННЯ - запустити демон Docker з відкритою TCP адресою.

Зупинка демона.

sudo service docker stop

Перевірити чи запущений демон докера можна так:

ps -ef | grep -E 'docker(d| -d| daemon)\b' | grep -v grep

doker

Запускаємо на сокеті.

sudo docker daemon -H tcp://0.0.0.0:2375

Ви можете підключитися зовні за допомогою наступної команди:

$ docker -H tcp://<your host's ip>:2375 <subcommand>

Запуск контейнерів як демонів

ПРОБЛЕМА

Ви хочете запустити контейнер Docker у фоновому режимі як службу.

РІШЕННЯ

Використовуйте прапорець -d у команді docker run та пов’язані прапори управління контейнерами визначення характеристик службы.

$ docker run -d -i -p 1234:1234 --name daemon ubuntu:14.04 nc -l 1234

-d - запустити контейнер як демон.

-i – дає цьому контейнеру можливість взаємодіяти з вашим сеансом Telnet.

-p - публікуємо порт 1234 із контейнера на хост

–name - зачепимо контейнеру ім’я. Давати імена контейнерам дуже корисно для присвоєння імен хостів, до яких ви можете звернутися. пізніше

nc -l 1234 - запускаємо простий ехосервер, що прослуховує, на порту 1234 за допомогою netcat (nc).

У простому випадку NetCat викликається як:

nc host port

Це призводить до створення TCP-підключення із зазначеними реквізитами та замиканням стандартного введення на мережевий висновок і навпаки, стандартного виведення на мережне введення. Така функціональність нагадує команду cat, що зумовило вибір імені netcat. У разі неможливості підключення програма виводить повідомлення про помилку на stderr.

Тепер можна підключитися до нього та надсилати повідомлення через Telnet. Ви побачите, що контейнер отримав повідомлення за допомогою команди docker logs, як показано у наступному лістингу.

doker

Зупинка контейнера.

$ docker stop blog1

Видалення контейнера

$ docker rm blog1

Список всіх запущених контейнерів.

docker ps

Стратегія перезапуску демона.

Прапор docker run - restart дозволяє застосовувати набір правил, яким необхідно дотримуватися (так звана стратегія повторного запуску), коли контейнер завершується

no - Не перезапускати при виході контейнера

always - Завжди перезапускати при виході контейнера

unless-stopped - Завжди перезавантажувати, але пам’ятати про явну зупинку

on-failure[:max-retry] - Перезапускати лише у разі збою

$ docker run -d --restart=always ubuntu echo done

Ця команда запускає контейнер як демон (-d) і завжди перезапускає його після завершення (–restart = always). Вона видає просту команду echo, яка швидко завершується, виходячи із контейнера.

Це можна перевірити командою

doker ps

doker

Важливо, що Docker повторно використовує ідентифікатор контей- нера. Він не змінюється під час перезапуску, і для цього виклику Docker завжди буде лише один запис у таблиці ps.

docker run -d --restart=on-failure:10 ubuntu /bin/false

Ця команда запускає контейнер як демон (-d) і встановлює обмеження на кількість спроб перезапуску (–restart = on-failure: 10), виходячи, якщо вона перевищена. Вона запускає просту команду (/bin/false), яка швидко завершується і неодмінно зазнає невдачі.

Переміщення Docker в інший розділ

ПРОБЛЕМА

Ви хочете перейти туди, де Docker зберігає свої дані.

РІШЕННЯ

Зупиніть та запустіть демон Docker, вказавши нове місце за допомогою прапора -g.

$ dockerd -g /home/dockeruser/mydocker

Також можна відредагувати файл /lib/systemd/system/docker.service та додати цей параметр.

Дозвіл зв’язку між контейнерами

ПРОБЛЕМА

Ви хочете дозволити зв’язок між контейнерами для внутрішніх цілей.

РІШЕННЯ

Використовуйте власні мережі, щоб контейнери могли взаємодіяти один з одним.

Створення мережі.

$ docker network create my_network

Підключення контейнера до мережі.

$ docker network connect my_network blog1

Запуск із явною вказівкою мережі.

$ docker run -it --network my_network ubuntu:16.04 bash

Встановити контейнер з грою під телеграм.

Клонуємо репозиторій.

git clone https://github.com/zdimon/telegram-card-bj
cd telegram-card-bj

Робимо Dockerfile

FROM python:3 as telegramm-card
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN python3 -m pip install --upgrade pip
RUN pip install -r requirements.txt
CMD python3 start.py

Білдим образ

docker build .

doker

Надаємо йому тег.

docker tag c8ed7da14734 tb-container

Запускаємо контейнер.

doker run -i -t -d  --name tb tb-container