2015-12-05 116 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 

如果你想從你的機器的變化出現在你的虛擬機,你必須從你的用戶目錄工作,在泊塢窗撰寫使用相對路徑。