Docker 安裝 Jupyter 跑 JS 與 Typescript

DEBUG
LT Lab
Published in
6 min readAug 16, 2019

Docker 是什麼?

Docker利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心命名空間(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔[2]
來源: 維基百科

開發者常碰到,在本地開發是用 Windows 系統,上線後的環境是 Linux 系統,系統的不同造成程式錯誤的機率就越大。早期的普遍做法就是透過 virtualbox 或 vmware 等,來安裝整個作業系統,安裝系統及設定系統,需要相當的時間,且也佔用相當多的本地資源,Docker 是使用本地系統的核心,以最小資源運行其環境。

淺談輕量化的虛擬技術 — Docker容器http://www.cc.ntu.edu.tw/chinese/epaper/0036/20160321_3611.html

Windows 也支援 Linux 的開發環境,可以搜尋關鍵字 Windows Subsystem for Linux。在 Windows 下安裝 Docker Desktop for Windows 需滿足以下條件。

Windows 10 64bit: Pro, Enterprise or Education (Build 15063 or later). Virtualization is enabled in BIOS. Typically, virtualization is enabled by default. This is different from having Hyper-V enabled. For more detail see Virtualization must be enabled in Troubleshooting.
CPU SLAT-capable feature.
At least 4GB of RAM.
來源: https://docs.docker.com/docker-for-windows/install/

會開始接觸 Docker 的場景,當 MAC 系統更新,本地設定的開發環境都會還原成預設值,一開時的做法認為環境跑掉就重設,沒什麼難度,但每次的重設都是不同的操作流程才能完成,最後真的心累的,才漸漸使用 Docker 來部署環境。Docker 環境建置好了,不管新人舊人來要協同開發,也相對省時,省去建置環境的時間。

這次實作,使用的 image 為 jupyter/datascience-notebook,預設安裝支援的語言有Julia 、R、Python,我們需要再加入Javascript 及 Typescript。

找尋是否有現成 image 可以上 docker hub 搜尋
https://hub.docker.com/search?q=jupyter&type=image

這邊啟用 Container 的方式,是透過 Dockerfile 及 docker-compose 的方式。

下面是 Dockerfile 的代碼,針對 image jupyter/datascience-notebook 做一些調整,以下代碼均來自 https://hub.docker.com/r/jupyter/datascience-notebook/dockerfile

針對上述,我們加入的部份如下,我們增加nodejs、 ijavascript、itypescript

RUN conda install -c conda-forge nodejsRUN npm install -g ijavascript itypescriptRUN ijsinstallRUN its — install=local

ijavascript
https://github.com/n-riesco/ijavascript
itypescript
https://github.com/nearbydelta/itypescript

docker-compose 的目的在於,針對不同的 image 做管理,由於此範例只有一個 image ,無法看出 docker-compose 的方便性。這邊有定義 Port,本地的Port 8888 對應到容器的 8888,啟動服務後,可以使用 http://localhost:8888,查看該服務。

上述設定完後,以下指令,安裝及啟動服務,耗時差不多 20 分鐘,image 檔案約 5G。

# docker-compose up

完成後,終端機下會顯示一段如下 URL,token 的用意,是在認證您的身份。

http://0.0.0.0:8888/?token=[token]

順利的話,會顯示如下畫面,且會有Javascript 及 Typescript 的選項。

通常都不順利,我們可以查看目前運多的服務,直接進入 Container 下啟用。

以下指令查看當前運作的 Container

# docker ps

將看到的CONTAINER ID 帶入以下的[CONTAINER ID]

# docker exec -it -u root [CONTAINER ID] /bin/bash

進入後,執行以下指令,讓Javascript 及 Typescript 可以運作。重整剛剛網頁的畫面,應該就會顯示這兩個選項。

# ijsinstall# its --install=local

來 TRY 一下 Typescript。

刪除 Container

# docker-compose down

啟動存在的 Container

# docker-compose start

停止 Container

# docker-compose stop

--

--

DEBUG
LT Lab
Editor for

軟體工程的可怕是沒有最優,只有更優的代碼,每天被放大鏡檢視的錯誤(BUG),已鍛鍊內心的強大,有時可能厚者臉皮裝傻帶過,更多時候是不願服輸,比昨日的自己還強大。