182 0

Docker в помощь Системному Администратору

Docker – программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы; позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, а также предоставляет среду по управлению контейнерами.

Docker Engine – Движок Docker
Docker Image – Не запущенный виртуальный образ
Docker Container – Запущенный виртуальный образ
Dockerfile – Файл с набором инструкций для Docker Image
hub.docker.com – репозиторий образов для docker

Установка

Для Docker необходима 64-битная версия Linux или Windows
apt-get update

Установка доп. пакетов

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

Добавляем ключ

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

Добавляем stable репозиторий docker

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
apt-get update

Установка самого docker

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

Проверка службы Docker

systemctl status docker

Все команды выполняются из под админа, либо добавить текущего пользователся в группу docker:

 sudo usermod -aG docker $USER
service docker restart # Перезапустим сервис, чтобы применилось

Просмотр информации

docker -v                # Версия Docker
docker-compose --version # Проверка версии docker-compose
docker images # Показать какие есть образы (TAG - можно менять под себя, IMAGE ID - можно использовать как и REPOSITORY)
docker ps    # Показать запущенные контейнеры (образы)
docker ps -a # Показать контейнеры которые запускались хотябы раз
docker diff имя_контейнера # Cписок изменённых файлов в работающем контейнере
docker logs имя_контейнера # Cмотреть список всех событий внутри контейнера
docker inspect имя_контейнера # Подробная информация по контейнеру
docker inspect имя_контейнера | grep IPAddress # Фильтрруем информацию

Ищем, запускаем, останавливаем и удаляем образ

Запустить образ hello-world, если его нет, скачает в интернете и запустит:

docker run hello-world     # По сути это команда для тестирования коректности установки docker
docker start имяконтейнера # Запустить контейнер, который ранее запускался и виден в docker ps -a
docker stop имяконтейнера  # Остановить контейнер
docker run -it ubuntu bash   # Запустить образ Ubuntu и зайти внутырь контейнера
docker run -h имяхоста -it ubuntu bash # Инициализируем новый контейнер (-h - задать имя хоста)
docker run --name имяконтейнера -it ubuntu bash # Инициализируем новый контейнер со своим именем
exit        # Выход из контейнера
docker search tomcat # Искать образы с "tomcat" в описании
docker pull tomcat   # Скачать образ tomcat
docker run -it -p 1234:8080 tomcat # Запустить образ tomcat (-it - интерактивно, будем видеть как работает и командная строка не вернётся, -p перенаправление портов c 8080 на 1234)
docker run -d -p 4321:8080 tomcat  # Так можно запускать несколько контейнеров на разных портах с одного образа(- d запустить как демон, в фоновом режиме)

Для проверки заходим по ваш_ip:1234

docker run -d -p 5555:80 nginx # Скачать образ nginx и запустить на порту 5555
docker stop ContainerID     # Остановить запущенный контейнер
docker run -v /data ubunu   # Монтировать том при запуске контейнера, /data с локальной машины примантируется к контейнеру

Если активно использовать Docker, место может быстро закончится, поэтому следует обращать внимание сколько занимают ваши образы и переодически удалять не используемые.

docker rmi IMAGE_ID     # Удалить образ с локальной машины, если он запущен не даст, сначало нужно удалить контейнер (-f принудительно - для особо тяжёлых случаев)
docker rm COUNTAINER_ID  # Удалить контейнер
docker ps -aq -f status=exited    # Показать имена всех остановленных контейнеров
docker rm -v $(docker ps -aq -f status=exited) # Удалить все остановленные контейнеры

Dockerfile

На основе Dockerfile будет создаваться образ, с нужными нам файлами и параметрами. Коментарии всегда с новой строки.

mkdir dockerf            # Создадим директорию для Dockerfile
nano dockerf/Dockerfile  # Создадим Dockerfile (имя файла менять нельзя)
docker build -t имя_образа:тег dockerf/ # Создадим образ по докерфайлу, указываем директорию к файлу, а не сам файл (тег - будет виден в docker images)
docker run -d -p 7777:80 имя_образа:тег # Создадим контейнер (по 7777 порту)
docker ps                # Проверим запустился ли контейнер
curl -I 127.0.0.1:7777   # Проверим отвечает ли веб-сервер (127.0.0.1 если docker на локальной машине)
localhost:7777        # Аналогично

Пример Dockerfile

#-----------------------------------------------------------------------
# Ubuntu, Apache
#-----------------------------------------------------------------------
# Образ который используем ОС:версия
FROM ubuntu:16.04
# Информация для связи с автором образа, пишется после FROM
MAINTAINER  Vasia email@gmail.com
# RUN команды выполняемые внутри образа, -y даст подтверждение на зарос
RUN apt-get -y update
# Установить Apache2
RUN apt-get -y install apache2
# Создать файл index.html со строкой Hello World
RUN echo 'Hello World' > /var/www/html/index.html
# Запустить сервер Apache2 как демон
CMD ["/usr/sbin/apache2ctl", "-D","FOREGROUND"]
# Открыть 80 порт
EXPOSE 80

Пример другого Dockerfile

#-----------------------------------------------------------------------
#  Ubuntu, Apache
#-----------------------------------------------------------------------
 FROM ubuntu:16.04
