Docker是一種 操作系統層面的虛擬化技術,類似於傳統的虛擬機。傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。傳統虛擬機使用前需要指定內存、硬盤燈大小,使用過程中即使程序沒有占用那么多資源也不會釋放出來,而Docker則是使用多少則占用多少。
Docker有三個主要的概念:鏡像(Image)、容器(Container)、倉庫(Repository)。我們都知道,操作系統分為內核和用戶空間。對於 Linux 而言,內核啟動后,會掛載 root 文件系統為其提供用戶空間支持。而 Docker 鏡像,就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統的 root 文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。Docker中的鏡像是分層存儲,往往是不同的docker依賴同一個的文件。
鏡像和容器的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的 命名空間。因此容器可以擁有自己的 root 文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID 空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機。
前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而准備的存儲層為容器存儲層。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
倉庫是存放鏡像的地方,一個倉庫可以有多個,這樣便於集中管理。
在熟悉上述概念的情況下,接下來將記述如何在docker中配置可以運行TensorFlow的環境。
(前提已經安裝好docker,想要運行TensorFlow代碼)
1、 運行一個你熟悉的鏡像(如Ubuntu系統的鏡像)
docker run –it images_id /bin/bash
2、 查詢正在運行的容器
docker ps
3、 進入你之前運行的容器中
docker exec –it container_id /bin/bash
(這樣可以使用exit退出你的容器而不關閉容器)
4、 安裝python
apt update
//更新ubuntu系統
apt install python3
//安裝python3
5、 安裝pip3
apt install python3-pip
6、 安裝TensorFlow
pip install tensorflow
如此,服務器中的TensorFlow的運行環境就配好了。
提示:如果你的Docker中,無法使用中文,
首先,在docker 查看你的語言環境,輸入: locale
發現都是“POSIX”的話表示,此時的語言環境不能輸入中文。接着查看支持的語言環境,輸入 locale -a
如發現支持C.UTF-8,那么在進入容器時,使用如下命令:
docker docker exec -it container_id env LANG=C.UTF-8 bash
這樣就可以了。(PS:如果容器內不支持中文,哪怕你直接在python中處理中文的語料也會報錯!)
不建議直接安裝帶有TensorFlow的鏡像,主要是這些鏡像里面的設置都配置好了,不太容易更改,自己安裝的話,可以更好地控制版本。