2015-11-06 6 views
10

Am на ноутбуке Macbook Pro и работает докер-машина (0.5.0) и docker-compose (1.5.0), чтобы получить мои контейнеры.Docker Machine на Mac: не видно смонтированных томов на докерной машине/докер-машине? Где физически хранятся тома?

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

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

Это мой докер-compose.yml файл (веб просто строит PHP: 5,6-апаш изображение):

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 в мою виртуальную машину, а затем я сделаю это декларацию тома. Кажется, что докер-сочинение волшебно делает все это одновременно? confused

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

volumes: 
    - /var/lib/mysql 

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

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

+0

ответить ли http://stackoverflow.com/questions/23439126/how-to-mount-host-directory-in-docker-container/33404132#33404132 вашего вопрос? – Eli

ответ

10

Хорошо, есть несколько моментов, которые необходимо решить здесь.

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

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

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's/www, будет переопределять все, что php имеет в/www. Если вы положили: ro, php не может даже записать в эту папку :)

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

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

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

в вашем Докер-compose.yml, то это будет означать, что/дома/MyUser/папка будет установлена ​​в докер. Он будет переопределять все, что имеет докер в папке/и так же, как/www также будет доступно из того, что его объявило. Теперь на машине Linux работает демон docker.

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

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

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

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

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

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

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

или

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

Итак, как вы уже узнали:

в теории я думаю, что должно быть обязательно скопировать мой локальный макинтош файл системы папок ./src к моей VM первым, а затем я этот объем декларация. Кажется, что докер-сочинение волшебным образом все это делает сразу ?

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

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

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

Надеется, что это помогло :)

+0

Спасибо за объяснение! Что касается ваших последних комментариев, если я не передаю папку хоста при объявлении тома в компиляции, то *, то Docker будет продолжать этот путь. * Можете ли вы пояснить, что это означает для * Docker * для сохранения пути в контейнере? Если он остановится, перезапустится, он сохранит данные? Данные будут потеряны только при удалении контейнера? Это то, что значит для * Docker, чтобы продолжать путь только в контейнере? * –

+0

Да точно: остановка в порядке, перезагрузка, данные все еще там. Удаление => данные в объеме тоже исчезли. Получите важный совет здесь: Том по-прежнему существует, но вы теряете доступ, и он загрязняет ваш hd => удаляет контейнеры с флагом -v :) –

+0

Последний вопрос! В моем контейнере «data» (только для данных) я просто изменил его, чтобы прочитать: * тома: -/var/test/mysql:/var/lib/mysql *, а затем запустил * docker-compose build, docker-compose up -d * восстановить все. Я ожидал увидеть теперь/var/test/mysql в HOST VM, но все же ничего? * head scratch * Одна вещь, которую я сейчас замечаю, заключается в том, что когда я SSH в свою VM и * docker ps *, чтобы видеть все запущенные контейнеры, контейнер * data * нигде не видно, даже если он создается. Возможно, это еще один учебник: Спасибо! –