Заметки Debian / Ubuntu


21.06.2020

Install Docker Engine on Ubuntu 20.04

Установка docker и docker-compose на Ubuntu 20.04:

docker

https://docs.docker.com/engine/install/ubuntu/

***

Docker Hub

https://hub.docker.com/

***

docker-compose

https://docs.docker.com/compose/install/

***

Команды

https://github.com/adv4000/docker

***

И так к делу:

Обновляем систему:

sudo apt update

sudo apt upgrade

 

Переходим на ресурс https://docs.docker.com/engine/install/ubuntu/ и следуем инструкции:

//  Удаление старой версии:

sudo apt remove docker docker-engine docker.io containerd runc

После чего на всякий случай заглянем в директорию “/var/lib/” и убедимся что нет в ней директории “docker”.

// Установка вспомогательных пакетов:

$ 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 apt-key fingerprint 0EBFCD88

// Добавляем stable X86_64/amd64 репозиторий:

$ sudo add-apt-repository \

   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \

   $(lsb_release -cs) \

   stable"

// Обновляем индексы системы:

sudo apt update

// Устанавливаем основные пакеты движка docker:

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

 

//проверим статус работы демона докера:

sudo systemctl status docker

 

// Проверка установки путём запуска пробного контейнера:

sudo docker run hello-world

// Результат:

 

Что мы видим на скриншоте: 

Сначала сообщение что image “hello-world:latest” локально не найден. Далее докер потянул его из интернета. Далее выполнил, то есть вышло сообщение Hello from Docker! Далее ниже пояснения о том что Клиент докера обратился к службе (демону) докера. Демон докера скачал образ (image) из докерхаба. Демон докера создал новый контейнер из этого скачанного образа и запустил этот контейнер. Демон докера перенаправил вывод на клиента докера, который и вывел результат в терминал.

Далее написано что можно проделать тоже самое но уже с образом Ubuntu. А также советую заглянуть на https://docs.docker.com/get-started/ для рассмтотрения новых возможностей докера.

Также на сайте сообщается что после установки будет создана группа “docker”. Но в эту группу не будут добавлены пользователи поэтому для запуска команд докера нужно использовать “sudo”. То есть если добавить пользователя в группу “docker” он сможет выполнять от “sudo” - тут надо быть внимательней.

// Если не хотим в командах всё время писать “sudo” можно добавить текущего пользователя в группу “docker”:

sudo usermod -aG docker ПОЛЬЗОВАТЕЛЬ

//перезапуск докера:

sudo service docker restart

 

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

переходим на https://docs.docker.com/compose/install/ 

// копируем и вставляем в терминал команду:

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

// Даём права на исполнение бинарнику запуска:

sudo chmod +x /usr/local/bin/docker-compose

// Смотрим версию:

docker-compose --version

// Docker-compose установлен. Этот пакет позволит создавать контейнеры основанные на файле-инструкции “docker-compose.yaml”. Или проще говоря мы теперь можем создать файл в котором сделаем описание того: из каких образов будет контейнер, с какими портами внутри и снаружи контейнера и т.д.

Для этого нужно создать каталог - в нём создать файл “docker-compose.yaml” и в этом же каталоге запустить команду:

// чтобы запустить все контейнеры:

docker-compose up

// чтобы запустить все контейнеры в фоне:

docker-compose up -d

// чтобы остановить все контейнеры:

docker-compose down

***

К docker-compose мы вернёмся позже, далее рассмотрим команды докера:

//Вывести список всех контейнеров:

sudo docker ps -a

 

//Вывести список всех контейнеров кроме остановленных:

sudo docker ps

 

//Запустить контейнер из списка по имени (поле Names из команды ps -a):

sudo docker start ИМЯКОНТЕЙНЕРА

 

//Запуск контейнера с заданием имени хоста:

sudo docker run -h ИМЯХОСТА -it ИМЯКОНТЕЙНЕРА

 

//Запуск контейнера с присвоением своего имени, на примере запуска ubuntu сразу в её внутренний терминал:

sudo docker run --name СВОЁИМЯ -it ubuntu bash

 

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

sudo docker run -d ИМЯОБРАЗА 

 

//Остановить контейнер из списка по имени (поле Names из команды ps -a):

sudo docker stop ИМЯКОНТЕЙНЕРА

 

//Список изменений в контейнере:

sudo docker diff ИМЯКОНТЕЙНЕРА

 

