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 сохранит этот путь. Но только для этого контейнера и все останется в файловой системе докера. Хозяину вообще ничего не написано! Это всегда будет происходить, только если вы дадите папку хоста перед папкой контейнера!
Надеюсь, это помогло:)