Базовые знания Linux админа
Примечание
В данной серии не будет теории и прочего
Это абсолютный базис-гайд по установке ОС и базовым навыкам в терминале
В конце будет рассмотрено несколько современных технологий в простых реализациях
После прохождения гайда у вас будет машина и несколько популярных сервисов
Все. Дальше - сами, книги, видео, стажировка
Этот гайд - выжимка на многолетние накопления вопросов на канале и сайте
Гайд будет доступен на моем сайте:
Видео будут доступны на моем канале 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
Удачи в самостоятельном плавании!