前言

我們時常會遇到一份 project 需要執行在與本機不同的環境下,舉例而言:

NachOS 是一份教學用 OS 軟體,需要執行在 32 bits system 上,而本機環境是 64 bits architecture。
我們需要一份可以跑 NachOS 的環境,且 run 在該環境的 NachOS 要與本地的同步,以方便之後交作業。

若想要在本地架設 NachOS 執行環境的話,會需要以下:

  • 開啟支援 32 bits 的功能
  • clone 下程式碼

等等操作,其中可能會導致本地環境變亂,或者影響其他 project 的環境。

此時,若使用 Docker,我們可以為某份 project 創造專門的執行環境。

Start Container

要創建一個執行環境,我們需要透過 Docker create 一個 container。

可以將 container 看成輕量化的虛擬機。

如果要從 0 開始 build 一個 container,可以參考網路上的其他教學,但這裡我們從 Docker Hub 使用現成的,這也是 Docker 的一大好處。

這裡以執行 NachOS 為例,nwtgck/nachos-build 是一份別人 build 好的 Docker image,我們可以透過以下指令建立起一個新的 container。

1
docker run -it nwtgck/nachos-build

Note:

  • Docker image 可以看成 container 的藍圖,每個 container 會基於 image 建立,而建立後成為一個獨立的 instance,後續的操作就與 images 無關。
  • -it 的 flag 代表的是互動模式,說明在 container 建立後連線進去該 container 的 terminal。

執行後我們可以看到環境的改變如下,代表我們已經進到這個 container 裡面。

1
2
user@localMachine:/$ docker run -it nwtgck/nachos-build
root@6db3b1879ebf:/#

成功建立起 container 後,在 container 內的任何操作都不會影響到本地的環境。

但是,要怎麼將 code 帶進 container,還有在 container 內做的修改,要怎麼帶出 container 呢?

此時,我們要用到 Docker 的 mount volume。

Mount Volume

請注意 mount 要在 container stop 的情況下執行,因此若要 mount 進上面 create 的 container,請先 logout 再執行下面的指令。

透過以下指令我們 run 一個新的 container 並將 NachOS mount 進該 container 內:

1
docker run -it -v ./nachos-4.0:/root/nachos-4.0 -w /root/nachos-4.0 nwtgck/nachos-build

Note:

  • -v flag 代表 mount volume,冒號前為 source dir;冒號後為 destination dir。
  • -w flag 代表 working directory,連線進 container 後會直接進入該 dir。

此時,NachOS 就在 container 內且與本機同步,我們可以透過 touch 與 ls 實驗:

1
2
3
4
5
6
7
8
root@6db3b1879ebf:/root/nachos-4.0# ls
COPYRIGHT README-3.4 README-4.0 c++example code nachos-4.0 nachos.ps

root@6db3b1879ebf:/root/nachos-4.0# touch test.txt
root@6db3b1879ebf:/root/nachos-4.0# exit

user@localMachine:/$ ls ./nachos-4.0/test.txt
./nachos-4.0/test.txt

因此,透過上述 2 項 Docker 的功能,我們實現了為本地的 code 創造任意的執行環境,且與此同時,可以在本機習慣的 IDE 進行操作。