Docker Machine на Mac: не видно смонтированных томов на докер-хост-машине/докер-машине? Где физически хранятся тома?

Am на ноутбуке Macbook Pro и работающей докер-машине (0.5.0) и докере-компонете (1.5.0), чтобы получить мои контейнеры.

Это означает, что я использую docker-machine для создания своих машин HOST с виртуальными окнами, которые будут запускать мой демон докеров и размещать все мои контейнеры.

Я думаю, что мне не хватает чего-то критического в концепции HOSTS и VOLUME, поскольку они относятся к Docker и документации.

Это мой файл docker-compose.yml(веб просто создает изображение php: 5.6-apache):

web:
  restart: "always"
  build: ./docker-containers/web
  ports:
    - "8080:80"
  volumes:
    - ./src:/var/www/html
  links:
    - mysql:mysql

mysql:
  restart: "always"
  image: mysql:5.7
  volumes_from:
    - data
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=XXX

data:
  restart: "no"
  image: mysql:5.7
  volumes:
    - /var/lib/mysql
  command: "true" 

Документация документа Docker Compose для томов находится здесь: http://docs.docker.com/compose/compose-file/

Он указывает для томов - монтирует пути как тома, опционально указывая путь на главной машине (HOST: CONTAINER) или режим доступа (HOST: CONTAINER: ro).

HOST в этом случае относится к моей виртуальной машине, созданной докер-машиной, правильно? Или моя локальная файловая система macbook? Установка пути на моей виртуальной машине в контейнер?

В Интернете я заявляю:

volumes:
  - ./src:/var/www/html

и это сопоставление моей локальной файловой системы macbook./src на моем macbook pro для моего веб-контейнера. Если мое понимание правильное, не должно ли оно отображаться в папке. /src на моей VM на /var/www/html в веб-контейнере?! В теории я думаю, что мне нужно будет сначала скопировать мою локальную папку файловой системы Mac./src в мою виртуальную машину, а затем я сделаю это объявление тома. Кажется, что докер-сочинение волшебно делает все это одновременно? спутать

Наконец, мы видим, что я создаю контейнер данных только для хранения данных mysql. Я заявил:

volumes:
   - /var/lib/mysql

Не следует ли создать папку /var/lib/mysql на моей HOST boot2docker VM, и я мог бы перейти к этой папке на виртуальной машине, да/нет? Когда я использую docker-machine для ssh в моей машине, а затем перейдите в /var/lib, есть папка NO mysql? Почему он не создается? Что-то не так с моей конфигурацией?:/

Спасибо заранее! Любые объяснения относительно того, что я делаю неправильно, будем очень благодарны!

Ответ 1

Хорошо, есть несколько моментов, которые нужно рассмотреть здесь.

Давайте начнем с того, что такое докеры (попробуйте не думать о вашем macbook или бродячей машине на этом этапе. Просто помните о том, что докеры используют другую файловую систему, где бы она ни находилась в данный момент): Возможно, представьте себе, что это так, само по себе каждый том в Docker является частью внутренней докеры файловой системы. Контейнеры могут использовать тезисы, такие как "маленькие жесткие диски", которые могут быть смонтированы ими, а также разделены между ними (или установлены двумя из них в одно и то же время, например, установка супер быстрой версии некоторого ftp-сервера для двух клиентов или что-то еще: P).

В принципе вы можете объявить эти тома (все еще не думая о своем компьютере/бродяге, просто докеры;)) с помощью инструкции Dockerfile VOLUME. Стандартный пример: запустите один контейнер веб-сервера следующим образом:

FROM: nginx
VOLUME /www

Теперь все, что входит в /www, теоретически может быть смонтировано и размонтировано из контейнера, а также установлено на несколько контейнеров. Теперь только Nginx скучно, поэтому мы хотим, чтобы php запускал файлы, хранящиеся в nginx, для создания более интересного контента. = > Нам нужно установить этот том в некоторый контейнер php-fpm. Ergo в нашем файле сочинения мы сделаем это

web:
  image: nginx
php:
  image: php-fpm
  volumes_from:
    - web