//Данные о контейнере:

sudo docker inspect ИМЯКОНТЕЙНЕРА

 

//Список событий внутри контейнера:

sudo docker logs ИМЯКОНТЕЙНЕРА

 

//Удалить контейнер (имя просмотреть можно через sudo docker ps -a):

sudo docker rm ИМЯКОНТЕЙНЕРА

 

//Список всех Остановленных контейнеров:

sudo docker ps -aq -f status=exited

Тут собственно обратите внимание что в основе эта та же команда по выводу всех контейнеров, но добавлен ключ “-q” - это выборка по ID.

 

//Удалить все Остановленные контейнера:

sudo docker rm -v $(sudo docker ps -aq -f status=exited)

 

//Удалить все контейнеры и образы:

sudo su

sudo docker rm -f $(docker ps -aq)

sudo docker rmi -f $(docker images -q)

exit

 

//Пример запуска контейнера с “apache” с пробросом портов:

Для начала идём на https://hub.docker.com/

Сверху в строке поиска ищем образ apache. Выбираем образ - я выбрал “httpd”. Далее копируем Docker Pull Command - в моём случае: “docker pull httpd”.

 

Есть вариант ещё интересней. Можно по названию образа сделать поиск.

sudo docker search httpd

В выводе смотрим на столбец “Name” - и выбираем какой больше нравиться, заодно обращаем на столбец “Stars” - это рейтинг. Затем мы можем просто скачать нужный образ:

sudo docker pull httpd

Теперь когда будем давать команду run - докер найдёт его локально.

Даём команду в которой, с помощью ключа “-p”, пробросим порт 8080. Тут нужно будет указать 8080:80 - где справа порт 80 внутри контейнера а слева порт 8080 по которому мы будем стучаться извне до сервиса который предоставляет контейнер. Ключ “-d” это запуск в фоне:

sudo docker run -d -p 8080:80 httpd

 

//В результате в терминале увидим

 

//И набрав адрес с портом в браузере увидим:

И кстати, мы можем параллельно стартануть этот же контейнер но на другом порте:

sudo docker run -d -p 8081:80 httpd

И причём ещё раз повторяю - они будут работать параллельно не мешая друг другу.

 

//Список всех образов в системе:

sudo docker images

 

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

// Создаём образцовый “cowsay”:

Для начала запускаем контейнер с Ubuntu:

sudo docker run -it --name megaapp --hostname megaapp ubuntu bash

обратите внимание на флаги: 

“-it” - означает что контейнер сразу переходит в интерактивный режим;

“--name” - это мы сразу задаём имя контейнера;

“--hostname” -  задаём свой хостнэйм;

“megaapp” - это я придумал имя контейнера и оно же название хоста;

“bash” - в конце - чтобы мы сразу попали в терминал запущенной ubuntu.

//И причём Ubuntu самая свежая:

// Делаем в новой ubuntu обновление индексов:

apt update

// Ставим пакет “cowsay”:

apt install cowsay -y

// Отлично - пакет установлен - проверяем:

/usr/games/cowsay "MOOOHOOO"

// Причём что интересно - контейнер видит весь раздел диска хостовой машины:

 

Но у неё “/dev/sda2” смонтирован почему то в “/etc/hosts”. Если запустить “df -h” на самом хосте то диск как положено смонтирован в корень:

 

 

Выходим из терминала контейнера командой “exit”. И тут кстати сразу обратите внимание что как только мы вышли из сеанса - контейнер остановился. Это потому что контейнер запускали в интерактивном режиме “-it”, если бы запускали в фоне “-d” то после завершения контейнер бы всё ещё был активен.

 

// Теперь из нашего модифицированного контейнера сделаем свой образ:

В терминале хостовой машины набираем команду:

sudo docker commit megaapp hashmaster/megacow

// обратите внимание на: 

“megaapp” - это имя контейнера;

“hashmaster” - ID учётки в докерхабе;

“hashmaster/megacow” - название образа.

 

// Далее набрав команду sudo docker images мы видим в списке наш образ “hashmaster/megacow”:

Немного тут задержимся - если обнаружили образа которые не нужны, их можно удалить командой “rmi”. Но это сработает только если нет существующих контейнеров, которые были созданы из этих образов. Напоминаю что это можно проверить командой “sudo docker ps -a”:

sudo docker rmi apacheignite/ignite hello-world

