2015-12-05 46 views
17

Così ho iniziato a usare docker-compose in sviluppo per un po 'ora sulla mia macchina host Ubuntu 14.04 LTS con un provider VirtualBox locale (boot2docker al suo interno).Docker Machine + Docker Compose + Volumi su Ubuntu

Solo di recente ho deciso di provare finestra mobile-macchina (a causa della integrazione con PyCharm), ma io sono in esecuzione in alcuni problemi, come ad esempio quando salvo qualche nuovo codice del contenitore finestra mobile non viene più aggiornato automaticamente e credo che la sua perché ho commentato i miei volumi nel mio servizio web docker-compose.yml ma se non avrò un errore manage.py not found quindi ho capito in questo here che dovrei commentare invece.

Ho letto molte cose su Internet e vorrei sapere se c'è un buon e semplice approccio per far sì che la finestra mobile funzioni bene con docker-compose su Ubuntu.

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/ 

finestra mobile-compose.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" 

UPDATE:

quando ho eseguito il comando mount dentro la mia vm ottengo:

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) 

mio sh cartelle ARED dicono nell'interfaccia utente che il percorso della cartella è /home

+0

Come il problema collegato spiega, i montaggi del volume dell'host sono relativi allo _host_ su cui è in esecuzione Docker. Se la macchina Docker è in esecuzione in un provider esternamente, il volume non saranno i dati dal computer locale. Dove è in esecuzione la macchina Docker? –

+0

Sto eseguendo la finestra mobile in VirtualBox @AndyShinn – psychok7

+0

È possibile accedere alla VM ('docker-machine ssh ') e ottenere i supporti ('mount') e vedere se qualcosa dall'host è montato nella VM? In caso contrario, questo non sarà possibile con una VM. È necessario condividere la cartella host con la VM in un modo che consenta al contenitore di accedervi. –

risposta

2

Sfortunatamente, il tuo più sicuro (e più compatibile) scommessa sta per essere ri-costruire l'immagine e ri-distribuire il contenitore per ogni modifica apportata (cioè, docker-compose build && docker-compose up -d o simile). Questo ha il vantaggio di lavorare anche con i daemon Docker remoti (che mentre esplori le funzionalità di docker-machine potrebbero diventare più allettanti dal momento che sono così facili da usare).

+1

Questo non sembra giusto .. Sarà un dolore farlo a ogni cambiamento durante lo sviluppo. Mi ricorda di C dove compilare manualmente ogni occasione. Sai se ci sono piani per cambiare questo comportamento in futuro? – psychok7

+1

Bene, con l'applicazione effettivamente in esecuzione all'interno di una VM, stiamo essenzialmente parlando di montaggi di binding remoto. So che Vagrant ha molti connettori per facilitare questo tipo di cose (penso che abbia tutto da vboxsf a sshfs fino all'utilizzo di rsync avanti e indietro) che probabilmente vale la pena di verificare. Probabilmente è anche la pena provare NFS (specialmente dal momento che anche il tuo host è Linux). – tianon

1

@ Commento di AndyShinn/Le risposte di @ tianon rispondono alla domanda in cui credo.

Tuttavia, se si sta utilizzando un host Ubuntu, si potrebbe provare a girare su bare metal, piuttosto che su una VM. In questi giorni è possibile eseguire container docker come non root tramite il flag --userns-remap, in modo da essere un po 'meno preoccupati per la sicurezza. Ti trovi in ​​una posizione unica, perché anche se la maggior parte delle esercitazioni e delle cose elenca una macchina virtuale mobile come prerequisito, il loro pubblico di destinazione è principalmente gente su OS X o Windows che non può eseguire la finestra mobile senza una VM. Non perdere di vista gli alberi per la foresta: gli hypervisor (in particolare Virtualbox) == prestazioni I/O errate, utilizzo eccessivo della memoria e avvio più lento. Ecco perché abbiamo finestra mobile :)

+0

ottengo il merito di "essere migliori di eseguirlo nel mio host se uso Linux", ma quello che non ha senso per me è come gli utenti di OS X e Windows si occupano di "questo problema". Perché pubblicizzare la macchina docker come un sussidio o un miglioramento rispetto a come abbiamo fatto prima (anche sugli host di linux) se non è possibile aggiornare semplicemente il proprio codice al salvataggio senza doverlo ricostruire? Gli utenti di OS X costruiscono ogni volta che modificano un piccolo codice? – psychok7

+0

Personalmente, in realtà lo ricostruisco ogni volta che eseguo un nuovo codice. Di solito, a meno che non ci sia un software scientifico strano che faccia parte della base di codice che non girerà su OS X ... Sto lavorando Io lavoro al 100% sulla mia macchina OSX locale, quindi comprimo un contenitore quando sono soddisfatto e il mio i test passano Se si desidera eseguire in un contenitore su una VM (localmente o in altro modo). Sarà necessario condividere la directory di lavoro con la VM in modo che possa quindi condividerla con il contenitore. Il processo è simile con le macchine virtuali remote, tranne per il fatto che dovresti usare sshfs, nfs o qualche altro protocollo di rete per sincronizzare i file sulla rete – pnovotnak

0

docker-machinefa tentativo di condividere la directory degli utenti tra la macchina che esegue VirtualBox e la finestra mobile predefinita locale VM (come boot2docker ha fatto). Se non si esegue il default VM quindi creare il vmshare e montare da soli

Su Windows C:\Users e su un Mac /Users sarà montato nel default finestra mobile VM come /Users.Linux condividerà /home e montare come /home

vmhost$ docker-machine ssh default 
vm$ mount | grep User 
Users on /Users type vboxsf (rw,nodev,relatime) 
vm$ exit 

Lista utenti una directory locale

vmhost$ ls -1 /Users/me/docker 
compose_env_file 
registry_push_test 

Montare la directory locale, che è condiviso al vm, come un volume del contenitore.

vmhost$ docker run -v /Users/me/docker:/test busybox ls /test 
compose_env_file 
registry_push_test 

Lo stesso funziona sulla VM, in quanto è proprio dove il comando precedente è in esecuzione.

vm$ docker run -v /Users/me/docker:/test busybox ls /test 
compose_env_file 
registry_push_test 

Se si desidera che le modifiche dalla macchina a comparire nel vostro VM, si deve lavorare dalla directory utente e utilizzare i percorsi relativi a finestra mobile di composizione.

Problemi correlati