= > вуаля! каждая папка, объявленная директивой VOLUME в контейнере nginx/web, будет видна в php. Важно отметить, что все, что находится в nginx/www, будет переопределять все, что php имеет в /www. Если вы положили: ro, php не может даже записать в эту папку:)

Теперь, приближаясь к вашей проблеме, есть второй способ объявить тома, что не требует их объявления в файле Docker. Это можно сделать, установив объемы с хоста (в этом случае ваш бродяга /boo 2docker thingy). Давайте обсудим это, как будто мы работаем на родном Linux.

Если бы вы поставили что-то вроде:

volumes:
 - /home/myuser/folder:/folder

в файле docker-compose.yml, то это будет означать, что /home/myuser/folder теперь будет смонтирована в докере. Он будет переопределять все, что имеет докер в папке/и так же, как /www также будет доступно из того, что его объявило. Теперь на компьютере Linux запущен демон docker.

Так много для теории:), на самом деле вам, вероятно, просто нужен следующий совет, чтобы получить ваши вещи:):

Путь boot2docker/docker-machine/kitematic и все это касается этой проблемы, просто потому, что они в первую очередь просто монтируют том в бродячей машине в контейнеры докеров, и они просто также монтируют эту вещь в вашу Mac, надеясь, что все это сработает: P

Теперь для практической проблемы все мы, использующие это (или просто пытающиеся помочь своим коллегам в мир сладкого сладкого Докера: P) на Mac, - это разрешения. Я имею в виду думать об этом (root или какой-либо другой пользователь обрабатывает файлы в контейнере, пользовательский бродяга может обрабатывать файлы на бродячем хостинге, а затем ваш пользователь Mac "skalfyfan" обрабатывает эти файлы на Mac.Они имеют разные идентификаторы пользователя и whatnot = > многие проблемы возникают с этим и в некоторой степени зависят от того, что вы на самом деле выполняете в Docker. Mysql и Apache особенно болезненны, потому что они не запускаются как root в контейнере. Это означает, что у них часто возникают проблемы с записью в файл Mac система.

Перед тем, как попробовать второй подход ниже, просто попробуйте поместить свои тома контейнера в свой домашний каталог Mac. Это позволит решить проблемы с MySQL в большинстве случаев, как я нашел с течением времени. Btw: Не нужно объявлять полные пути к томам. /folder отлично и читается относительно места, в котором находится ваш docker-compose.yml!

Просто поместите compose-yml в папку с вашими пользователями Mac, что все это имеет значение. Нет chmod 777 -R: P поможет вам здесь, он просто должен находиться под вашей домашней папкой:)

Тем не менее некоторые приложения (например, Apache) по-прежнему будут вам тяжело. Тот факт, что идентификатор пользователя, который работает в контейнере, отличается от вашего идентификатора пользователя Mac, превратит вашу жизнь в ад. Чтобы обойти это, вам необходимо настроить идентификатор пользователя, а также группу пользователей таким образом, чтобы это не противоречило вашим разрешениям Mac. Группа, которую вы хотите на Mac, является персоналом, UID, который работает, будет, например, 1000. Следовательно, вы можете поместить это в конец вашего файла Docker:

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

или

RUN usermod -u 1000 mysql
RUN usermod -G staff mysql

Итак, как вы теперь узнали:

В теории я думаю, что мне нужно будет КОПИРОВАТЬ мой локальный файл mac системную папку. /src для моей виртуальной машины сначала, а затем я делаю этот том декларация. Кажется, что докер-сочинение волшебным образом делает все это сразу хотя?

Вправо, он делает это:)

Наконец, мы видим, что я создаю контейнер только для данных, который нужно сохранить мои данные mysql. Я заявил:     объемы:        -/var/lib/mysql

В этом вы ошибаетесь:) Как объяснено, если вы не дадите папку хоста, Docker будет продолжать этот путь. Но только для этого контейнера и все останутся в файловой системе докера. Ничего не написано на хосте вообще! Это всегда будет происходить только в том случае, если вы предоставите папку хоста перед папкой контейнера!

Надеюсь, это помогло:)