jellyfin服務器怎么設置?
jellyfin服務器設置方法如下:
1首先進入到docker里面,鏡像管理,鏡像倉庫搜索鏡像-Jellyfin點擊下載。
2安裝程序選擇版本,默認選擇latest就好。
3拉取程序數據,可以選擇后臺下載,安裝有一段時間,等待以下提示安裝完成。
4這個時候可以到容器管理添加容器。
如何用Docker成為更高效的數據科學家?
使用Docker容器來開發機器學習模型的好處有很多。近日,GitHub的資深機器學習科學家HamelHusain在TowardsDataScience上發表了一篇入門級的Docker容器教程,文章從基本的概念談起,清楚明白地介紹了Docker容器的一些基本的操作和注意事項。機器之心對本文進行了編譯介紹。本文所涉及的所有相關代碼請訪問:_Tutorial
過去五年來,Docker容器已然成了一個熱門詞匯,似乎我的所有軟件工程師朋友都在使用它們來開發應用。我想搞清楚這種技術可以如何讓我更有效率,但我發現我在網上找到的教程要么過于注重細節(解釋了一些我作為數據科學家絕不會使用的功能),要么就過于淺顯(沒有足夠的信息幫助我理解如何快速有效地使用Docker)。
所以我寫了這篇快速入門,這樣你不必自己去網上篩選信息就能學習到快速上手Docker所需要的一切。
Docker是什么?
你可以把Docker看作是輕量級的虛擬機——包含你運行應用所需要的一切。Docker容器可以獲取你的系統的狀態的快照,這樣其他人就可以使用這個快照快速重建你的計算環境。對于本教程而言,這就是你需要了解的一切。更多詳細介紹可參閱:
為什么要使用Docker?
1.重現性:作為專業的數據科學家,讓你的結果能夠重現是非常重要的。重現性不僅有助于同行評議,而且可以確保你創建的模型、應用或分析可以無障礙地運行,這能讓你交付的成果更穩健,更能經受時間的考驗。舉個例子,假如你用Python創建了一個模型,只是運行pipfreeze并將結果得到的requirements.txt文件發送給你的同事是不夠的,因為其中只包含特定于Python的依賴條件——而實際上的依賴條件不只有Python,還有操作系統、編譯器、驅動程序、配置文件以及你的代碼成功運行所需的其它數據。就算你只分享Python依賴條件也能成功,將所有東西都封裝到一個Docker容器中還是能減輕其他人重建你的環境的負擔,并讓他們能更輕松地訪問你的成果。
2.計算環境的可移植性:作為一位數據科學家,尤其是機器學習領域內的數據科學家,快速改變你的計算環境的能力能夠極大地影響你的生產力。數據科學的開始工作常常是原型設計、探索和研究——這些工作并不一定立即就需要特定的計算資源。這個工作往往是在筆記本電腦或個人計算機上完成的。但是在后面某個時候,你往往會需要不同的計算資源來顯著加速你的工作流程——比如使用更多CPU或強大的GPU來執行深度學習等任務。我看到很多數據科學家由于感受到了在遠程機器上重建他們的本地環境的困難,就將自己局限在了本地計算環境內。而Docker能讓你的環境(你的所有庫和文件等等)的移植非常簡單。在Kaggle競賽中,快速移植計算環境也是一個巨大的競爭優勢,因為你可以成本高效地利用AWS的寶貴計算資源。最后,創建Docker文件讓你能移植很多你喜歡的本地環境配置——比如bash別名或vim插件。
3.強化你的工程能力:熟練使用Docker讓你能將模型或分析部署成應用(比如用作提供預測的RESTAPI),從而讓其他人也能使用你的成果。此外,你在數據科學工作流程中可能需要與存在于Docker容器中的其它應用進行交互,比如數據庫。
Docker術語
在我們繼續深入之前,熟悉一下Docker的術語會很有幫助:
·鏡像(image):是你想要創建的東西的藍圖。比如:UbuntuTensorFlow,帶有英偉達驅動程序和一個運行的Jupyter服務器。
·容器(container):是你實現的運行的鏡像的實例化。你可以運行同一個鏡像的多個副本。分清鏡像和容器之間的差異非常重要,因為這是新入門者常?;煜膬蓚€概念。如果你不清楚鏡像和容器的差別,停下來再讀一次。
·Dockerfile:用于創建鏡像的配方。Dockerfile包含特殊的Docker語法。官方文檔說:Dockerfile是一個文本文檔,其中包含了用戶可以在命令行調用的用來組裝成鏡像的所有命令。
·commit:和git類似,Docker容器提供了版本控制。通過commit發生的改變,你在任何時間都可以將你的Docker容器的狀態保存為一個新鏡像。
·DockerHub/ImageRegistry:人們可以發布公開(或私人)Docker鏡像的地方,用于促進合作與共享。
·層(layer):對已有鏡像的修改,由Dockerfile中的一個指令表示。層按次序應用到基礎鏡像上,以創建出最終的鏡像。
本文將使用這些術語,如果你在閱讀時忘記了,一定要回來查看!這些術語很容易混淆,尤其是在鏡像和容器之間——所以你在閱讀時要保持警惕!
安裝Docker
你可以免費下載安裝Docker社區版(DockerCommunityEdition),地址:
創建你的第一個Docker鏡像
在創建Docker容器之前,創建一個將用于定義鏡像的Dockerfile會很有用。我們先慢慢解讀一下下面的Dockerfile。你也可以在與本教程關聯的GitHub庫中找到這個文件:
#reference:_/ubuntu/
FROMubuntu:16.04
#AddsmetadatatotheimageasakeyvaluepairexampleLABELversion1.0
LABELmaintainerHamelHusain
##Setenvironmentvariables
ENV.UTF-8LC_ALLC.UTF-8
RUNapt-getupdate--fix-missingampampapt-getinstall-ywgetbzip2ca-certificates
build-essential
byobu
curl
git-core
htop
pkg-config
python3-dev
python-pip
python-setuptools
python-virtualenv
unzip
ampamp
apt-getcleanampamp
rm-rf/var/lib/apt/lists/*
RUNechoexportPATH/opt/conda/bin:$PATHgtampamp
wget--quiet_-O~ampamp
/bin/bash~-b-p/opt/condaampamp
rm~
ENVPATH/opt/conda/bin:$PATH
RUNpip--no-cache-dirinstall--upgrade
multiprocessing
sklearn-pandas
#OpenPortsforJupyter
EXPOSE7745
#SetupFileSystem
RUNmkdirds
ENVHOME/ds
ENVSHELL/bin/bash
VOLUME/ds
WORKDIR/ds
ADDrun_/ds/run_
RUNchmodx/ds/run_
#Runtheshell
CMD[./run_]
FROM語句
FROMubuntu:16.04
FROM語句包含了Docker最神奇的部分。這個語句指定了你想在上面進行創建的基礎鏡像。通過使用FROM指定一個基礎鏡像,Docker將會在你的本地環境中尋找名為ubuntu:16.04的鏡像——如果它沒有找到,它就會搜索你指定的DockerRegistry,默認是DockerHub:。如果你需要經常在你的Ubuntu等操作系統上安裝程序,那么這種分層機制就非常方便。你不必費心從頭開始安裝Ubuntu,而是可以直接在官方的Ubuntu鏡像上開發!DockerHub上托管著種類繁多的鏡像,包括那些不只是提供了一個操作系統的鏡像,比如如果你想要一個已經安裝了Anaconda的容器,你可以選擇在官方的AnacondaDocker鏡像上開發,地址:。最重要的是,你也可以隨時發布你構建的鏡像,即使該鏡像是通過在其它鏡像上加層得到的!這有無盡的可能性。
在這個案例中,我們指定基礎鏡像為ubuntu:16.04,它會搜索名叫ubuntu的DockerHub庫(_/ubuntu/)。鏡像名之后的部分16.04是指定了你想要安裝的基礎鏡像的版本的標簽(tag)。如果你檢索一下UbuntuDockerHub庫,你會注意到不同版本的Ubuntu對應于不同的tag:
2017年12月的官方UbuntuDockerHub庫截屏
比如,ubuntu:16.04、ubuntu:xenial-20171201、ubuntu:xenial和ubuntu:latest全都是指16.04版的Ubuntu,它們全都是同一個鏡像的別名。此外,這里提供的鏈接指向了對應的Dockerfile,可用于構建每個版本的鏡像。有時候你無法在DockerHub中找到Dockerfile,因為維護者可以自己選擇是否將關于這些鏡像的創建的Dockerfile包含進來。我個人覺得閱讀一些Dockerfile有助于更好地理解Dockerfile。(但不要急,讀完這篇教程再說?。?/p>
你需要特別注意一個標簽,即:latest標簽。這也是你在不為FROM語句指定標簽時默認pull的鏡像。比如說如果你的FROM語句是這樣:
FROMubuntu
然后你就將pullubuntu:16.04鏡像。為什么?——仔細看上面,你可以看到:latest關聯的是16.04.
關于Docker鏡像最后需要注意的一點:在從DockerHubpull隨機的Docker鏡像時要做出明智的判斷。有惡意的人創建的鏡像有可能會包含惡意軟件。
LABEL語句
這個語句會為你的鏡像添加元數據,而且是完全可選的。我增加這個語句的目的是為了讓別人知道可以聯系誰,同時也方便我搜索我的Docker容器,尤其是在一個服務器上同時運行著很多容器時。
LABELmaintainerHamelHusainltyouremailgt
ENV語句
ENV.UTF-8LC_ALLC.UTF-8
這讓你可以修改環境變量,而且相當直接,相關情況請參閱:
RUN語句
這通常是最需要花功夫的地方,給出了你構建該Docker鏡像所想要完成的任務。你可以運行apt-get和pipinstall等任意的shell命令來安裝你需要的軟件包和依賴包。
RUNapt-getupdate--fix-missingampampapt-getinstall-ywgetbzip2
build-essential
ca-certificates
git-core
...
在這里我安裝了一些我喜歡的實用工具,比如curl、htop、byobu,然后安裝了Anaconda,之后還安裝了一些基礎Anaconda中沒有的其它庫(你可以在完整的Dockerfile中查看其它RUN語句)。
RUN語句后的命令與Docker沒什么關系,只是一些你在安裝這些軟件包時需要運行的正常Linux命令,所以就算你不熟悉這些軟件包或Linux命令也不要擔心。另外,再給一個建議:當我最早開始學習Docker時,我查看了GitHub或DockerHub上的其它Dockerfile,然后將我需要的部分復制粘貼到了我的Dockerfile。
你可能注意到了RUN語句的格式。每個庫或軟件包都整齊地進行了縮進,而且為了可讀性還按字母進行了排序。這是Dockerfile的普遍慣例,所以我建議你也這樣做以便合作。
EXPOSE語句
如果你想公開一個端口,這個語句會很有用——比如,如果你從該容器或某個網絡服務內實施一個JupyterNotebook。Docker的文檔相當好地解釋了EXPOSE語句:
EXPOSE指令實際上并沒有發布該端口。它的功能是作為創建該鏡像的人和運行該容器的人之間的一類文檔,內容是關于打算發布的端口。要實際發布該端口,就要在運行該容器時在dockerrun上使用-p標志并且映射一個或多個端口,或者也可以使用-P標志發布所有端口并將它們映射到高階端口。
VOLUME語句
VOLUME/ds
這個語句讓你可以在Docker容器和主機計算機之間共享數據。VOLUME語句讓你可以安裝外部安裝的卷。主機目錄只有在容器運行時才聲明(因為你可能在不同的計算機上運行該容器),而不會在定義鏡像時聲明*。目前你只指定了Docker容器內你想與主機容器共享的文件夾的名稱。
Docker用戶指南解釋說:
主機目錄是在容器運行時聲明的:主機目錄(掛載點)本質上取決于主機。這是為了保證鏡像的可移植性,因為一個給定的主機目錄無法保證在所有主機上都可用。由于這個原因,你不能在Dockerfile中掛載主機目錄。VOLUME指令不支持指定host-dir參數。你必須在創建或運行容器時指定掛載點。
此外,這些卷的目的是將數據保存到容器的文件系統之外,當你要操作大量數據而且不希望你的鏡像膨脹得很大時,這會很有用。當你保存一個Docker鏡像時,在這個VOLUME目錄中的任何數據都不會被保存為該鏡像的一部分,但是在這個容器目錄之外的數據會被保存。
WORKDIR語句
WORKDIR/ds
這個語句設置了工作目錄,以便你在另一條命令中可以無需使用絕對路徑就能索引特定的文件。例如這個Dockerfile中的最后一條語句是:
CMD[“./run_”]
該語句就默認假設工作目錄是/ds
ADD語句
ADDrun_/ds/run_
這條命令讓你可以在Docker容器運行時將文件從主機計算機復制到該Docker容器。我使用這個命令來執行bash腳本以及將.bachrc文件等有用東西導入到容器中。
注意這里的主機容器的路徑并沒有完全指定,因為其主機路徑是你在該容器運行時指定的背景路徑(contextdirectory)的相對路徑(后面會討論)。
在我運行這個容器時,run_正好在背景路徑的根目錄內,所以在該源文件之前沒有路徑。
用戶指南中介紹說:
ADDltsrcgt...ltdestgt
ADD指令從ltsrcgt復制新文件、目錄或遠程文件URL并將它們添加到路徑ltdestgt的鏡像的文件系統中。
CMD語句
Docker容器的設計思想是這些容器是短暫的,能保證運行完你想運行的應用就行了。但在數據科學方面,我們往往希望保持這些容器一直運行,即使它們之中并沒有主動地運行著什么。很多人都通過運行bashshell來實現這一點(除非你終止它,否則它就不會停止)。
CMD[“./run_”]
在上面的命令中,我運行了一個實例化一個JupyterNotebook服務器的shell腳本。但是,如果你沒有什么要運行的特定應用而只是想保持你的容器運行(而不退出),你可以直接運行bashshell,只不過使用以下命令:
CMD[/bin/bash]
這種方法是有效的,因為除非你退出,否則bashshell就不會終止;因此該容器會一直保持運行。
用戶指南中介紹說:
在一個Dockerfile中只能有一個CMD指令。如果你列出了不止一個CMD,那么只有最后一個才有效。
CMD的主要目的是為正在執行的容器提供默認配置。這些默認配置可能包含一個可執行文件,或者也可以省略可執行文件,在這種情況下你還必須指定一個ENTRYPOINT指令。
創建你的Docker鏡像Dockerfile中的信息可真夠多的。不要擔心,后面的內容就相對很簡單了。現在我們已經在Dockerfile中創建了我們的配方,是時候創造鏡像了。你可以通過以下命令完成:
GitHub上也有:_Tutorial/blob/master/basic_tutorial/build_
這會創建一個Docker鏡像(而不是容器;如果你不記得這兩者之間的差異,請查閱文章前面的術語介紹),你可以在后面運行這個鏡像。
從你的Docker鏡像創建和運行容器現在你已經準備好讓這一切工作起來了!我們可以通過執行以下命令來調出環境:
同樣GitHub也有:_Tutorial/blob/master/basic_tutorial/run_
運行完這個命令之后,你的容器就運行起來了!Jupyter服務器也運行起來了,因為在該Dockerfile最后有這個命令:
CMD[“./run_”]
現在你應該可以通過其使用的端口訪問你的JupyterNotebook了——在這個案例中可通過:7745/訪問,密碼是tutorial。如果你是通過遠程的運行這個Docker容器,你還必須設置本地端口轉發,這樣你才能通過你的瀏覽器訪問你的Jupyter服務器。端口轉發介紹:
與你的容器交互一旦容器設置完成并運行起來,下面這些命令就有用了:
·為容器附加一個新的終端會話。如果你需要安裝一些新軟件或使用shell,這會很有用。
·將你的容器的狀態保存為新鏡像。即使你一開始就在Dockerfile中配置了你想安裝的所有庫,隨著時間的推移,你也可能還是需要對容器的狀態進行很大的調整——通過交互來增加更多庫和軟件包。將你的容器的狀態保存為鏡像是很有用的,你后面可以將其分享出去或在上面加層。你可以使用dockercommitCLI命令將容器狀態保存為新鏡像:
dockercommitltcontainer_namegtnew_image_name:tag_name(可選的)
比如說,如果我想將名為container1的容器的狀態保存為名為hamelsmu/tutorial:v2的鏡像,我可以直接運行這個命令:
dockercommitcontainer_1hamelsmu/tutorial:v2
你可能會疑惑鏡像名之前的hamelsmu/是什么——這只是為了讓之后將該容器推送到DockerHub的工作更輕松,因為hamelsmu是我的DockerHub用戶名(后面會再談這個問題)。如果你的工作要使用Docker,那么你的公司很可能有一個內部私有的Docker庫,你也可以將你的Docker推送到那里。
·列出運行中的容器。當我忘記現在正在運行的容器的名稱時,我就常常使用這個命令:
dockerps-a-fstatusrunning
如果你在使用該命令時沒有加上statusrunning,那么你就會看到你系統上的所有容器的列表(即使已經不再運行的容器也在)。這對查找舊容器而言很有用。
·列出你在本地保存的所有鏡像。
dockerimages
·將你的鏡像推送到DockerHub(或其它地方)。如果你想與其他人分享你的工作或將鏡像保存到云上,這個命令就會很有用。注意你在做這件事時可不要分享任何私人信息(DockerHub上也有私有庫)。
首先創建一個DockerHub庫并給你的庫起一個適當的名稱,參考這里:。然后要運行dockerlogin命令來連接到你在DockerHub或其它注冊位置的賬戶。比如,要推送一個鏡像到這個容器(),我首先必須將我的本地鏡像命令為hamelsmu/tutorial(我可以選擇任意標簽名)。比如說,這個CLI命令就為:
dockerpushhamelsmu/tutorial:v2
將之前提到的Docker鏡像推送到這個庫,其標簽為v2,參考:。需要指出:如果你公開了你的鏡像,那么其他人就可以直接在你的鏡像上加層,就像本教程中我們在ubuntu鏡像上加層一樣。對于想要重現或延展你的研究的其他人來說,這非常有用。
你已經掌握了現在你知道如何操作Docker了,你可以執行以下任務:
·與同事和朋友共享可重現的研究。
·通過將你的代碼暫時遷移到所需的更大的計算環境中,無中斷地贏得Kaggle競賽。
·在你的筆記本電腦上的Docker容器內進行本地的原型開發,然后毫不費力地將同樣的計算過程無縫遷移到服務器上,同時還能保留你喜歡的本地環境配置(你的別名、vim插件、bash腳本、自定義提示等)。
·使用Nvidia-Docker在GPU計算機上快速實例化運行TensorFlow、PyTorch或其它深度學習庫所需的所有依賴包。(如果你從頭開始做,這個過程將非常艱辛。)參閱后面的彩蛋。
·將你的模型作為應用發布,比如用作從Docker容器提供預測的RESTAPI。當你的應用Docker化了以后,就可以按照需要輕松地隨意復制。
進階閱讀到這里我們也只學到了Docker的一點皮毛,前面還有很多東西值得掌握。我很關注Docker領域,我認為數據科學家會常常遇到它,希望這篇文章能讓你有足夠的信心開始使用它。下面這些資源曾在我的Docker之旅中為我提供過幫助:
·有用的Docker命令:_docker_containers/
·更有用的Docker命令:
·Dockerfile參考:
·如何創建和推送到DockerHub上的庫:
彩蛋:Nvidia-Docker我學習Docker最早的原因是要在單個GPU上做深度學習模型的原型開發,然后在我需要更多計算資源時再遷移到AWS上。我當時也在學習JeremyHoward的出色的課程(),并且希望與其他人分享我的原型設計。
但是,要將英偉達GPU的驅動程序等所有依賴包都包含以來,你不能使用Docker,而是要用Nvidia-Docker()。這比使用vanillaDocker要多花一些功夫,但只要你理解了Docker,做起來就很簡單。
我將我的Nvidia-Docker設置放在這里:_Tutorial/tree/master/gpu_tutorial,你可以用這個來進行練習。