Таким образом мы удалили образа “apacheignite/ignite” и “hello-world”. Кстати вместо имени образа можно использовать “IMAGE ID”, который мы можем увидеть в выводе команды “docker images”.

 

// Теперь для запуска коровы можно просто запустить контейнер с командой “/usr/games/cowsay "MOOHOOAGAIN"”:

sudo docker run hashmaster/megacow /usr/games/cowsay "MOOHOOAGAIN"

Корова промычит и контейнер остановиться. 

 

// Если бы захотели чтобы контейнер сам себя удалил после остановки, то в параемтерах запуска нужно указать ключ “--rm”:

sudo docker run -it --rm --name megaapp --hostname megaapp ubuntu bash

 

// Создадим образ с помощью докер файла.

Для начала удалим все контейнеры и образа:

sudo su

docker rm -f $(docker ps -aq)

docker rmi -f $(docker images -q)

exit

sudo service docker restart

Если заметили тут пришлось перейти на root, с sudo прав не хватило.

Далее проверим что ни контейнеров ни образов нет:

sudo docker ps -a

sudo docker images

//Далее:

Создаём директорию:

mkdir mrstudio22

Переходим в неё:

cd mrstudio22

Создадим файл “Dockerfile” - именно так с большой буквы “D”:

nano Dockerfile

Содержимое файла:

 

#---------------------------------------------------------------------------

# Dockefile to build Docker Image of Apache WebServer running on Ubuntu

#

# Made by mrstudio22.ru  19-June-2020

#---------------------------------------------------------------------------

FROM ubuntu:18.04

RUN apt-get -y update

RUN apt-get -y install apache2

RUN echo 'Hello World from Docker!' > /var/www/html/index.html

CMD ["/usr/sbin/apache2ctl", "-D","FOREGROUND"]

EXPOSE 80

 

// Сохраняем изменения - Далее пишем команду создания образа основанного на докерфайле:

sudo docker build -t hello:v1 . 

// обратите внимание на: 

“-t hello:v1” - это имя образа c тэгом, собственно ключом “-t” мы объявляем тэг;

“.” - точка в конце - значит собрать из докерфайла в текущем каталоге.

 

Образ мы создали - теперь нужно создать и запустить в фоне из него контейнер:

 

sudo docker run -d -p 8082:80 hello:v1

 

// обратите внимание на: 

“-d” - Запуск в фоне (как демон);

“-p” - перенаправляем порт хостовой машины 8082 на порт контейнера 80;

 

// Проверяем в браузере (192.168.***.***:8082) - Отлично всё работает.

Мы можем зайти в терминал на эту запущенную машину в контейнере. Но так как мы не задавали контейнеру своё имя при запуске (ключ --name), придётся сначала посмотреть CONTAINER ID:

sudo docker ps -a

sudo docker exec -it 25faec335fef /bin/bash

Это важный момент - чтобы нырнуть в терминал работающего в фоне контейнера используем “exec”.

И вот мы зашли в терминал сразу из под “root”:

 

Делаем “exit” из терминала контейнера и давайте и из этого контейнера сделаем другой образ (hello:v2):

В терминале хостовой машины набираем команду (вместо имени контейнера используем ID):

sudo docker commit 25faec335fef hello:v2

 

 

// Рассмотрим ситуацию когда нам нужно примонтировать в контейнер каталог из хостовой машины, сделать это можно с помощью ключа “-v”. При этом путь до хостового каталога должен быть абсолютный. 

В данном примере мы запустим образ ubuntu из докерхаба и при этом мы смонтируем хостовый каталог “/home/ubuntu/data”, в котором лежит файл “test.txt” - в контейнерный каталог “/var/data”. После чего запустится bash сеанс где мы сразу и проверим монтирование:  

sudo docker run -it -v /home/ubuntu/data:/var/data ubuntu bash

 

А теперь тоже самое только немного дополним команду:

sudo docker run -it --rm --name astro --hostname astronaut -e TZ=Asia/Barnaul -v /home/ubuntu/data:/var/data ubuntu bash

// Где:

-it   -   запуск интерактивно - то есть когда выйдем из сеанса, контейнер остановится;

--rm   -  если контейнер остановился то удалить его;

--name  -  задаем имя контейнера “astro”; 

--hostname  -  задаем имя хоста “astronaut”; 

