Docker Machine на Mac: не удается увидеть подключенные тома на хосте / докере? Где физически хранятся тома?

Я работаю на ноутбуке Macbook Pro и использую docker-машину (0.5.0) и docker-compose (1.5.0), чтобы мои контейнеры работали.

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

Я думаю, что мне не хватает чего-то критического в концепции 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 на моей виртуальной машине с /var/www/html внутри веб-контейнера?! Теоретически, я думаю, что мне нужно сначала скопировать папку локальной файловой системы Mac./src на мою виртуальную машину, а затем я делаю это объявление тома. Кажется, docker-compose волшебным образом делает все это одновременно? смущенный

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

volumes:
   - /var/lib/mysql

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

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

1 ответ

Решение

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

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

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

FROM: nginx
VOLUME /www

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

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

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

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

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

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

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

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

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

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

Прежде чем попробовать второй подход, приведенный ниже, просто попробуйте поместить тома контейнера в домашнюю директорию Mac. Это решит проблемы с MySQL в большинстве случаев, как я обнаружил со временем. Кстати: не нужно объявлять полные пути к томам./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

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

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

Отлично, это делает это:)

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

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

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

Другие вопросы по тегам