Информация:
Docker - это средство упаковки, доставки и запуска приложения.
https://www.docker.com/ - оф сайт
https://habr.com/ru/post/277699/ - введение
https://www.8host.com/blog/ustanovka-i-ispolzovanie-docker-v-debian-9/ - установка и инструкция
https://linux-notes.org/rabota-s-setju-networking-v-docker/ - установка и инструкция
https://sysadmin.ru/articles/ustanovka-docker-v-linux - установка и инструкция
https://docs.docker.com/docker-for-windows/install/ - установка на windows
https://docs.docker.com/docker-for-mac/install/ - установка на MACOS
https://habr.com/ru/post/277699/
https://www.digitalocean.com/community/tutorials/docker-ru - хороший гайд для новичков
Установка:
Ставить будем на debian 11
apt install docker docker-compose
Основные команды кратко:
# справочная информация
docker --help # список доступных команд
docker --help # информация по команде
docker --version # версия Docker
docker info # общая информация о системе
# работа с образами
docker search debian # поиск образов по ключевому слову debian
docker pull ubuntu # скачивание последней версии (тег по умолчанию latest) официального образа ubuntu (издатель не указывается) из репозитория по умолчанию docker.io/library
docker pull prom/prometheus # скачивание последней версии (latest) образа prometheus от издателя prom из репозитория docker.io/prom
docker pull docker.io/library/ubuntu:18.04 # скачивание из репозитория docker.io официального образа ubuntu с тегом 18.04
docker images # просмотр локальных образов
docker rmi : # удаление образа. Вместо : можно указать .
# Для удаления образа все контейнеры на его основе должны быть как минимум остановлены
docker rmi $(docker images -aq) # удаление всех образов
# работа с контейнерами
docker run hello-world # Hello, world! в мире контейнеров
docker run -it ubuntu bash # запуск контейнера ubuntu и выполнение команды bash в интерактивном режиме
docker run --name docker-getting-started --publish 8080:80 docker/getting-started # запуск контейнера gettind-started с отображением (маппингом) порта 8080 хоста на порт 80 внутрь контейнера
docker run --detach --name mongodb docker.io/library/mongo:4.4.10 # запуск контейнера mongodb с именем mongodb в фоновом режиме. Данные будут удалены при удалении контейнера!
docker ps # просмотр запущенных контейнеров
docker ps -a # просмотр всех контейнеров (в том числе остановленных)
docker stats --no-stream # просмотр статистики
docker start alpine # создание контейнера из образа alpine
docker start # запуск созданного контейнера. Вместо можно указать
docker start $(docker ps -a -q) # запуск всех созданных контейнеров
docker stop # остановка контейнера. Вместо можно указать
docker stop $(docker ps -a -q) # остановка всех контейнеров
docker rm # удаление контейнера. Вместо можно указать
docker rm $(docker ps -a -q) # удаление всех контейнеров
# система
docker system info # общая информация о системе (соответствует docker info)
docker system df # занятое место на диске
docker system prune -af # удаление неиспользуемых данных и очистка диска
Основные команды подробней:
### https://hub.docker.com/ - тут ищем контейнеры
docker --help - помощь
docker ps - показать бегущие контейнеры
docker ps --all - показать бегущие контейнеры и остановленные
Загрузка:
docker image ls - показать загруженные образы контейнеров
docker image pull nginx:1.20.1-alpine - скачать контейнер nginx:1.20.1-alpine
docker image pull nginx - скачать контейнер nginx, будет скачан самый последний образ
Запуск:
docker run \
--name nginx \
-v /srv/nginx/:/usr/share/nginx/html \
-p 80:80 \
-d nginx
Запуск:
docker run nginx:1.18 - запуск контейнера nginx:1.18, контейнер будет запущен в текущей консоли
docker run -p 7777:80 nginx - запуск контейнера nginx,
docker run -d -p 7777:80 nginx - запуск в режиме демона
docker run -d --rm --name nginx -p 8888:80 nginx:1.18 - опция (--rm) говорит о том что при завершение контейнера он будет удален
Подключение:
docker ps -a
docker exec -it ID_CONTEINER bash - подключится к контейнеру ID_CONTEINER, используем bash внутри контейнера
docker exec -it ID_CONTEINER sh - подключится к контейнеру ID_CONTEINER, используем sh внутри контейнера
docker exec -it 263d85d77e14 bash
docker exec -it 263d85d77e14 sh
Информация:
docker ps -a
docker inspect ID_CONTEINER
docker inspect 2a420e4ceb84
ps - uax |grep docker
Логи:
docker ps -a
docker logs -f ID_CONTEINER
docker logs -f 12622b1bd1a8
Отключение и удаление контейнеров:
docker ps -a
docker stop ID_CONTEINER
docker rm ID_CONTEINER
Отключение и удаление всех контейнеров:
docker ps -a | awk '{print $1}'
docker stop $(docker ps -a | awk '{print $1}')
docker rm $(docker ps -a | awk '{print $1}')
Docker compose:
mkdir test-docker - создали каталог
cd test-docker/ - перешли в каталог
vim test.yaml - отредактировали
docker-compose up -d - запуск в режиме демона
docker-compose down - выключить
Пример создания своего контейнера с python:
0. Создали директорию test0
mkdir test0
cd test0
1. Создали файл app.py
cat > app.py << "EOF"
print("Hello, World!")
EOF
2. Создали файл Dockerfile
cat > Dockerfile << "EOF"
FROM python:3.6
RUN mkdir -p /usr/src/app/
WORKDIR /usr/src/app/
COPY . /usr/src/app/
CMD ["python", "app.py"]
EOF
3. Выполнили сборку контейнера:
docker build -t hellow-world .
docker пример запуска mariadb + adminer
Скачиваем образ mariadb:
docker pull mariadb
Смотрим доступные образы:
docker images
Запускаем контейнер mariadb с параметрами:
-d - запуск в режиме демона
-p - проброс портов
-name - имя контейнера
docker run -p 127.0.0.1:3306:3306 --name mariadb -e MARIADB_ROOT_PASSWORD=superoass -d mariaddb
Проверяем что там запустилось:
docker ps
Запускаем контейнер adminer:
--link - просим докер добавить запись в /etc/hosts
docker run --name adminer --link mariadb:db -p 8080:8080 -d adminer
Подключаемся к контейнер:
-ti - команда t термина, команда i не отпускать терминал
docker exec -ti adminer sh
Cмотрим что там у нас в /etc/hosts:
cat /etc/hosts
docker stop
docker rm
docker rmi
Dockerfile
vim Dockerfile
--------------------
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
---------------------
docker build -f /path/to/a/Dockerfile
dockerfile from python
FROM python
dockerfile from apline + python + 8 слоев
FROM apline
RUN apk add --update-cache
RUN apk add python3
RUN apk add pyhton3-dev
RUN apk add py-pip
RUN apk add build-base
RUN pip install virtualenv
RUN rm -rf /var/cache/apk/*
dockerfile from apline + python + уменьшаем кол-во слоев (2 слоя)
FROM apline
RUN apk add --update-cache \
python3 \
pyhton3-dev \
py-pip \
build-base \
&& pip install virtualenv \
&& rm -rf /var/cache/apk/*
dockerfile from golang:alpine
FROM golang:apline AS builder
WORKDIR /src
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY main.go
FROM alpine:3.15
WORKDIR /app
COPY --from=bulder /src/hello-docker /app/hello-docker
ENTRYPOINT ["/app/hello-docker"]
Docker compose:
mkdir test-docker - создали каталог
cd test-docker/ - перешли в каталог
vim test.yaml - отредактировали
-------------------------------------
version: "2.2"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
-------------------------------------
docker-compose up - запустится, ctrl+с прервет выполнение
docker-compose up -d - запустить в режиме демона
docker-compose down - выключить
!!! Внимание
docker-compose down --volumes - удалит еще и данные контейнера
Чем docker не является
Docker часто путают с Vagrant’ом или OpenVZ, или даже VirtualBox’ом.
Docker это всего-лишь user-space демон на языке Go, который умело жонглирует уже существующими технологиями ядра Linux.
Не вагрант
Вагрант занимается тем, что управляет виртуальными машинами (или, более приближенно к теме хостинга, виртуальными серверами).
Так же как и у docker'а, у вагранта есть целая библиотека образов виртуальных машин, и он как и docker умеет их снепшотить, скачивать и заливать, настраивать и запускать.
Vagrant управляет полноценными тяжелыми виртуальными машинами запущенными, например, в VirtualBox, VMWare, DigitalOcean, AWS, да где только он их не запускает.
Шикарная вещь, этот вагрант, если вам нужна полноценная виртуальная машина с состоянием внутри.
Не виртуальная машина
И конечно, docker вовсе не является новой технологией (пара)виртуализации, как например KVM/Qemu, VirtualBox/VMWare/Parallels, XEN, etc.
Docker-демон (не путать с консольной командой docker) работает только в Линуксе (и скоро в винде) поверх линуксовых же контейнеров.
А контейнеры, в свою очередь, не являются полноценной виртуальной средой, так как они делят общее запущенное ядро одной физической машины.
Docker состоит из трех частей:
Docker daemon
Docker
Docker Hub
Docker daemon:
docker daemon — сердце docker'а.
Это демон работающий на хост-машине и умеющий скачивать и заливать образы, запускать из них контейнеры,
следить за запущенными контейнерами, собирать логи и настраивать сеть между контейнерами (а с версии 0.8 и между машинами).
А еще именно демон создает образы контейнеров, хоть и может показаться, что это делает docker-client.
Docker
docker это консольная утилита для управления docker-демоном по HTTP.
Она устроена очень просто и работает предельно быстро.
Вопреки заблуждению, управлять демоном docker'а можно откуда угодно, а не только с той же машины.
В сборке нового образа консольная утилита docker принимает пассивное участие:
архивирует локальную папку в tar.gz и передает по сети docker-daemon, который и делает всё работу.
Именно из-за передачи контекста демону по сети лучше собирать тяжелые образы локально.
Docker Hub:
Docker Hub централизованно хранит образы контейнеров.
Когда вы пишете docker run ruby docker скачивает самый свежий образ с руби именно из публичного репозитория.
Изначально хаба не было, его добавили уже после очевидного успеха первых двух частей.
Установка:
apt update - обновляем список пакетов
apt upgrade - обновляем пакеты
apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common - устанавливаем пакеты
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" - добавляем репозиторий
apt update - обновляем список пакетов
apt-cache policy docker-ce - проверяем доступность пакетов docker
apt install docker-ce - устанавливаем docker
sudo systemctl status docker - проверяем что docker запущен
Добавление пользователя в группу docker:
usermod -aG docker user_name
Добавление пользователя в группу docker:
$ sudo usermod -aG docker ${USER} - добавить текущего пользователя
$ su - ${USER}
$ id -nG - проверить
docker первые шаги после установки
docker info - общая информация
docker run hello-world - первая команда которой обычно проверяют успешность установки docker
docker search ubuntu - поиск образов ubuntu
docker images - показать установленные образы
docker ps -a - показать все контейнеры
docker start ID_контейнера
docker stop ID_контейнера
Проверяем что у нас установлено:
https://hub.docker.com/ - репозиторий
sudo docker version - посмотреть версию докера
sudo docker login - выполняем авторизацию на докер
sudo docker images - посмотреть установленные образы
sudo docker ps -a - посмотреть что сейчас выполняется в докер
Еще пример:
docker run -it -p 8080:80 yeasy/simple-web
Флаг -i необходим, чтобы контейнер запустился в интерактивном режиме.
Флаг -t необходим для переноса ввода и вывода в контейнер, то есть если мы используем флаг -t для запуска контейнера мы окажемся внутри него.
Флаг -p создает проброс портов между нашим устройством и контейнером, это необходимо для доступа к сети контейнера.
В нашем случае для доступа к 80 порту внутри контейнера необходимо обратиться к 8080 порту на нашем устройстве.
docker ps -a - посмотрим какие у нас сейчас есть контейнеры
docker stop - остановка контейнера
docker start - запуск контейнера
docker rm - удаление контейнера
docker help:
attach - Присоедините локальные стандартные потоки ввода, вывода и ошибок к работающему контейнеру
build - Создать образ из Dockerfile
commit - Создать новый образ из изменений контейнера
cp - Копировать файлы / папки между контейнером и локальной файловой системой
create - Создать новый контейнер
diff - Проверять изменения в файлах или каталогах в файловой системе контейнера
events - Получить события в реальном времени с сервера
exec - Запустить команду в работающем контейнере
export - Экспортировать файловую систему контейнера как архив tar
history - Показать историю изменений
images - Показать доступные образы
import - Импорт содержимое из архива, чтобы создать образ файловой системы
info - Отображение информации о системе ( сколько контейнеров, работает, и т.д.)
inspect - Показать подробную информации об объектах Docker
kill - Завершить один или несколько работающих контейнеров
load - Загрузить образ из архива tar или STDIN
login - вход в реестор Docker
logout - выход из реестра Docker
logs - Получить журналы контейнера
pause - Приостановить все процессы в одном или нескольких контейнерах
port - Список сопоставлений портов или конкретное сопоставление для контейнера
ps - Список контейнеров
pull - Вытащить изображение или хранилище из реестра
push - Добавить изображение или репозиторий в реестр
rename - Переименовать контейнер
restart - Перезапустите один или несколько контейнеров
rm - Удалить один или несколько контейнеров
rmi - Удалить одно или несколько изображений
run - Запустите команду в новом контейнере
save - Сохраните одно или несколько изображений в архив tar (по умолчанию передается в STDOUT)
search - Поиск образов Docker Hub
start - Запустить один или несколько остановленных контейнеров
stats - Отобразить живой поток статистики использования ресурсов контейнера (ов)
stop - Остановите один или несколько работающих контейнеров
tag - Создать тег TARGET_IMAGE, который ссылается на SOURCE_IMAGE
top - Отобразить запущенные процессы контейнера
unpause - Отмена приостановки всех процессов в одном или нескольких контейнерах
update - Обновить конфигурацию одного или нескольких контейнеров
version - Показать информацию о версии Docker
wait - ???что???Блокируйте, пока один или несколько контейнеров не остановятся, затем напечатайте их коды выхода
Получить список опций конкретной под команды:
docker docker-subcommand --help
docker подключение к контейнеру
docker create -it ubuntu:16.04 bash - создали контейнер
docker ps -a - посмотрели все контейнеры
docker start ИД_контейнера - запустили контейнер
docker attach ИД_контейнера - подключились к контейнеру
docker compose установка:
compose - требуется для сборки контейнеров
https://docs.docker.com/compose/install/ - офф. инструкция
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
Создание образа докер:
sudo docker run -it --name Имя_будущего_образа --hostname Имя_будущего_образа ubuntu bash - создаем контейнер с ubuntu и открываем консоль
-----------------------------------------------------------------------------------------
apt update && apt upgrade -y - обновим репозиторий
apt install cowsay - установим нужное приложение
ln -s /usr/games/cowsay /usr/bin/cowsay - !!! создаем символьную ссылку для запуска приложения
exit - входим из контейнера
-----------------------------------------------------------------------------------------
sudo docker commit Имя_будущего_образа Наш_логин_в_докер/Имя_будущего_образа - создаем образ
sudo docker run Наш_логин_в_докер/Имя_будущего_образа cowsay "LOL" - проверяем работоспособность нашего образа
sudo docker run Наш_логин_в_докер/Имя_образа /usr/games/cowsay "LOL" - !!! если забыли создать символьную ссылку придется написать полный путь до приложения /usr/games/cowsay
sudo docker login - выполняем авторизацию на докер
sudo docker push Наш_логин_в_докер/Имя_будущего_образа - собственно загружаем наш образ в репозиторий докер
Запуск нашего контейнера:
sudo docker run Наш_логин_в_докер/Имя_образа cowsay "TEST"
docker создание образов / докер файл / dockerfile / настройка образа
mkdir Папка_для_образа - создаем папку
cd Папка_для_образа - переходим в папку для образа
touch dockerfile - создаем файл dockerfile
vim dockerfile - открываем для редактирования
--------------
FROM ubuntu - определяем ос для образа ( обязательно )
RUN apt update && apt upgrade -y && apt install cowsay -y && ln -s /usr/games/cowsay /usr/bin/cowsay - выполняем установку программы cowsay и настраиваем ее
--------------
sudo docker login - выполняем авторизацию на докер
sudo docker build -t Наш_логин_в_докер/Имя_будущего_образа . - !!!в конце точка!!! выполняем находясь в каталоге Папка_для_образа и образ будет собран и отправлен в репозиторий
sudo docker run Наш_логин_в_докер/Имя_будущего_образа cowsay "LOL" - проверяем работоспособность нашего образа
модификация образа:
vim dockerfile - открываем для редактирования
--------------
FROM ubuntu - определяем ос для образа ( обязательно )
MAINTAINER имя_автора_образа почта@автора.образа - эта строчка ничего не делает \ инфо для связи с автором образа
RUN apt update && apt upgrade -y && apt install cowsay -y && ln -s /usr/games/cowsay /usr/bin/cowsay - выполняем установку программы cowsay и настраиваем ее
ENTRYPOINT ["cowsay"] - указываем точку входа - позволит при запуске ( sudo docker run Наш_логин_в_докер/Имя_будущего_образа cowsay "LOL" ) не писать cowsay
--------------
sudo docker build -t Наш_логин_в_докер/Имя_будущего_образа . - !!!в конце точка!!! выполняем находясь в каталоге Папка_для_образа и образ будет собран и отправлен в репозиторий
sudo docker run Наш_логин_в_докер/Имя_будущего_образа "LOL" - проверяем работоспособность нашего образа
sudo docker push Наш_логин_в_докер/Имя_будущего_образа - загружаем наш образ в репозиторий докер / реестор
Еще пример своего образа sampleapp
0. ставим python и flask
apt install python3
pip3 install flask
1. Создаем каталог
mkdir sample_app.py
2. Переходим в sample_app.py и создаем файл sample_app.py
cd sample_app.py
vim sample_app.py
-----------------
from flask import Flask
from flask import request
from flask import render_template
sample = Flask(__name__)
@sample.route("/")
def main():
return render_template("index.html")
if __name__ == "__main__":
sample.run(host="0.0.0.0", port=8080)
-----------------
3. Cоздание, сборка, запуск контейнера
vim sample_app.sh
#!/bin/bash
-----------
mkdir tempdir
mkdir tempdir/template
mkdir tempdir/static
cp sample_app.py tempdir/.
cp -r templates/* tempdir/templates/.
cp -r static/* tempdir/static/.
echo "From python" >> tempdir/Dockerfile
echo "RUN pip install flask" >> tempdir/Dockerfile
echo "COPY ./static /home/myapp/static" >> tempdir/Dockerfile
echo "COPY ./tamplate /home/myapp/templates/" tempdir/Dockerfile
echo "COPY sample_app.py /home/myapp/" >> tempdir/Dockerfile
echo "EXPOSE 8080" >> tempdir/Dockerfile
echo "CMD python3 /home/myapp/sample_app.py" >> tempdir/Dockerfile
cd tempdir
docker build -t sampleapp .
docker - rub -d -p 8080:8080 --name samplerunning sampleapp
docker ps -a
-----------
4. Запуск скрипта sample_app.sh
bash sample_app.sh
Docker работа с сетью / networking / драйверы:
bridge:
Мост, — это сетевой драйвер по умолчанию.
Бридж сеть используется, когда ваши приложения запускаются в автономных контейнерах,
которые должны взаимодействовать между собой (Наглядный пример Nginx + MySQL).
Лучше всего использовать для связи нескольких контейнеров на одном и том же Docker хосте.
Можно юзать docker-compose и выберать даную сеть для такой связки
host:
Хост, — это сетевой драйвер для автономных контейнеров (удаленная сетевая изоляция между контейнером и Docker хостом).
Данный драйвер доступен только для docker-swarm с поддержкой Docker 17.06 и выше.
Лучше всего использовать, когда сетевой стек не должен быть изолирован от хоста Docker,
но вы хотите, чтобы другие аспекты контейнера были изолированы.
overlay/overlay2:
Оверлей (Наложенная сеть), или наложение сетей — это сетевой драйвер для соединения несколько демонов Docker между собой
и которые позволяют docker-swarm службам взаимодействовать друг с другом.
Вы также можете использовать оверлейные сети для облегчения связи между docker-swarm
и автономным контейнером или между двумя отдельными контейнерами на разных Docker демонах.
Эта стратегия устраняет необходимость выполнения маршрутизации на уровне ОС между этими контейнерами.
Лучше всего использовать, когда вам нужны контейнеры, работающие на разных Docker хостах для связи, или,
когда несколько приложений работают вместе, используя docker-swarm.
macvlan:
Маквлан,- это сетевой драйвер, который позволяют назначать MAC-адрес контейнеру,
делая его отображаемым как физическое устройство в вашей сети.
Docker демон направляет трафик на контейнеры по их MAC-адресам.
Использование macvlan драйвера иногда является лучшим выбором при работе с устаревшими приложениями,
которые ожидают, что они будут напрямую подключены к физической сети.
Лучше всего использовать, когда вы переходите с VM/дедикейта на контейнеры или хотите,
чтобы ваши контейнеры выглядели как физические хосты в вашей сети, каждый с уникальным MAC-адресом.
none:
Нон,- это сетевой драйвер, который умеет отключать всю сеть для контейнеров.
Обычно используется в сочетании с пользовательским сетевым драйвером.
Network plugins:
Вы можете установить и использовать сторонние сетевые плагины с Docker контейнерами.
Эти плагины доступны в Docker Store или у сторонних поставщиков услуг.
Сторонние сетевые плагины позволяют интегрировать Docker со специализированными сетевыми стеками.
docker network ls
docker network ls - просмотреть сети в Docker
NETWORK ID — При создании сети, ей присваивается ID. Так это собственно идентификатор сети.
NAME — Имя сети. Можно задать произвольное имя.
DRIVER — Используемый драйвер для созданной сети.
SCOPE — Где используется.
docker network create --driver=NAME NAME-NET
docker network create bridge-network - создать сеть bridge-network в Docker (по умолчанию создается bridge)
docker network create --driver=bridge bridge-network - создать сеть bridge-network в Docker (--driver можно указать bridge, overlay, host, none )
docker network create -d overlay my-multihost-network - создать сеть оверлей
docker network create --driver=overlay overlay_network - создать сеть оверлей
docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eth0 my-macvlan-net - создать сеть macvlan
docker network create --subnet 10.1.0.0/16 --gateway=10.1.0.1 --ip-range 10.1.4.0/24 --driver=bridge --label=host4networks brifge04 - создать сеть bridge
docker run -it --name=test_brifge04 --net brifge04 centos:centos7 /bin/bash - проверка
docker run -it --name=test_brifge04_2 --net brifge04 --ip=10.1.4.100 centos:centos7 /bin/bash - проверка контейнеру даем статический ip
docker network connect | disconnect
docker network connect YOUR_NETWORK YOUR_CONTAINER - подключить контейнер(ы) к сети в Docker
docker network disconnect YOUR_NETWORK YOUR_CONTAINER - отключить контейнер(ы) от сети в Docker
YOUR_NETWORK — Сеть
YOUR_CONTAINER — Контейнер
docker network inspect
docker network inspect bridge-network - позволяет получить подробную информацию о сети с имене bridge-network в Docker
docker network rm
docker network rm YOUR_NETWORK - удаление сети YOUR_NETWORK в Docker
docker контейнеры использование внешних каталогов / томов:
Контейнеры или протокол без сохранения состояния?
Каждый контейнер изолирован и не сохраняет состояние.
Это означает, что после удаления контейнера его содержимое будет удалено навсегда.
docker create -it -v $(pwd):/var/www ubuntu:latest bash
При создании нового контейнера добавьте флаг -v, чтобы указать, какой том создать.
Эта команда привяжет текущий рабочий каталог на компьютере к директории /var/www внутри контейнера.