# Apache ENVs
 ENV APACHE_RUN_USER www-data
 ENV APACHE_RUN_GROUP www-data
 ENV APACHE_LOCK_DIR /var/lock/apache2
 ENV APACHE_LOG_DIR /var/log/apache2
 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid
 ENV APACHE_SERVER_NAME localhost
# Install services, packages and do cleanup
 RUN apt-get update \
 && apt-get install -y \
     apache2 \
 && rm -rf /var/lib/apt/lists/*
# Copy files
 COPY apache-conf /etc/apache2/apache2.conf
# Expose Apache
 EXPOSE 80
# Launch Apache
 CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"]

Файл apache-conf ложим рядом с Dockerfile и при создании образа он подтянет его.

Копирование, редактирование, сохранение контейнеров

docker tag имя_вашего_образа:тег имя_другого_образа:тег # Сделать копию образа
docker exec -it COUNTAINER_ID /bin/bash # Зайти на консоль контейнера, для прямого редактирования (COUNTAINER_ID смотрим в docker ps)
docker commit COUNTAINER_ID имявашегообраза:тег  # Сохранить после редактирования рабочий контейнер в образ

Создание и сохранение образов

Сохранить на dockerhub

Регистрируемся на https://hub.docker.com/

docker commit имя_контейнера имя_пользователя/имя_образа # Сделать образ из контейнера (имяпользователя от dockerhub, не имеет щначения работает он или остановлен)
docker push имя_пользователя/имя_образа:тег # Добавление образа на dockerhub (тег не обязателен но будет зорошим тоном указать например :v1)
docker run имя_пользователя/имя_образа имя_приложения # Запуск образа

После этого кто угодно может скачивать и запускать ваш образ.

Сохранить в локальный файл

docker save image:tag > arch_name.tar # Сохранить в архив
docker load -i arch_name.tar  # Загрузить с архива

Установка соединения между 2-мя контейнерами

docker run --name Имя_контейнера -e MYSQL_ROOT_PASSWORD=Пароль -d mariadb
docker run --link Имя_контейнера_БД:db -p 8080:8080 adminer # Привязываем adminer к mariadb (--link - отвечает за связь контейнеров)

docker-compose

docker-compose позволяет настроить и запустить несколько контейнеров одной командой. Имеет одно из расширений yml или yaml.
docker-compose.yaml – создаётся рядом с dockerfile.

Установка docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Добавление прав на исполнение:
sudo chmod +x /usr/local/bin/docker-compose

Управление docker-compose

docker-compose up # Запуск Docker-compose, осуществляется из дериктории с файлом
docker-compose up -d # Запуск Docker-compose в фоновом режиме
docker-compose down  # Остановка приложения Docker-compose
docker-compose ps    # Посмотреть контейнеры запущенные Docker-compose
docker-compose stop web  # Остановить какой-нибудь компонент-контейнер не удаляя его.
docker-compose start web # Запустить какой-нибудь компонент-контейнер

Пример файла

#-----------------------------------------------------------------------
# Use root/example as user/password credentials
#-----------------------------------------------------------------------
# Версия файла
 version: '3.1'
# Сервисы и контейнеры которые будут запущены
 services:
 db:
     image: mariadb
     # Автозапуск для контейнеров (no - никогдастоит по умолчанию, on-failure - после крит. сбоя, always - всегда)
     restart: always
     # Определение значений переменных среды в контейнере
     environment:
       MYSQL_ROOT_PASSWORD: example
 adminer:
     image: adminer
     restart: always
     ports:
       - 8080:8080

Совместное использование dockerfile и docker-compose.yml

Так с помощью Dockerfile мы сможем вносить изменения в создаваемые контейнеры из образов.
Пример файла

#-----------------------------------------------------------------------
# Use root/example as user/password credentials
#-----------------------------------------------------------------------
# Версия файла, зависит от версии docker
 version: '3.1'
# Сервисы и контейнеры которые будут запущены
 services:
 db:
    # Указываем каталог с dockerfile для db
     build: ./db
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: example
     # Монтируем каталог хоста /datadir в файловую систему контейнера, так БД останется после удаления контейнера
     volumes:
         - /datadir:/var/lib/mysql
 adminer:
    # Указываем каталог с dockerfile для adminer
     build: ./adminer
     restart: always
     ports:
       - 8080:8080

Уменьшение размеров образов

docker history имя_образа # Смотреть весь набор уровней формирующих образ

Файлы нужно чистить на том же уровне где они и создаются это поможет уменьшить размер образов. Чтобы удалить файлы на том же уровне нужно инициировать их удаление в той же команде.
Пример:

 RUN apt update \
&& apt install -y cowsay \
&& ln -s /usr/games/cowsay /usr/bin/cowsay \
&& rm -rf /var/lib/apt/lists/*

В последней строчке инициировано удаление “apt update” файлов в одной команде, одном уровне.

Размеры ОС которые можно брать за основу:
alpine 5.53MB
debian 101MB
ubuntu 102MB

Tagged with: ,

RELATED ARTICLES

LEAVE YOUR COMMENT

Your email address will not be published. Required fields are marked *




Скоро останутся лишь две группы работников: те, кто контролирует компьютеры, и те, кого контролируют компьютеры. Постарайтесь попасть в первую.

technicscoffee.com

Если вас как и меня интересуют: Linux, фантастика, технологии, игры и фильмы данных тематик, добро пожаловать на мой более развлекательный ресурс!

Категории