-e TZ=Asia/Barnaul   -  задаем переменную TZ (временная зона) с помощью ключа “-e”;

-v  -  монтируем каталог хоста;

bash  - сразу ныряем в терминал из под “root”.

Обратите внимание - из-за того что в образе ubuntu только то что нужно - не сработали команды “cat /etc/timezone” и “timedatectl”.

 

Мы научились монтировать каталоги внутрь контейнеров - это уже много!

 

// А вот теперь пришло время залить готовый образ в наш репозиторий докерхаба:

Регистрируемся на докерхабе - https://hub.docker.com/ 

Повторим создание контейнера с приложением говорящей коровы:

sudo docker run -it --name megaapp --hostname megaapp ubuntu bash

Далее в терминале контейнера:

apt update 

apt install cowsay -y

// Делаем символьную ссылку на корову, чтобы не писать полный путь постоянно:

ln -s /usr/games/cowsay /usr/bin/cowsay

// проверяем:

cowsay "YEEHOO I AM GOING TO DOCKERHUB"

Отлично мы модифицировали образцовый контейнер ubuntu. Теперь сделаем из него образ:

sudo docker commit megaapp hashmaster/megacow

// Образ создан теперь “запушим” его на докерхаб.

Сначала естественно нужно залогиниться на докерхабе:

sudo docker login

// Далее пушим образ:

sudo docker push hashmaster/megacow

// Отлично сработало:

 

Проверяем. Сначала удалим все контейнеры и все образа:

sudo docker rm -f $(docker ps -aq)

sudo docker rmi -f $(docker images -q)

 

// А теперь развернем контейнер с коровой из своего собственного репозитория с докерхаба:

sudo docker run -it hashmaster/megacow bash

Отлично!

И тут кстати очень важный момент - Я всё это делал на raspberry pi 3. То есть на архитектуре ARM.

И теперь когда попробовал запустить контейнер на обычном X86 компьютере - получил ошибку:

standard_init_linux.go:211: exec user process caused "exec format error"

Имейте это ввиду! То есть команды конечно те же, но если образ создан на одной архитектуре то на другой может не запуститься.

*******************************************

Идём дальше. Рассмотрим перечень опций и ключей:

-d - запускает контейнер в фоновом режиме;

--hostname  -  Задать имя хостнэйм;

-t - прикрепляет к контейнеру псевдо-TTY-консоль;

-i - выводит в терминал STDIN поток контейнера;

--name - имя контейнера, по которому потом можно будет к нему обращаться;

--cpus - количество ядер процессора, доступных в контейнере;

-m, --memory - количество оперативной памяти, доступное Docker-контейнеру;

--device - позволяет монтировать устройства из папки /dev в контейнер;

-e - добавляет переменную окружения в контейнер;

--entrypoint - позволяет переопределить скрипт, который выполняется при запуске контейнера, перед запуском основной команды;

--expose - позволяет пробросить несколько портов из контейнера в хост-систему;

-P - пробрасывает все порты контейнера в хост-систему;

-p - переносит все порты контейнера в хост-систему без смены номера порта;

-v, --volume - позволяет монтировать папки хоста в контейнер;

-w - изменяет рабочую директорию контейнера.

--dns - устанавливает DNS-серверы для контейнера;

--network - тип сети для контейнера, может принимать такие значения: bridge (используется по умолчанию), none, host. Или передать идентификатор сети Docker, к которой надо подключится;

--add-host - добавляет строку в /etc/hosts;

--restart - указывает, когда надо перезапускать контейнер. Может принимать значения: no, on-failure, always, unless-stopped;

--rm - удаляет контейнер после завершения его работы;

--memory-swap - объём памяти раздела подкачки, доступный в контейнере;

--shm-size - размер файла /dev/shm;

--link - позволяет настроить связь контейнеров Docker;

 

