Базовые знания Linux админа

 

Примечание

В данной серии не будет теории и прочего

Это абсолютный базис-гайд по установке ОС и базовым навыкам в терминале

В конце будет рассмотрено несколько современных технологий в простых реализациях

После прохождения гайда у вас будет машина и несколько популярных сервисов

Все. Дальше - сами, книги, видео, стажировка

Этот гайд - выжимка на многолетние накопления вопросов на канале и сайте

Гайд будет доступен на моем сайте:

http://snakeproject.ru

Видео будут доступны на моем канале YouTube:

https://www.youtube.com/channel/UCR6j95DKI80MFXIw2iJ3f1w

 

План:

 

8 часть — docker

 

О контейнеризации

 

По сути технология Docker предоставляет возможность превратить ваши сервисы в изолированные контейнеры

 

Само понятие контейнер можно рассматривать условно как "виртуализированный сервис"

 

Изолированность сервисов в контейнерах дает нам плюс к безопасности ив случае падения сервиса (недостаток памяти например) не затронет ресурсы соседних контейнеров

 

 

Отличие контейнера Docker от классической виртуальной машины:

 

Docker контейнер - совокупность программного кода приложения и библиотек в изолированном пространстве

 

Виртуальная машина - совокупность программного кода приложения, библиотек + операционная система

 

 

Контейнеры создаются на базе образов

 

Образы в Docker создаются из Dockerfile или берутся готовые из репозиториев, локальных или общедоступных типа dockerhub

Ниже мы видим:

Часть "Client" - команды, которые докеру отдает администратор

Часть "Docker_host" - сервис докера (включает контейнеры и образы)

Часть "Registry" - репозитории для докера (локальные или общедоступные)

 

 

Основные понятия в Docker:

 

Docker Engine - среда выполнения, управляет образами и контейнерами.

Docker Daemon - выполняет команды, отданные клиентом в docker. (сборка образа, запуск контейнера)

Dockerfile - файл с набором инструкций, применяется для сборки образов.

Docker Image - образ - файл, на основе которого создаются контейнеры. Состоит из множества слоев.

Docker Container - сущность, состоящая из кода приложения и все его зависимостей. Создается на основе образов.

Docker Volumes - пробрасываемые файловые носители для сохранения данных. Например сохранения файлов или базы данных, которые создаются или меняются в контейнерах.

 

Установка Docker

 

Обновите индекс пакетов, установите зависимости, необходимые для добавления нового HTTPS-репозитория:

sudo apt update

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

 

Импортируйте GPG ключ хранилища docker:

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"

 

Обновим информацию и установим docker:

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

 

Автозагрузка, включение, проверка статуса:

sudo systemctl enable docker

sudo systemctl start docker

sudo systemctl status docker

 

 

Выполнение Docker команд без прав root

 

По умолчанию вам понадобятся права root для ввода команд Docker

 

Чтоб выполнять команды Docker без sudo, добавьте своего пользователя в группу Docker:

sudo usermod -aG docker $USER

 

Где:

$USER - переменная среды, которая содержит имя текущего пользователя

Выйдите из ОС и войдите снова, чтоб обновить членство в группе

 

Базовые навыки работы с Docker

 

Команда docker без параметров выдаст список доступных команд:

docker

 

Справка или помощь:

docker --help

docker команда_докера --help

 

Проверим версию docker:

docker version

 

Выводим конфиг docker:

docker info

 

Мы увидим в выводе информацию по сервису в т.ч. и счетчик контейнеров

 

Для поиска образов используется команда docker search:

sudo docker search hello-world

 

Скачаем образ и запустим контейнер на его основе:

docker run hello-world

 

Запустим контейнер с последующим удалением после остановки:

docker run --rm hello-world

или:

docker container run --rm hello-world

 

При запуске контейнера (docker run) если образа нет в локальном репозитории, он будет автоматически скачан

 

Контейнер на примере веб-сервера nginx

 

Запустим контейнер с nginx (используйте -p или --publish) с пробросом порта 80:

docker container run -p 80:80 nginx

 

Проверяем работу контейнера(откройте вторую ssh сессию):

curl 127.0.0.1:80

 

Завершим работу контейнера - CTRL + C

 

Что произошло в процессе запуска контейнера?

Скачался образ Nginx из Docker Hub

Запустился контейнер на основе скачанного образа Nginx

Пробросился 80 порт локальной машины на 80 порт контейнера

Обратите внимание, контейнер запускался в интерактивном режиме

 

Запустить контейнер в фоновом режиме:

docker container run -p 80:80 -d nginx

 

Посмотреть на него можно с помощью команд:

docker ps

или:

docker container ls

 

Запустим контейнер в фоне с определенным именем "web_server":

docker container run --name web_server -d nginx

 

Остановить контейнер "web_server" и стартовать:

docker container stop web_server

docker container start web_server

 

 

Данные контейнера "web_server" смотреть командой:

docker container inspect web_server

 

Процессы контейнера "web_server" смотреть командой:

docker container top web_server

 

Удалить контейнер "web_server" (даже запущенный "f" и его volume "v"):

docker container rm -fv web_server

 

 

Создание контейнера без запуска имеет следующий синтаксис:

docker create <options> <image name:tag>

или:

docker container create <options> <image name:tag>

 

Dockerfile - файл инструкций, которые выполняются с верху в низ

 

С помощью него создаются образы

 

В файле есть синтаксис, инструкция - значение

 

Рассмотрим самые распространенные:

# - комментарий

FROM - обязательная, указывается базовый образ

MAINTAINER - контакт разработчика данного образа

RUN - что будем делать, команды, каждый RUN по сути создает свой слой

CMD - команда в запущенном контейнере (возможно переопределить при старте контейнера)

ENTRYPOINT - команда в запущенном контейнере, аналогична CMD(невозможно переопределить при старте контейнера)

EXPOSE - трансляция указанных портов

ENV - переменные среды контейнера

COPY - копирование локальных файлов в контейнер

ADD - добавление файлов в контейнер, допускает указание url

VOLUME - указание пробрасываемого пути файловой системы для сохранения результатов работы в ней

USER - указание учетной записи, от которой будут работать следующие команды

WORKDIR - указание рабочей директории, в которой будут работать следующие команды

LABEL - метаинформация образа

 

Создание образа из Dockerfile (. - указание текущего каталога с Dockerfile):

docker image build . -t <image name:tag>

 

Перейдем в тестовую папку для эксперимента:

mkdir test && cd test

 

Пример Dockerfile:

FROM nginx:latest

LABEL version="latest_local_0.1" maintainer="kozlovma"

RUN apt-get update && apt-get install curl -y

# команда создаст символическую ссылку, будет выводиться access.log на консоль

RUN ln -sf /dev/stdout /var/log/nginx/access.log

ENV WORKDIR /usr/share/nginx/html

WORKDIR ${WORKDIR}

COPY ./index.html ./index.html

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

 

Тестовый файл index.html:

echo '<html><head><title>Hello</title></head><body><h2>Hello!</h2></body></html>' > index.html

 

Скачиваем образ nginx для Dockerfile:

docker image pull nginx

 

Создаем образ на основе Dockerfile:

docker build . -t nginx:latest_local_0.1

 

Стартуем и проверяем:

docker run -d -p 80:80 nginx:latest_local_0.1

curl 127.0.0.1:80

 

На этом вводный курс в технологию окончен, для самостоятельного изучения я делал серию статей и видео на канале по изучению Docker

http://snakeproject.ru/python/touch_docker.html

 

Удачи в самостоятельном плавании!