B.21 Docker 虚拟环境

docker 创建云实例 rstudio DigitalOcean,docker 支持的驱动类型 https://docs.docker.com/machine/drivers/。Rocker 项目组提供的 shiny 容器 https://github.com/rocker-org/shiny 和构建过程 https://hub.docker.com/r/rocker/shiny/dockerfile

主机 80 端口映射给 shiny 容器 3838 端口

docker run --user shiny -d -p 80:3838 \
    -v /srv/shinyapps/:/srv/shiny-server/ \
    -v /srv/shinylog/:/var/log/shiny-server/ \
    rocker/shiny

shiny 服务器默认支持从 80 端口访问 http://localhost:80,shiny 应用放在目录 /srv/shinyapps/appdir,访问 Shiny 应用的位置 http://localhost/appdir/,使用 boot2docker 则访问 http://192.168.59.103:80/appdir/

Docker 相比虚拟机占用资源少,拉起来就可以用,虚拟机还需要各种环境配置,很多与R有关的项目现在都提供Docker镜像,大大方便了开发人员和数据分析师。当然 docker 的环境隔离性,对主机系统侵入小,即使挂了,再拉起来也就是了,安全性和可靠性高。

基于 The Rocker Project 快速构建数据分析环境,Rocker项目 站在 DebianR 的肩膀上,在 Docker 内配置众多数据分析和开发的工具,免去用户手动配置的复杂性。此事非有心者不能为之 ,因为需费时费力找寻依赖库,编译 R 包,还要尽可能地给 Docker 镜像减负,以便部署。如果想抢先试水的赶快去 Rocker 项目主页。

其它容器相关项目有 SingularityKubernetes 容器集群管理,更多参见高策的博客 https://gaocegege.com

本节介绍与本书配套的 VBox 镜像和 Docker 容器镜像,方便读者直接运行书籍原稿中的例子,尽量不限于软件环境配置的苦海中,因为对于大多数初学者来说,软件配置是一件不小的麻烦事。

本书依赖的 R 包和配置环境比较复杂,所以将整个运行环境打包成 Docker 镜像,方便读者重现,构建镜像的 Dockerfile 文件随同书籍源文件一起托管在 Github 上,方便读者研究。本地编译书籍只需三步走,先将存放在 Github 上的书籍项目克隆到本地,如果本地环境中没有 Git,你需要从它的官网 https://git-scm.com/ 下载安装适配本地系统的 Git 软件。

git clone https://github.com/XiangyunHuang/masr.git

然后在 Git Bash 的模拟终端器中,启动虚拟机,拉取准备好的镜像文件。为了方便读者重现本书的内容,特将书籍的编译环境打包成 Docker 镜像。在启动镜像前需要确保本地已经安装 Docker 软件 https://www.docker.com/products/docker-desktop,安装过程请看官网教程。

docker-machine.exe start default
docker pull xiangyunhuang/masr

最后 cd 进入书籍项目所在目录,运行如下命令编译书籍

docker run --rm -u docker -v "/${PWD}://home/docker/workspace" \
  xiangyunhuang/masr make gitbook

编译成功后,可以在目录 _book/ 下看到生成的文件,点击文件 index.html 选择谷歌浏览器打开,不要使用 IE 浏览器,推荐使用谷歌浏览器获取最佳阅读体验,尽情地阅读吧!

如果你想了解编译书籍的环境和过程,我推荐你阅读随书籍源文件一起的 Dockerfile 文件, Docker Hub 是根据此文件构建的镜像,打包成功后,大约占用空间 2 Gb,本书在 RStudio IDE 下用 R Markdown (Xie, Allaire, and Grolemund 2018) 编辑的,编译本书获得电子版还需要一些 R 包和软件。Pandoc https://pandoc.org/ 软件是系统 Fedora 30 仓库自带的,版本是 2.2.1,较新的 RStudio IDE 捆绑的 Pandoc 软件一般会高于此版本。如果你打算在本地系统上编译书籍,RStudio IDE 捆绑的 Pandoc 软件版本已经足够,当然你也可以在 https://github.com/jgm/pandoc/releases/latest 下载安装最新版本,此外,你还需参考书籍随附的 Dockerfile 文件配置 C++ 代码编译环境,安装所需的 R 包,并确保本地安装的版本不低于镜像内的版本。