Рассмотрим связь контейнеров. Запустим контейнер “dpage/pgadmin4” - это аналог phpMyAdmin только для PostgreSQL. А также запустим сам контейнер с PostgreSQL “postgres”. Имена образов “dpage/pgadmin4” и “postgres” взяты с докерхаб - (https://hub.docker.com/_/postgres / https://hub.docker.com/r/dpage/pgadmin4). Но мы не просто запустим их а сделаем в них связь - то есть в браузере мы увидим управление базами PostgreSQL через WEB интерфейс pgAdmin.

//Для связывания контейнеров используется опция --link

Для начала запустим контейнер с PostrgeSQL:

 

Создадим каталог /home/mradmin/dbdata

mkdir /home/mradmin/dbdata

Далее скачиваем образ:

sudo docker pull postgres

И запускаем контейнер:

$ sudo docker run -d \

    --name pgres \

    --hostname pgres \

    -e POSTGRES_PASSWORD=123 \

    -v /home/mradmin/dbdata:/var/lib/postgresql/data \

    postgres

 

Разбираем команду:

-d \  -  Запускаем контейнер в фоне;

--name pgres \  -  Задаём своё имя контейнеру;

--hostname pgres \  -  Задаём хостнэйм для контейнера 

-e POSTGRES_PASSWORD=123 \   -   Передаём переменную в контейнер, которая скажет СУБД какой пароль - “123” использовать для главной учётки по умолчанию. Кстати учётка эта “postgres” а не “root”, но можно было и задать свою через строку “-e 'POSTGRES_USER=mradmin' \” ;

-v /home/mradmin/dbdata:/var/lib/postgresql/data \   -   Монтируем директорию хостовой машины; “/home/mradmin/dbdata” в контейнер - в директорию “/var/lib/postgresql/data” - это место где Postgres создаёт базы данных. Таким образом сами базы будут находиться вне контейнера на хостовой файловой системе, что обеспечивает сохранность данных, в случае если контейнер пропадёт;

postgres - собственно образ из докерхаба на основании которого создается контейнер.

 

В результате выполнения команды в изначально пустом каталоге “/home/mradmin/dbdata” появились файлы postgres:

 

Обратите внимание как изменились права на каталог dbdata. Владельцем сатал “systemd-coredump” и при этом у группы и у других прав вообще никаких (drwx------):

 

И тем не менее мы успешно запустили контейнер с СУБД. Далее запсутим отдельный контейнер с управляшкой этой СУБД на основе WEB сервера:

$ sudo docker run -d \

    --name pgadmin \

    --link pgres \

    -p 8080:80 \

    -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \

    -e 'PGADMIN_DEFAULT_PASSWORD=321' \

    dpage/pgadmin4

 

Разбираем команду:

-d \  -  Запускаем контейнер в фоне;

--name pgadmin \ -  Задаём своё имя контейнеру;

--link pgres \  -  собственно тут делаем связь контейнеров, опция --link говорит возьми контейнер “pgres” и свяжи его с создаваемым контейнером “pgadmin”;

-p 8080:80 \  -  Перенаправляем хостовой порт 8080 на порт 80 контейнера pgadmin;

-e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' \    - через переменную передаём login для web интерфеса;

-e 'PGADMIN_DEFAULT_PASSWORD=321' \    - через переменную передаём пароль от web интерфейса.  Информацию о том с какими параметрами можно запускать этот контейнер можно найти тут (https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html);

dpage/pgadmin4 -  Указываем какой образ использовать из докерхаба.

 

Ну и теперь собственно остаётся проверить - набираем в браузере IP адрес плюс порт 8080 хостовой машины и должны увидеть панель управления pgadmin:

 

Но вот в списке серверов не видно нашей СУБД. А всё потому что надо еще добавить сервер с нашей СУБД:

 

Далее внесем имя сервера:

Ну и разумеется в разделе “Connection” нужно вписать имя хоста СУБД а также username и Password:

И вот мы с радостью наблюдаем что появился наш сервер “TEST:



 

//Пробуем другой метод.

Удаляем все контейнеры и образа:

sudo docker rm -f $(docker ps -aq) && sudo docker rmi -f $(docker images -q)

 

Далее пробуем через создание общей сети. Создаём общий сетевой пул (cont_network):

sudo docker network create -d bridge cont_network

Список сетевых пулов:

docker network list

 

Запускаем контейнер с СУБД:

sudo docker run -d \

    --name pgres \

    --hostname pgres \

    -e POSTGRES_PASSWORD=123 \

    -v /home/mradmin/dbdata:/var/lib/postgresql/data \

    --network cont_network \

    postgres

 

Далее с использованием переменной окружения "PMA_HOST" запустим контейнер с веб-управляшкой СУБД:

 

sudo docker run -d --name pgadmin --network cont_network -e PMA_HOST=pgres -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD=321' -p 8080:80 dpage/pgadmin4

 

И также наблюдаем связь двух контейнеров.

А что если вдруг мы перезагрузили сервер. И понимаем что наш контейнер не поднялся. Это легко исправить. Для начала узнаем ID контейнера командой:

sudo docker ps -a

Затем просто стартуем его, указывая ID:

sudo docker start 214367381a14

 

Естественно нам не обязательно каждый раз вручную запускать контейнеры после перезагрузки хостовой машины. Для этого нужно указать “restart policy” - то есть политики перезапуска. Они указываются во время команды “docker run”. А именно флагом “--restart”:

 

По умолчанию (контейнер не стартует после ребута):

$ docker run -d --restart no ОБРАЗ

 

Рестарт контейнера если он завершился из-за ошибки:

$ docker run -d --restart on-failure ОБРАЗ

 

Всегда перезапускать контейнер. Если контейнер был остановлен вручную то перезапуск будет после того как перезапустится демон докера.

$ docker run -d --restart always ОБРАЗ

 

Действует также как “always” но только если контейнер не был остановлен вручную, если был остановлен вручную то перезагрузки не будет даже после перезапуска демона докера.
$ docker run -d --restart unless-stopped ОБРАЗ

  

Ну  а теперь интересный вопрос - что если у нас уже есть бегущий контейнер но мы в команде “run” не указывали флаг --restart, как быть в такой ситуации ведь если мы остановим контейнер и запустим его заново не командой “start” а командой “run” то докер сделает другой контейнер. И всё-таки как добавить автозапуск бегущему контейнеру? Тут мы плавно вернёмся к docker-compose. 

 

Когда я стал знакомится с “docker-compose” мне сразу пришло на ум что это эволюция “Dockerfile” - только компоуз позволяет описать не только создание образа на основе эталона но и позволяет описать особенности запуска и взаимоотношения контейнеров. Компоуз тоже опирается на созданный нами файл с параметрами: “docker-compose.yaml” или “docker-compose.yml”. Давайте рассмотрим пример создания контейнеров с помощью “docker-compose”.  

 

Создаём директорию. Я снова сделаю ~/mrstudio22

mkdir ~/mrstudio22

Переходим в неё:

cd ~/mrstudio22

 

Теперь проверим и запомним версии докера и докер-компоуз:

docker -v && docker-compose -v

В моём случае вывод был таким:

root@mrstudioaltay:~/mrstudio22# docker -v && docker-compose -v

Docker version 19.03.12, build 48a66213fe

docker-compose version 1.26.0, build d4451659

 

То есть версия докера - 19.03.12 

и версия компоуза - 1.26.0

 

переходим на страницу: https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix

 

Сверяемся в таблице - какому “Docker Engine release” соответствует версия “Compose file format”. Ну или проще говоря - какую версию описания docker-compose мы можем себе позволить с учётом того что у нас версия докера “19.03.12”. В моём случае 3.8. Но использовать новейшую версию не обязательно. В примере далее мы поднимем сервис “Nextcloud” с привязкой СУБД “mariadb”:

 

//создаём компоуз файл:

nano docker-compose.yaml

 

###

version: '2'

 

volumes:

  nextcloud:

  db:

 

services:

  db:

    image: mariadb

    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW

    restart: always

    volumes:

      - db:/var/lib/mysql

    environment:

      - MYSQL_ROOT_PASSWORD=12345

      - MYSQL_PASSWORD=12345

      - MYSQL_DATABASE=nextcloud

      - MYSQL_USER=nextcloud

 

  app:

    image: nextcloud

    ports:

      - 8080:80

    links:

      - db

    volumes:

      - nextcloud:/var/www/html

    restart: always

 

###

Вот такой файл описания получился - давайте разбираться:

 

version: '2' - Это версия компоуз инструкций;

 

volumes: - объявляем две точки монтирования как тома nextcloud и db - то есть это как бы переменные в которые монтируются директории внутри контейнеров для того чтобы их можно монтировать в другой контейнер;

 

services: - Объявлем какие образа будем использовать при создании контейнеров. Заодно прописываем какие каталоги закрепляются за томами (Volumes), связи с томами других контейнеров, перенаправление портов хост/контейнер а также тот самый флаг restart. 

restart: always как раз и обеспечит нам тот самый автозапуск контейнеров после перезагрузки хостовой машины.

 

Теперь будучи внутри каталога где лежит docker-compose.yaml выполняем команду:

docker-compose up -d

 


Навигация: