Одна проблема, которую я вижу, когда люди начинают работать с Docker, и Docker Compose — проблема понимания того, какие тома докера есть и что их использование. И во многих случаях вам не нужен их, например, если у вас есть контейнер, который работает в изоляции и не имеет зависимостей, и вы не собираетесь хранить какие-либо данные, или, возможно, он подключается к внешней базе данных, что это на облако. Но в других случаях вам нужно сохранять данные на контейнере, поэтому необходимость докеренных томов. Но давайте попробуем объяснить, как они работают с простым примером.
У вас есть проект, который имеет два сервиса, одно — это приложение, которое вы создаете, например, некоторые ude.js или Python API, которые соединяются с другой службой, базой данных, базу данных, либо MongoDB или MySQL (не имеет значения для нашего примера ). Так что, возможно, ваш Docker-Compose.yml
Похоже:
version: '3' services: api: build: . ports: - 9000:9000 command: npm run dev networks: - my-network mongo: image: mongo:4.4 environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=pass ports: - '27017:27017' networks: - my-network networks: my-network: driver: bridge
Как и оно, как только вы начнете контейнеры, все будет работать нормально, вы можете сохранить данные в базе данных, вы можете прочитать из него, и т.д… Но , самый момент, когда вы делаете Docker-Compose Down
Контейнеры будут удалены Docker, и все данные будут ушел !. И это, вероятно, хорошо с вами, как вам не нужно ничего сохранять, но в другом случае, что вам нужно сделать, это использовать тома .
Привязка монтирует VS тома
Есть два способа, где вы можете создать громкость, связывать креплениями и Объемы Отказ Какой бы вы ни выберете, как только вы настроите громкость в папку, где данные хранятся в контейнере, если вы делаете Docker-Compose Down
, а затем Docker-Compose up
ваши данные не будут стерты, и она станет постоянный Отказ
Связывать креплениями
Крепление привязки — это тома, которые устанавливаются на путь хоста, и они могут быть изменены другими процессами вне докера. По сути, он разделяет папку с вашим хост-компьютером и контейнером, и он определяется синтаксисом
Отказ С креплением Bind наш проект будет выглядеть так:
mongo: image: mongo:4.4 ...other settings volumes: - ./db:/data/db
Так что вы увидите, что у вашего хозяина, вы увидите .db
Папка, которая будет содержать все данные, хранящиеся в базе данных.
Примечание: /data/db
Там, где изображение Mongodb хранит данные баз данных, это будет отличаться от других баз данных, таких как Redis, MariaDB, MySQL и т. Д.
Единственная проблема с монтажами связывания, заключается в том, что папка управляется хост-компьютером, поэтому, если вы измените разрешения на файл, или вы удалите файл, например, вы будете повреждать данные в контейнере, что может привести к ошибкам или контейнеру больше не работает.
Тома
Тома с другой стороны, живут под Docker Engine, он ведет себя более или менее, как виртуальный жесткий диск, управляемый Docker, а файлы внутри него не доступен на хост-компьютере.
Добавьте громкость в Docker-Compose довольно просто, оно похоже на крепления связывания, но с разницей, что вам нужно добавить громкость под Объемы
Массив в главном Docker-Compose.yml
и в конфигурации услуг вы используете синтаксис <Объемное название>: <Контейнер-путь>
Например, если мы хотим хранить данные в контейнере под названием Монгодата
наше Docker-Compose.yml
будет выглядеть что-то вроде этого:
version: '3' services: api: ...api configuration mongo: ...mongo configuration volumes: - mongodata:/data/db networks: my-network: driver: bridge volumes: mongodata:
Примечание, толстая кишка после Монгодата
не ошибка.
Та же, что и привязка креплений, теперь, когда вы остановите контейнеры и перезапустите их, данные будут там.
Как я удаляю громкость?
Если вам нужно удалить громкость, для привязать крепления это просто вопрос, чтобы остановить контейнеры и удалить папку. В случае объем Вам нужно использовать команду Docker, чтобы удалить ее, но это довольно легко:
docker volume rm mongodata
Вот и все!
Бонус
Пара общих команд вы можете использовать для управления объемами с Docker:
# create a volume docker volume create myvolume # list volums docker volume ls # delete a volume docker volume rm myvolume
Оригинал: «https://dev.to/darkmavis1980/how-to-persist-data-with-docker-compose-ik8»