「R」R Docker 教程

2022-01-31 優雅R

最近由於研究需要,複習下 Docker,找到了本教程,分兩次推送,感興趣的可以跟著學習。原英文網址:http://ropenscilabs.github.io/r-docker-tutorial

這是專門為具有 R 和 RStudio 知識的朋友設計的 Docker 教程。該介紹旨在幫助需要 Docker 進行項目的人們。我們首先解釋 Docker 是什麼以及為什麼有用。然後,我們將詳細介紹如何將其用於可複製的分析項目。

準備

在開始之前,請根據自己的作業系統安裝下面的連結的介紹安裝 Docker

第一課:什麼是 Docker?為什麼我應該使用它?學習目標為什麼我想要使用 Docker?

想像一下,你正在 R 中進行分析,然後將代碼發送給朋友。你的朋友在完全相同的數據集上運行此代碼,但結果略有不同。這可能有多種原因,例如作業系統不同,R 軟體包的版本不同等。Docker 可以解決這樣的問題。

「可以將Docker容器視為你計算機內部的一臺計算機」。這個虛擬計算機的妙處在於你可以將其發送給你的朋友。當他們啟動計算機並運行你的代碼時,他們將獲得與你完全相同的結果。

簡單來說,你因為下面的一些原因使用 Docker:

還有一些 Docker 可以發揮用處的地方:

可移植性:由於 Docker 容器可以輕鬆地發送到另一臺機器,因此你可以在自己的計算機上設置好所有內容,然後在更強大的機器上運行分析。可共享性:你可以將 Docker 容器發送給任何知道如何使用 Docker 的人。基本詞彙

下面會經常出現鏡像和容器這兩個詞。映像的實例稱為容器。映像是虛擬計算機的設置。如果運行此映像,將擁有它的一個實例,我們將其稱為容器。可以有多個運行相同映像的容器。

第二課:在 Docker 中啟動 RStudio學習目標安裝

首先參考 install Docker[4] 進行安裝,沒有必要完成連結中所有的教程,有需要再回看它們。

在 Docker 中啟動 RStudio

要啟動 Docker,我們需要做的第一件事是打開一個 Unix Shell。如果你在 Mac 或 Windows 上,在最後一步,你安裝了一個叫做Docker快速啟動終端;現在打開它——它看起來應該像一個普通的 shell 提示符(~$),但實際上它指向的是一個 Docker 默認運行的 linux 虛擬機,而在本教程的其餘部分,除非另有說明,你應該在這裡完成所有操作。如果您在 linux 機器上,那麼您可以使用普通的舊終端提示符。

在 Mac上,你也可以選擇終端並配置 Docker。特別是如果你得到錯誤不能連接到Docker守護進程。Docker 守護進程在此主機上運行嗎?。在教程的某個時候,運行下面的命令可能會解決你的問題:

eval "$(docker-machine env default)"

接下來,我們將要求Docker運行一個已經存在的映像,我們將使用來自 Rocker[5] 的 verse  Docker映像,它將允許我們在容器內運行RStudio,並且已經安裝了許多有用的R包。

docker run --rm -p 8787:8787 -e PASSWORD=yourpassword rocker/verse

--rm、-p和 -e是允許你自定義如何運行容器的標誌。-p告訴 Docker 你將使用一個埠在你的瀏覽器中看到 RStudio(在一個位置,我們隨後指定為埠 8787:8787)。—rm 確保當我們退出容器時,容器被刪除。如果我們不這樣做,每次我們運行一個容器,它的一個版本將被保存到我們的本地計算機。這最終會導致大量磁碟空間的浪費,直到我們手動刪除這些容器。稍後,我們將向你展示如何保存容器(如果你想這樣做的話)。最後,-e 將 PASSWORD 環境變量設置為 yourpassword。在堆棧中運行帶有RStudio的容器時,Rocker 需要你設置密碼[6]。出於安全考慮,我們建議你將 yourpassword 更改為您自己獨特的字符串。

如果你嘗試運行一個沒有在本地安裝的 Docker 容器,那麼Docker會自動在Docker Hub(一個在線的Docker 鏡像存儲庫)上搜索該容器,如果它存在,就下載它。

上面的命令將導致 RStudio-Server 不可見地啟動。要連接到它,打開一個瀏覽器,輸入http://,然後加上你的 ip 地址,再加上:8787。如果您運行的是 Mac 或 Windows 機器,您將在啟動 Docker Quickstart終端時出現在終端中的第一行文本中找到 ip 地址。例如,你應該會看到:

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

你應該在瀏覽器中鍵入 URL http://192.168.99.100:8787 。

如果你在一臺 Linux 機器上運行,你可以使用 localhost 作為 ip 地址,例如:http://localhost:8787

