2015-12-05 118 views
17

因此,我一直在使用Docker-compose开发一段时间,现在在我的Ubuntu 14.04 LTS主机上使用本地VirtualBox提供程序(boot2docker)。在Ubuntu上的Docker机器+ Docker Compose +卷

只是最近我决定尝试docker-machine(因为与Pycharm的集成),但我遇到了一些问题,例如当我保存一些新代码时docker容器不会自动更新,我认为它因为我在我的docker-compose.yml网络服务中注释了我的卷,但是如果我不会收到manage.py not found错误,所以我在此here中了解到我应该对其进行注释。

我一直在阅读互联网上的很多东西,我想知道是否有一个很好的和简单的方法来让docker-machine在docker-compose上很好地玩。

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/ 

泊坞窗,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:

当我运行我的虚拟机内部的mount命令我得到:

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) 

我SH ARED文件夹说,在该文件夹路径是/home

+0

就像链接的问题所解释的,主机卷挂载相对于运行Docker的_host_。如果您的Docker计算机在外部运行在提供程序中,那么该卷不会是来自本地计算机的数据。 Docker机器在哪里运行? –

+0

我正在VirtualBox @AndyShinn运行Docker机器 – psychok7

+0

您能否登录到VM('docker-machine ssh ')并获取挂载('mount')并查看是否有任何来自主机的挂载在VM中?如果没有,那么这对于虚拟机是不可能的。您需要以某种方式与虚拟机共享主机文件夹,以便容器能够访问它。 –

回答

2

不幸的是,UI,你最安全(最兼容)的赌注将是重新建立形象和每个改变你做重新部署容器(即docker-compose build && docker-compose up -d或类似的)。这对于远程Docker守护进程也有很大的好处(当您探索docker-machine的功能可能变得更加诱人,因为它们非常易于使用)。

+1

这看起来不错。在开发过程中每次更改时都会很痛苦。让我想起C每次你手动编译的地方。你知道是否有计划在未来改变这种行为? – psychok7

+1

那么,实际上运行在虚拟机内部的应用程序,我们基本上是在谈论远程绑定挂载。我知道Vagrant有很多连接器来帮助实现这种功能(我认为它有一切从vboxsf到sshfs一直到使用rsync来回),这可能值得一试。这也可能值得尝试NFS(尤其是因为你的主机也是Linux)。 – tianon

1

@ AndyShinn的评论/ @ tianon的回答回答了我相信的问题。

但是,如果您运行的是Ubuntu主机,则可以尝试在裸机上运行,​​而不是在虚拟机上运行。现在,您可以通过--userns-remap标志将docker容器作为非root用户运行,因此您可以不太关心安全性。你处于一个独特的位置,因为尽管大多数教程和事情都列出了作为先决条件的docker-machine虚拟机,但他们的目标受众主要是OS X或Windows上的人员,他们不能在没有虚拟机的情况下运行docker。不要忽视树木 - 虚拟机管理程序(特别是Virtualbox)== IO性能不佳,内存使用率过高以及启动速度较慢。这就是为什么我们有搬运工人:)

+0

我得到了“如果我使用linux更好地在我的主机上运行它”的事情,但对我来说没有意义的是OS X和Windows用户如何处理“这个问题”。为什么要将docker machine做为替代品或改进我们之前的做法(即使在Linux主机上),如果您无法在保存时更新您的代码而无需再次构建它,那么为什么? OS X用户每次构建小代码时都会进行构建? – psychok7

+0

就我个人而言,我每次运行新代码时都会重建。通常情况下,除非有奇怪的科学软件是代码库的一部分,不会在OS X上运行...我正在运行我在本地OSX机器上工作100%,然后在满意时打包容器,测试通过。如果你想运行在虚拟机上的容器(本地或其他)。你需要与你的虚拟机共享你的工作目录,以便它可以与容器共享。该过程与远程虚拟机类似,不同之处在于您需要使用sshfs,nfs或其他网络协议来通过网络同步文件 – pnovotnak

0

docker-machine确实企图分享你的机器运行VirtualBox和本地默认泊坞窗VM(如boot2docker那样)之间的用户目录。如果您没有运行默认VM然后创建vmshare和自己安装它

在Windows C:\Users和在Mac /Users将被安装在default泊坞窗VM为/Users。Linux将分享/home和安装为/home

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

列表本地用户目录

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

安装本地目录,这是共享的虚拟机,作为容器的体积。

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

在虚拟机上也是如此,因为这真的是上述命令运行的地方。

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

如果你想从你的机器的变化出现在你的虚拟机,你必须从你的用户目录工作,在泊坞窗撰写使用相对路径。