Docker Machine + Docker Compose + Volumes sur Ubuntu
j'ai donc utilisé docker-composer en développement depuis un moment sur ma machine hôte Ubuntu 14.04 LTS avec un fournisseur local de VirtualBox (boot2docker à l'intérieur).
ce n'est que récemment que j'ai décidé d'essayer docker-machine (à cause de l'intégration avec Pycharm) mais je suis en train de rencontrer des problèmes comme par exemple quand je sauve du nouveau code le conteneur docker n'est plus mis à jour automatiquement et je pense que c'est parce que j'ai commenté mes volumes dans mon docker-compose.yml
service web mais si je n'ai pas, je vais obtenir un manage.py not found
erreur donc je l'ai compris dans ce ici que je devrais commenter la place.
j'ai lu beaucoup de choses sur internet et je voudrais savoir s'il y a une bonne et simple approche pour obtenir docker-machine jouer bien avec docker-composer sur Ubuntu.
fichier DockerFile
FROM ubuntu:14.04.3
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y
build-essential
git-core
python2.7
python-pip
python-dev
libpq-dev
postgresql-client-9.3
libjpeg-dev
binutils
libproj-dev
gdal-bin
RUN mkdir /vagrant
WORKDIR /vagrant
RUN mkdir requirements
COPY requirements requirements
RUN pip install -r requirements/local.txt
COPY . /vagrant/
menu fixe-composer.yml
postgis:
image: mdillon/postgis:9.3
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: "postgres"
# volumes:
# - /etc/postgresql
# - /var/log/postgresql
# - /var/lib/postgresql
web:
build: .
dockerfile: Dockerfile
command: python manage.py runserver 0.0.0.0:8000 --settings=xxx.settings.local
# https://stackoverflow.com/a/31567743/977622
# volumes:
# - .:/vagrant
ports:
- "8000:8000"
links:
- "postgis:postgis"
mise à jour:
quand je cours le mount
commande à l'intérieur de ma vm, je obtenir:
tmpfs on / type tmpfs (rw,relatime,size=918096k)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
/dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,data=ordered)
cgroup on /sys/fs/cgroup type tmpfs (rw,relatime,mode=755)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,relatime,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,relatime,hugetlb)
/dev/sda1 on /mnt/sda1/var/lib/docker/aufs type ext4 (rw,relatime,data=ordered)
none on /mnt/sda1/var/lib/docker/aufs/mnt/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d type aufs (rw,relatime,si=462e07a762a4065f,dio,dirperm1)
shm on /mnt/sda1/var/lib/docker/containers/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
mqueue on /mnt/sda1/var/lib/docker/containers/137fb1ad9a432a3f4fa47667ecc9991c10149b71f02dfc06a8134fc348532a3d/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
nsfs on /var/run/docker/netns/2e4dbeed7a66 type nsfs (rw)
mes dossiers partagés indiquent dans L'interface utilisateur que le chemin du dossier est /home
3 réponses
Malheureusement, votre le plus sûr (et compatible) le pari va être à re-construire l'image et de re-déployer le conteneur pour chaque changement que vous faites (c'est à dire, docker-compose build && docker-compose up -d
ou similaire). Cela a l'avantage de travailler aussi contre les démons remote Docker (que vous explorez pourraient devenir plus tentantes puisqu'elles sont si faciles à utiliser).
Le Commentaire de@AndyShinn / les réponses de @tianon répondent à la question que je crois.
cependant, si vous exécutez un hôte Ubuntu, vous pourriez essayer de courir sur métal nu, plutôt que dans une VM. De nos jours, vous pouvez exécuter Docker containers comme non-root via le --userns-remap
drapeau, de sorte que vous pouvez être un peu moins préoccupés par la sécurité. Vous êtes dans une position unique, parce que même si la plupart des tutoriels et des choses énumèrent une VM docker-machine comme une condition préalable, leur public cible est principalement les gens sur OS X ou Windows qui ne peut pas exécuter docker sans VM. Ne perdez pas de vue les arbres pour la forêt--hyperviseurs (en particulier Virtualbox) == mauvaise performance D'IO, utilisation excessive de mémoire, et démarrage plus lent. C'est pourquoi nous avons docker :)
docker-machine
tentez de partager le répertoire des utilisateurs entre votre machine qui exécute VirtualBox et la VM locale par défaut de docker (comme boot2docker l'a fait). Si vous n'utilisez pas la VM par défaut, créez la vmshare et montez-la vous-même
Sous Windows C:\Users
et sur un mac /Users
sera monté dans le default
panneau de VM /Users
. Linux va partager /home
et comme le mont /home
vmhost$ docker-machine ssh default
vm$ mount | grep User
Users on /Users type vboxsf (rw,nodev,relatime)
vm$ exit
liste A utilisateurs locaux répertoire
vmhost$ ls -1 /Users/me/docker
compose_env_file
registry_push_test
monter le répertoire local, qui est partagé à la vm, comme un volume de conteneur.
vmhost$ docker run -v /Users/me/docker:/test busybox ls /test
compose_env_file
registry_push_test
la même chose fonctionne sur la VM, car c'est vraiment là que la commande ci-dessus est exécutée.
vm$ docker run -v /Users/me/docker:/test busybox ls /test
compose_env_file
registry_push_test
si vous voulez que les modifications de votre machine apparaissent dans votre VM, vous devez travailler à partir de votre répertoire utilisateur et utiliser les chemins relatifs dans docker composer.