這將會將你導向 RStudio 登錄界面,使用下面的信息登錄:

username: rstudio password: password(上面你設置過這個東西)

現在你就可以在瀏覽器中使用 RStudio 工作了,就像你使用 Rstudio 桌面版一樣。

下面是一個截圖示例:

現在試試運行下面的代碼吧:

# make x the numbers from 1 to 5, and y the numbers from 6-10
x <- 1:5
y <- 6:10

# plot x against y
plot(x, y)

因為我們剛才啟動鏡像時使用了 --rm 標記,所以在這個機器上創建的任何東西在關閉後都會消失。你可以試試將上面的代碼保存為一個文件,然後關閉瀏覽器,在終端上用 Control+C 關掉容器,然後重新啟動容器,看是否創建的文件是否依然存在。

將磁碟與 Docker 鏡像連接以便於訪問和保存數據文件

既然數據文件會消失,那麼我們退出容器後該如何保存我們的工作呢?一個解決的辦法是將一個磁碟(例如你的本地硬碟)與一個容器連接起來,這樣你就可以在本地磁碟上訪問和保存數據了。

這一次當我們啟動容器時使用 -v 標記指定我們項目的根目錄,如下所示(你的目錄可能有所不同),:左邊是你本地計算機的路徑,右邊是容器裡的路徑,一般以 /home/rstudio/ 開始(這個鏡像已經默認創建了用戶名 RStudio 和進行了相關配置)。

docker run --rm -p 8787:8787 -v /Users/tiffanytimbers/Documents/DC/r-docker-tutorial:/home/rstudio/r-docker-tutorial rocker/verse

再一次地,在你的瀏覽器進行 RStudio。

這一次你在 Docker 容器中啟動 RStudio 後,你可以查看到下面映射的文件目錄。然後就可以載入數據進行分析工作了:

# load gapminder data from a csv on your computer
gap5yr <- read.csv(file = 'data/gapminder-FiveYearData.csv')

畫一個分析圖:

# load ggplot library
library(ggplot2)

# plot GDP against  life expectancy
qplot(gap5yr$lifeExp, gap5yr$gdpPercap)

# save the plot
ggsave(filename = 'data/GDP_LifeExp.pdf')

讓我們將腳本保存為 plot_GDP_LifeExp.R,然後關閉容器,看在本地目錄下是否能看到腳本和繪圖文件。

小結

這一課我們學習了如何通過容器在瀏覽器中運行 RStudio。學習了 --rm 標誌的作用和如何連接磁碟文件。

第三課:安裝 R 包在 RStudio 內安裝 R 包

這跟我們使用 RStudio 桌面版沒什麼區別,試試運行:

# install package
install.packages('gapminder')

# load library
library(gapminder)

# peek at data
head(gapminder)

太好了!現在我們已經安裝好包並可以進行工作。但是等等,如果我們退出了容器會發生什麼?安裝的包會被刪除,因為我們沒有保存這個版本的 Docker 鏡像。我們需要創建一個鏡像,這樣當利用它創建一個新的容器時,gapminder 包也已經安裝好了,可以直接使用。

為了做到這一點,我們需要運行 docker commit(類似 git commit)保存修改。記住,這個操作需要在關閉容器前運行,一般我們另外打開一個終端進行這個操作。

我們可以使用下面的命令進行查看(類似 linux ps 命令):

docker ps

輸出應該類似下面展示,哈希值記錄了容器 ID:

4a6a528b35da        rocker/verse        "/init"             2 minutes ago       Up 2 minutes        0.0.0.0:8787->8787/tcp   silly_meninsky

現在我們在新的終端中運行下面命令,並記錄修改信息:

docker commit -m "verse + gapminder" 4a6a528b35da verse_gapminder

-m 指定修改信息,哈希值指定了我們要保存的容器,verse_gapminder 為保存的鏡像設定了一個名字。

現在我們的電腦上就有 2 個鏡像了:

docker images 

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
verse_gapminder                      latest              bb38976d03cf        57 seconds ago      1.955 GB
rocker/verse                         latest              0168d115f220        3 days ago          1.954 GB

現在你可以測試下新鏡像的工作情況。

安裝 R 系統外部依賴

許多 R 包有外部依賴,如 GSL, GDAL, JAGS,為了安裝它們,你需要進行如下的操作:

docker ps # find the ID of the running container you want to add a package to
docker exec -it <container-id> bash # a docker command to start a bash shell in your container
apt-get install libgsl0-dev # install the package, in this case GSL

如果安裝報錯,先試試 apt-get update

為了保存安裝的依賴,依舊需要進行修改的提交:

docker commit -m "verse + gapminder + GSL" <container id>  verse_gapminder_gsl

第四課:對 Docker Hub 推送或拉取鏡像學習目標從 Docker Hub 獲取鏡像

Docker Hub[7] 是一個存儲 Docker 鏡像的地方,當我們運行下面的命令時,軟體首選檢查鏡像是否存在於你的計算機上。如果不存在,它會自動去 Docker Hub 搜索和下載。

docker run --rm -p 8787:8787 rocker/verse

如果你想要從 Docker Hub 上拉取鏡像而不運行它,可以使用命令:

docker pull rocker/verse

將鏡像放到 Docker Hub

想像一下如果你自己創建了一個鏡像,然後想要與其他人分享,你可以在 https://hub.docker.com/ 創建一個帳號。驗證完郵箱之後,你就可以將你的鏡像上傳了:

登錄 https://hub.docker.com/

使用命令行登錄 Docker Hub

docker login --username=yourhubusername --email=youremail@company.com

如果沒問題應該會看到下面的信息

WARNING: login credentials saved in /home/username/.docker/config.json
Login Succeeded

檢查鏡像的 ID

docker images

然後你會看到類似下面的輸出:

REPOSITORY              TAG       IMAGE ID         CREATED           SIZE
verse_gapminder_gsl     latest    023ab91c6291     3 minutes ago     1.975 GB
verse_gapminder         latest    bb38976d03cf     13 minutes ago    1.955 GB
rocker/verse            latest    0168d115f220     3 days ago        1.954 GB

標記你的鏡像(打標籤)

docker tag bb38976d03cf yourhubusername/verse_gapminder:firsttry

這裡鏡像 ID 必須匹配,fisttry 是標籤,一般選擇一些容易識別的標籤。

推送你的鏡像:

docker push yourhubusername/verse_gapminder

現在所有人都可以使用你的鏡像了!

保存和加載鏡像

將鏡像推送到 Docker Hub 非常使用,但它有些缺點:

當在一些計算節點上工作時,如果每一次你都拉取 Docker Hub 的鏡像,速度會很慢

解決方案的在本地對你的鏡像進行存檔,這樣你可以在需要的時候輕鬆載入。

為了這一目的,你可以使用 docker save 命令。讓我們試試吧:

docker save verse_gapminder > verse_gapminder.tar

如果我們想要從存檔中載入鏡像,使用下面的命令:

docker load --input verse_gapminder.tar

Reference[1]

mac: https://docs.docker.com/mac/step_one/

[2]

linux: https://docs.docker.com/linux/step_one/

[3]

windows: https://docs.docker.com/windows/step_one/

[4]

install Docker: https://docs.docker.com/engine/getstarted/step_one/

[5]

Rocker: https://github.com/rocker-org/rocker/wiki

[6]

需要你設置密碼: https://github.com/rocker-org/rocker-versioned/blob/master/rstudio/README.md

[7]

Docker Hub: https://hub.docker.com/