镜像中已安装的 R 包列表可运行如下命令查看。

docker run --rm xiangyunhuang/masr \ 
  Rscript -e 'xfun::session_info(.packages(TRUE))'

Docker & Docker Machine & Docker Swarm

  1. 容器与镜像的操作

    docker --version
    # Docker version 18.03.0-ce, build 0520e24302

    查看容器

    docker ps -a

    删除容器 docker rm 容器 ID,删除前要确认已经停止该容器的运行

    docker rm 6f932357e6ce

    查看镜像

    docker images

    删除镜像

    docker rmi 镜像 ID

    docker rmi 811281c54b23
  2. 拉取镜像

    docker pull rocker/verse:latest
  3. 运行容器

    docker run --name verse -d -p 8282:8080 -e ROOT=TRUE \
       -e USER=rstudio -e PASSWORD=cloud rocker/verse

    将主机端口 8282 映射给虚拟机/容器的 8080 端口,RStudio Server 默认使用的端口是 8787,因此改为 8080 需要修改 /etc/rstudio/rserver.conf 文件,添加

    www-port=8080

    然后重启 RStudio Server,之后可以在浏览器中登陆,登陆网址为 http://ip-addr:8080,其中 ip-addr 可在容器中运行如下一行命令获得

    ip addr

更多关于服务器版本的 RStudio 介绍,请参考 https://docs.rstudio.com/ide/server-pro/access-and-security.html

Docker Machine

基本命令

  • 查看 docker machine 版本信息

    docker-machine --version
    # docker-machine.exe version 0.14.0, build 89b8332
  • 列出创建的虚拟机

    # 启动前
    docker-machine ls
    # NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
    # default   -        virtualbox   Stopped                 Unknown
    # 启动后
    docker-machine ls
    # NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
    # default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.03.0-ce
  • 查看虚拟机 default 的 ip

    docker-machine ip default
    # 192.168.99.100
  • 启动虚拟机

    docker-machine start default
    # Starting "default"...
    # (default) Check network to re-create if needed...
    # (default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
    # (default) Waiting for an IP...
    # Machine "default" was started.
    # Waiting for SSH to be available...
    # Detecting the provisioner...
    # Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
  • 进入 Docker 环境

    docker-machine ssh default
                            ##         .
                      ## ## ##        ==
                   ## ## ## ## ##    ===
               /"""""""""""""""""\___/ ===
          ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
               \______ o           __/
                 \    \         __/
                  \____\_______/
     _                 _   ____     _            _
    | |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
    | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
    | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
    |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
    Boot2Docker version 18.03.0-ce, build HEAD : 404ee40 - Thu Mar 22 17:12:23 UTC 2018
    Docker version 18.03.0-ce, build 0520e24
  • 查看容器

    docker ps -a
    # CONTAINER ID        IMAGE               COMMAND             CREATED            STATUS                   PORTS               NAMES
    # 69e6929d269e        rocker/verse        "/init"             3 weeks ago        Exited (0) 10 days ago                       verse
  • 启动/停止容器

    docker start verse
    # verse
    docker stop verse
    # verse
  • 查看虚拟机 default 的环境

    docker-machine env default
    # export DOCKER_TLS_VERIFY="1"
    # export DOCKER_HOST="tcp://192.168.99.100:2376"
    # export DOCKER_CERT_PATH="D:\Docker\machines\default"
    # export DOCKER_MACHINE_NAME="default"
    # export COMPOSE_CONVERT_WINDOWS_PATHS="true"
    # # Run this command to configure your shell:
    # # eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default)
  • 关闭虚拟机 default

    docker-machine stop default
    # Stopping "default"...
    # Machine "default" was stopped.

更多详情见帮助文档 https://docs.docker.com/machine/get-started

参考文献

Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.