在windows下使用Docker ToolBox時,有時候我們需要將主機某個文件夾共享到docker容器中,方便在windows主機與docker容器之間同步文件夾數據。但是我們都知道Docker ToolBox會啟動virtualbox虛擬機,docker實際上是運行在虛擬機上的,而不是直接運行在windows主機上,所以沒辦法直接通過docker run的 -v 參數實現主機與docker容器文件夾共享。
本文將介紹如何在windows下實現主機與docker容器之間的文件夾共享。
主要有兩大步驟:
1. 配置windows主機與virtualbox虛擬機之間文件夾共享。
2. 配置virtualbox虛擬機與docker容器之間文件夾共享。
我們都知道docker run的 -v 參數可以實現docker容器與宿主機之間目錄共享。對於使用Docker Toolbox的情況,宿主機是並不是windows主機,而是在windows主機上通過virtualbox運行的虛擬機。因此,docker容器只能與虛擬機之間進行文件夾共享,要實現windows主機與docker容器之間文件夾共享,我們還需要配置windows主機與虛擬機之間文件夾共享,從而間接實現windows主機與docker容器之間文件夾共享。
一、 配置windows主機與virtualbox虛擬機之間文件夾共享
1. 在VirtualBox中添加共享文件夾
首先,打開Oracle VM VirtualBox管理器:
選擇Docker ToolBox默認創建的 default 虛擬機,點擊工具欄的“設置”按鈕,打開設置窗口:
默認情況下,virtualbox已經配置了c/Users目錄為共享文件夾,對應虛擬機里的共享目錄為/c/Users。
如果我們想共享其他文件夾,那么我們需要點擊右側的“添加共享文件夾”按鈕:
添加一個共享文件夾配置,如下:
如上圖所示,我添加了一個名稱為 MyBlog 的共享文件夾,指向windows主機的 E:\workspace\MyBlog 目錄。同時,勾選“自動掛載”和“固定分配”。
(PS:我共享該文件夾的目的是,以后在我本機上對我的blog的修改就可以動態同步到docker容器中,達到實時生效的目的^_^)
點擊OK保存。x
2. 掛載共享文件夾
添加共享文件夾后,需要將其掛載到虛擬機上。
1) 自動掛載到默認目錄
由於我們前面添加共享文件夾時勾選了 自動掛載 ,當我們重啟虛擬機后,共享文件夾就會被自動掛載到虛擬機上,不用手動掛載。
所以接下來我們啟動 Docker Quickstart Terminal ,運行如下命令重啟虛擬機:
1
|
docker-machine restart
|
重啟后,運行如下命令進入虛擬機:
1
|
docker-machine ssh
|
進入虛擬機后,檢查一下我們的共享文件夾是否自動掛載上了。共享文件夾會被自動掛載到根目錄下,路勁為: /<共享文件夾名稱> ,如下是我的例子:
1
2
3
4
5
6
|
docker@default:~$ ll /MyBlog
total 8
-rwxrwxrwx 1 docker staff 1183 Jun 11 14:07 MyBlog.iml
-rwxrwxrwx 1 docker staff 2263 Jun 11 14:05 pom.xml
drwxrwxrwx 1 docker staff 0 Jun 11 14:05 src/
drwxrwxrwx 1 docker staff 0 Jun 11 14:09 target/
|
可以看到,windows主機 E:\workspace\MyBlog 里的內容已經共享到虛擬機 /MyBlog 下了。
2) 掛載到指定目錄
當然,我們也可以將共享文件夾掛載到虛擬機的指定目錄下。
通過 docker-machine ssh 命令進入虛擬機,然后在虛擬機中創建一個目錄。我們將要把windows主機的共享文件夾掛載到該目錄。例如,創建 /home/docker/MyBlog :
1
|
mkdir /home/omc/MyBlog
|
我們現在查看該目錄下是沒有任何內容的:
1
2
|
docker@default:~$ ll /home/docker/MyBlog
total 0
|
接下來,將windows主機的共享文件夾掛載到該目錄,運行如下命令:
1
|
sudo mount -t vboxsf MyBlog /home/docker/MyBlog
|
然后查看/home/docker/MyBlog目錄:
1
2
3
4
5
6
|
docker@default:~$ ll /home/docker/MyBlog/
total 8
-rwxrwxrwx 1 root root 1183 Jun 11 14:07 MyBlog.iml
-rwxrwxrwx 1 root root 2263 Jun 11 14:05 pom.xml
drwxrwxrwx 1 root root 0 Jun 11 14:05 src/
drwxrwxrwx 1 root root 0 Jun 11 14:09 target/
|
可以看到已經成功掛載了!
但是,這種方式有一個弊端:每當重啟虛擬機后,新創建的目錄會丟失。
我們可以通過如下方式解決這個問題:
編輯 /mnt/sda1/var/lib/boot2docker/profile 文件中:
1
|
sudo vi /mnt/sda1/var/lib/boot2docker/profile
|
在文件最后增加如下配置:
1
2
|
mkdir /home/docker/MyBlog
sudo mount -t vboxsf MyBlog /home/docker/MyBlog
|
保存退出虛擬機,執行如下命令重啟虛擬機:
1
|
docker-machine restart
|
重啟后,再次執行 docker-machine ssh 進入虛擬機,查看是否自動掛載到我們指定的目錄 /home/docker/MyBlog :
1
2
3
4
5
6
|
docker@default:~$ ll /home/docker/MyBlog/
total 8
-rwxrwxrwx 1 root root 1183 Jun 11 14:07 MyBlog.iml
-rwxrwxrwx 1 root root 2263 Jun 11 14:05 pom.xml
drwxrwxrwx 1 root root 0 Jun 11 14:05 src/
drwxrwxrwx 1 root root 0 Jun 11 14:09 target/
|
可以看到,掛載成功!
二、配置virtualbox虛擬機與docker容器之間文件夾共享
這個就很簡單了,在執行 docker run 命令時,通過 -v 參數虛擬機某個目錄掛載到docker容器中。
如下,將前面在虛擬機中創建的 /home/docker/MyBlog 目錄掛載到docker容器的 /usr/tmp/MyBlog 中:
1
|
docker run -v /home/docker/MyBlog:/usr/tmp/MyBlog -i -t centos /bin/bash
|
進入docker容器后,查看 /usr/tmp/MyBlog 目錄:
1
2
3
4
5
6
7
8
9
|
root@d478e4c6c7f2:/# ll /usr/tmp/MyBlog/
total 20
drwxrwxrwx 1 root root 4096 Jun 11 14:09 ./
drwxr-xr-x 3 root root 4096 Jul 28 15:52 ../
drwxrwxrwx 1 root root 4096 Jun 27 13:52 .idea/
-rwxrwxrwx 1 root root 1183 Jun 11 14:07 MyBlog.iml*
-rwxrwxrwx 1 root root 2263 Jun 11 14:05 pom.xml*
drwxrwxrwx 1 root root 0 Jun 11 14:05 src/
drwxrwxrwx 1 root root 0 Jun 11 14:09 target/
|
可以看到,windows主機共享文件夾里的內容被成功同步到docker容器中了!