相關焦點

  • 2020「r/anime karma ranking」第10周排行榜公開
    2020「r/anime karma ranking」第10周排行榜公開 動漫 178動漫整編 ▪
  • 雲計算核心技術Docker教程:在Centos中安裝Docker
    版本稱為 docker 或 docker-engine 。安裝命令如下:$ sudo yum remove docker \docker-client \docker-client-latest \docker-common \
  • 雲計算核心技術Docker教程:Compose使用
    2.使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。3.最後,執行 docker-compose up 命令來啟動並運行整個應用程式。/bin/docker-compose將可執行權限應用於二進位文件:$ sudo chmod +x /usr/local/bin/docker-compose創建軟鏈:$ sudo ln -s /usr/local/bin/docker-compose
  • Flask + Docker 無腦部署新手教程
    其實在 docker 流行的今天,部署已經要比當初我學的時候要方便得多,但是前段時間我 google 搜了一圈的確沒看到幾篇比較好的 Docker + Flask 的指導,於是寫一篇菜鳥也能看懂的新手教程。本教程的特點就是比較無腦,照著做就能部署成功。同時給出一些連結,想深入一點了解的可以自行深入學習。
  • 《夜下降生Exe:Late「cl-r」》繁中版將於2月20日上市!確認成為EVO...
    代理商傑仕登宣布,以對戰格鬥遊戲《Melty Blood》系列聞名的「FRENCH-BREAD」與開發《Guilty Gear》、《蒼翼默示錄》等系列受到好評的「Arc System Works」所共同開發,正統派近代小說感覺2D格鬥遊戲《夜下降生》系列最新作------《夜下降生
  • docker安裝Nginx和Tomcat
    #使用docker ps 查看一下啟動中的鏡像docker ps那麼我們把webapps文件複製過去root@14bd56032674:/usr/local/tomcat/webapps.distroot@14bd56032674:/usr/local/tomcatcp: -r not specified; omitting directory 'webapps.dist/ROOT'cp: -r not specified
  • Docker 日誌管理最佳實踐
    前者一般位於 /var/log/upstart/docker.log 下,後者我們一般 通過 journalctl -u docker 來進行查看。當日誌量比較大的時候,我們使用 docker logs 來查看日誌,會對 docker daemon 造成比較大的壓力,容器導致容器創建慢等一系列問題。
  • PS4、NS《夜下降生 Exe:Late「cl-r」》中文版今天正式上市
    另外,包含前作,本作被世界最大規模的格鬥遊戲大會「EVO 2020」連續2年選為主要項目而引起話題。■《夜下降生 Exe:Late[cl-r]》遊戲介紹- 劇情介紹「虛幻之夜」。既是現實又非現實,分分合合,平行存在的另一個「世界」。是常人無法認知的不可思議封閉領域。在該空間中,名為「虛無」的怪物張揚跋扈,名為「顯現」的無常之力充斥滿盈。
  • Docker 大勢已去,Podman 崛起
    (點擊下載2021年最新阿里p7面試題教程) 在podman體系中,有個稱之為common的守護進程,其運行路徑通常是/usr/libexec/podman/conmon,它是各個容器進程的父進程,每個容器各有一個,common的父則通常是1號進程。podman中的common其實相當於docker體系中的containerd-shim。
  • 「R」Rprofile:R 全局設置
    # Package download mirrors ---## For Bioconductor packagesoptions(BioC_mirror = "https://mirrors.tuna.tsinghua.edu.cn/bioconductor")## For CRAN packages## Full list see mirrors on <https://cran.r-project.org
  • 雲計算核心技術Docker教程:Docker容器使用
    docker 客戶端非常簡單 ,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。可以通過命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
  • 不用Docker也能構建容器的4種方法
    package functionimport ( "fmt" "io/ioutil" "net/http")func Handle(w http.ResponseWriter, r *http.Request) { var input []byte if r.Body !
  • Linux下安裝和使用Docker
    --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2.yum list docker-ce --showduplicates | sort -rdocker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stabledocker-ce.x86
  • ...Late「cl-r」》繁中版將於2月20日上市!確認成為EVO2020比賽項目!
    代理商傑仕登宣布,以對戰格鬥遊戲《Melty Blood》系列聞名的「FRENCH-BREAD」與開發《Guilty Gear》、《蒼翼默示錄》等系列受到好評的「Arc System Works」所共同開發,正統派近代小說感覺2D格鬥遊戲《夜下降生》系列最新作------《夜下降生
  • Docker 入門教程
    \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \/linux/centos/docker-ce.repo列出可用的docker-ce版本yum list docker-ce --showduplicates | sort -rdocker-ce.x86_64 3:18.09.1-3.el7
  • 「Mysql」資料庫主從搭建-基於docker
    主從搭建的世界 :)通過Docker搭建主從伺服器首先我們需要拉取docker鏡像,我們使用5.7版本的MySQL:docker pull mysql:5.7然後使用此鏡像啟動容器,這裡需要分別啟動主從兩個容器創建Master(主資料庫):docker run
  • MATLAB R2019b 完整激活教程
    雙擊「matlab_R2019b_mac64.dmg」打開安裝包;2. 雙擊「InstallForMacOSX」運行安裝程序,選擇「使用文件安裝密鑰」,點擊下一步;3. 接受條款,並點擊「下一步」;4.
  • 機器人克魯澤 Cruzr 的落地之路:為傳統商業注入新勞動力
    「瓷磚店怎麼走?」老張走上前試探性地問道。正值電商促銷季,線下門店也推出了不少折扣活動,老張帶著一家三口來到位於海澱的居然之家金源店挑新家的瓷磚。小兒子對門前的「大白」機器人——克魯澤 Cruzr 十分好奇,湊上去互動了半天,唱歌、跳舞、知識問答,機器人都能對答如流。
  • Docker 極簡入門教程
    這種魔法可以把我蓋好的房子複製一份,做成「鏡像」,放在我的背包裡。等我到了海邊,就用這個「鏡像」,複製一套房子,拎包入住。是不是很神奇?對應到我們的項目中來,房子就是項目本身,鏡像就是項目的複製,背包就是鏡像倉庫。如果要動態擴容,從倉庫中取出項目鏡像,隨便複製就可以了。Build once,Run anywhere!不用再關注版本、兼容、部署等問題,徹底解決了「上線即崩,無休止構建」的尷尬。
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。