IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 在Windows系统下,基于WLS从零开始部署我的 R shiny项目到 Docker 中,并将镜像发布到 Docker Hub(内附详细操作流程) -> 正文阅读

[系统运维]在Windows系统下,基于WLS从零开始部署我的 R shiny项目到 Docker 中,并将镜像发布到 Docker Hub(内附详细操作流程)

前言

需要将项目部署到Docker中,我之前也没有接触过这个,纯萌新记录一下整个过程。
注意:整个流程对于我来说是能成功跑通的,但我也不知道有没有冗余操作(因为我也不太懂),欢迎大家提出宝贵意见~

我的配置环境

主系统:Windows 10
子系统:

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
Codename:       focal

有可以翻墙的梯子,所以下载与上传过程我都没使用镜像链接,如果大家在网速上有问题的话可以去搜一下怎么配置镜像。


过程

1. 安装Windows版Docker

(安装时候没有记录过程,这步是凭着记忆写的,如果遇到问题只能善用搜索了)
Docker的官网下载windows桌面版,点击页面中蓝色的Docker Desktop for Windows下载,解压到本地。
之后是注册账户,选择免费的个人版本即可。
安装过程我记得还是遇到了一点小问题,后面根据官方给的中文解决方案和网上的安装教程装好了,主要是将WSL升级为WSL2。

有了这两个图标就算是安装好软件了(大的是快捷方式,小的在状态栏)
在这里插入图片描述
在ubuntu子系统中输入docker run hello-world,出现下面内容就说明配置完成。

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2. 本地部署所需环境

1. 新建shiny用户

这步非常重要,一定要执行。(血泪经验)
进入root权限,添加shiny用户,这样可以避免很多问题,因为shiny-server的默认使用用户是shiny。

su
useradd shiny
passwd shiny

这里的过程我没截图,我也是按照知乎上的一个教程上来的,就借用他的图片了,该文在参考部分有引用。
这里的过程我没截图,我也是按照知乎上的一个教程上来的,就借用他的图片了,该文在参考部分有引用。
在用户列表添加shiny账户的root权限,将/sudoers文件权限改为可编辑并添加。
(这里需要读者具有一定的vim知识,方便大家操作,我将给出一些基础的操作,详细的请自己去学习。
打开文件默认是在阅读模式,光标操作就用键盘的↑↓←→,找到位置后按a在光标后进入编辑模式,按i在光标前进入编辑模式。按esc退出编辑模式进入阅读模式,这时按住shift+z+z保存并退出,按住shift+z+q不保存直接退出

chmod +w /etc/sudoers
vim /etc/sudoers

在这里插入图片描述
切换到shiny用户环境。

su - shiny    #输入后若出现No directory提示,忽略即可。

安装shiny包,即使在主环境安装过shiny也要装!每个用户都有自己的环境配置。

sudo R -e "install.packages('shiny')"

如果出现permission denied错误提示你权限不够,在命令最开始加上sudo
至此准备工作已完成,下面是shiny-server的安装部署。

2. 配置shiny-server环境

进入到srv目录下,下载最新的shiny-server的deb,最新版本见官网

cd /srv
sudo apt-get install gdebi-core
sudo wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.17.973-amd64.deb
sudo gdebi shiny-server-1.5.17.973-amd64.deb

这里的安装过程我好像也遇到了问题,但是记不得有啥了。。没记下来,反正就是报啥错就去搜解决方法,国内网搜不到就去外网搜,总能解决的。

shiny-server安装完成,需要运行主页的话还需要安装一个包:rmarkdown

sudo R -e "install.packages('rmarkdown')"

完成后任意在局域网内的PC或手机端在浏览器输入ip:3838http://localhost:3838/看到以下界面就完成了环境部署。
hostname -I查看本地IP)
在这里插入图片描述
shiny服务管理:

以下是启动,停止,重启三个命令,更多管理细项见官方文档

sudo systemctl start shiny-server 
sudo systemctl stop shiny-server 
sudo systemctl restart shiny-server

3. 开启shiny的logs日志记录

日志的存放目录为/var/log/shiny-server,报错日志按照服务+时间的格式,因此一个服务可能有多个日志。
像这样
参数路径为/etc/shiny-server/shiny-server.conf,内容如下,建议在开头加上preserve_logs true;

preserve_logs true;   #原文件没有这行命令,加上这行命令才会生成服务日志

# Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server {
  listen 3838;

  # Define a location at the base URL
  location / {

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;
  }
}

默认情况下,shiny的应用程序的运行是 shiny用户,它在安装shiny-server时就已经被创建了,因此一开始就建好shiny用户来配置环境会方便很多。

4. 上传shiny项目,测试是否能够正常访问

当你写好一个shiny服务需要部署时,将你写好的shiny服务的文件夹(含有 |ui.R和server.R| 或 |app.R|)拷贝至/srv/shiny-server,则能直接在浏览器打开。

注意,要先给文件夹读写权限,否则不能生成与上传文件。

sudo chmod 777 -R /srv/shiny-server/

将已经写好的shiny项目复制到该路径下。
在这里插入图片描述

局域网内任意PC或手机端在浏览器输入ip:3838/你的文件名localhost::3838/你的文件名, 得到如下界面.
在这里插入图片描述
这一步可能不会直接就成功显示界面,如果出现报错就要去检查logs内容,看看到底是报了什么错,通常来说是某个R包没有装,所以开启shiny的服务日志是很重要的,善用logs!

3. Docker部署

1. 尝试部署(可能可以跳过这一步)

我在按照知乎的教程来的时候,这步部署完就没有后续操作了,成功执行后感觉没有达到我的需求,我需要一个Dockerfile并push到hub中。当初不懂跟着做了,现在感觉这步没必要,或者我还有别的操作没做完?

sudo docker run -itd -p 3838:3838 -v /srv/shinyapps/:/srv/shiny-server/ -v /srv/shinylog/:/var/log/shiny-server/ rocker/shiny

#这是我按照他的代码改的自己的
sudo docker run -itd -p 3838:3838 -v /srv/shinyapps/:/srv/shiny-server/shinyapp-pquantr -v /srv/shinylog/:/var/log/shiny-server/ rocker/shiny-verse:latest

此处-itd为了防止shiny-server服务挂掉后docker停止;-p将docker3838端口与本地3838端口对应;-v为挂载本地目录,第一个是本地app存放目录,映射到docker的/srv/shiny-server/,即本地部署的路径;第二个-v是映射日志路径;最后的rocker/shiny是镜像名字,本地没有的话会自动从docker hub拉取;注,rocker/shiny后可以加R的版本号,如rocker/shiny:3.4.4

需要装包的话,找到自己的docker,并进入就能装了。(因为你的容器又是一个全新的环境

sudo docker ps

sudo docker exec -it 你的容器ID(前几个字符就行) bash

想上传新的app时,只要上传到本地的/srv/shinyapps即可。

最后,要注意的是,上文提到过,shiny-server不会自动保存日志,所以你需要进入docker,安装vim,修改/etc/shiny-server/shiny-server.conf,加上preserve_logs true; (因此我感觉这步可以跳过,我后面将安装环境写进Dockerfile中了

如果按照这步做着走,可能会遇到一个报错是docker: command not found,我在这里找到了解决方法:

没猜错应该是创建镜像时出现的问题吧。
run 之后 exit 退出
再执行,不是在容器中执行的,docker build 也是在在外层执行的不是在容器中执行

(小心套娃

2. 写Dockerfile以及相关的文件

我在另一篇知乎教程找到了构建dockerfile的过程,再结合了这篇英文博客,写好了我自己项目的Dockerfile。
关于Dockerfile的基础教程可以点进知乎教程(↖)看看,下面只放我自己项目的构建记录

文件路径树

你的文件夹:
----app(也可换为别的,我就换成了pquantr)
--------www
------------my_style.css
--------server.r	(或者是app.r)
--------ui.r		(或者是app.r)
----Dockerfile
----shiny-server.conf
----shiny-server.sh

在这里插入图片描述

Dockerfile

这定义了一个docker镜像-你告诉docker在你的docker镜像中包含哪些依赖项,可以理解为整合了部署的所有操作指令。

cd /srv/shinyapps/
sudo touch Dockerfile
sudo vim Dockerfile

我的Dockerfile内容:

# get shiny server plus tidyverse packages image
FROM rocker/shiny-verse:latest

maintainer Douer douerww@gmail.com

# system libraries of general use
RUN apt-get update && apt-get install -y \
    sudo \
    pandoc \
    pandoc-citeproc \
    libcurl4-openssl-dev \
    libnode-dev \
    libcairo2-dev \
    libxt-dev \
    libssl-dev \
    libssh2-1-dev \
    curl \
    libxml2-dev \
    libudunits2-0 \
    libudunits2-dev \
    xtail \
    wget \
    gdebi-core \
    vim

# Install library
RUN R -e "install.packages(c('shiny','shinydashboard','DT','pheatmap','rhandsontable','shinyjs','shinyWidgets','ggplot2','tidyverse','IDPmisc','devtools','htmlwidgets','log4r','gplots','RcppArmadillo'))"
RUN R -e "devtools::install_github('Vitek-Lab/MSstats')"


### --------------------------------------

# copy shiny-server.sh to image
COPY shiny-server.sh /usr/bin/

# copy shiny server config to image
COPY shiny-server.conf  /etc/shiny-server/shiny-server.conf

# copy the contents of app folder to image
COPY ./pquantr /srv/shiny-server/pquantr

# select port
EXPOSE 3838

# allow permission for user ‘shiny’ to run
RUN sudo chown -R shiny:shiny /srv/shiny-server

# install linux programs to enable conversion of ms dos file to unix file
RUN apt-get update && apt-get install -y dos2unix

# we do this so that the shiny-server.sh file is recognized by the linux machine
RUN dos2unix /usr/bin/shiny-server.sh && apt-get --purge remove -y dos2unix && rm -rf /var/lib/apt/lists/*

# Change access permissions to shiny-server.sh - did not need this for my purposes
RUN chmod -R 755 /usr/bin/shiny-server.sh

# run app
CMD ["/usr/bin/shiny-server.sh"]

· FROM、 RUN都是Dockerfile的指令。 FROM指令用于指定基础镜像, RUN指令用于执行命令。
· RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
· 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

shiny-server.conf

该文件定义服务器配置。

sudo touch shiny-server.conf
sudo vim shiny-server.conf

我的shiny-server.conf内容:(和之前安装shiny-server生成的配置文件内容是一样的,都在开头加上了开启服务日志命令)

preserve_logs true;

# Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server {
  listen 3838;

  # Define a location at the base URL
  location / {

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;
  }
}

shiny-server.sh

在此文件中,我们告诉shiny服务器在哪、如何登录并启动shiny服务器。

sudo touch shiny-server.sh
sudo vim shiny-server.sh

我的shiny-server.sh内容:(被那个英文教程坑了,他代码没复制完!!!气死,我报了好多莫名其妙的错,弄了好久,后面在官方github里找到了完整代码)

#!/bin/sh

# Make sure the directory for individual app logs exists
mkdir -p /var/log/shiny-server
chown shiny.shiny /var/log/shiny-server

if [ "$APPLICATION_LOGS_TO_STDOUT" != "false" ];
then
	    # push the "real" application logs to stdout with xtail in detached mode
	    exec xtail /var/log/shiny-server/ &
fi

# start shiny server
exec shiny-server 2>&1

3. 使用Dockerfile构建自己的Docker镜像 / 创建Docker镜像

创建docker镜像

sudo docker build -t pquantr . 

如果你更改了dockerfile相关的文件,都要再重新上传一次。
这个过程可能产生很多不再需要的镜像,就可以删掉了。

停用+删除docker镜像

sudo docker stop 容器ID  #一定要先停用再删除,要不会报错
sudo docker rm 容器ID

删除镜像也可以去Docker桌面版里删,但是我不知道咋在那里面停用镜像。。不能删在运行的镜像。

运行docker镜像

sudo docker run -itd -p 32:3838 pquantr

如果顺利的话,在浏览器里输入http://localhost:32/pquantr/就是你的项目了!!??ヽ(°▽°)ノ?

当然这个过程很可能不会一次性成功,这就要你进入容器后查看服务日志,一个一个解决报错。
下面三个命令是我最常用的 ( T ^ T ):

sudo docker exec -it 容器id bash #进入容器
cd /var/log/shiny-server/  #进入服务日志在的文件夹
vim 服务日志名字

会出现的错误包括但不限于,你输错了包的名字(认真的,我就把IDPmisc打成了IDPmisc……),漏了某个library的包没安,等等……
认真的,你可能输错了……
可能还会出现包安装失败的情况,我进入容器后单独安装那个包报了三个依赖包安装失败的信息,尝试单独安装那三个包都能成功,于是将那三个包加入Dockerfile的安装命令里,就成功了~

4. 保存镜像并上传到Hub

保存镜像

docker save -o 文件名 镜像名

我的操作:
这里我返回了上一级文件夹再执行的命令,因为我要保存的文件名也是pquantr,直接执行会报错该名字已存在了。

cd ..
sudo docker save -o pquantr pquantr:latest

在这里插入图片描述
上传镜像

sudo docker login
# 然后这里输入你的账号密码
sudo docker push 镜像名称  #执行这步我报错了,搜了一下要使用tag规范变量名,见下面代码或参考

我的操作:

sudo docker login douer
sudo docker push pquantr
#然后报错了,详情见下面图片,这里只放代码
sudo docker tag pquantr douer/pquantr:latest

在这里插入图片描述
我明明tag好了再push,不知道为什么还是报错,这时我打开了Docker的桌面快捷方式,一顿操作,就上传成功了。 ??ヽ(°▽°)ノ?

具体操作看图:
我尝试过push pquantr,也还是报错。。然后试了一下push那个带tag的,就成功了!!
在这里插入图片描述
我2.18GB的镜像大概上传了半个小时,然后打开https://hub.docker.com/r/你的用户名/你的项目名就能看到自己发布的镜像了!
我的是:

https://hub.docker.com/r/douer/pquantr

在这里插入图片描述
总算弄好了,花了我两天时间,一把辛酸泪T T。


4. 项目源码

Github:Douerww/pquantR,在docker/里。(欢迎大家给我点个 ☆ ~~)

5.参考

R工程化(2) 基于shiny-server+docker的部署、维护与发布
十分钟学会用docker部署微服务
Deploy R Shiny Apps with Docker - Windows 10 Home Older Build
Deploying an R Shiny App With Docker
Docker部署安装及常规操作
Docker镜像推送(push)到Docker Hub
Shiny-Server的安装和使用教程
还有很多报错时候查过的文章,这里就不贴了,大家遇到问题先国内网搜,搜不到就去外网搜,总能解决的!
贴个谷歌最近搜索记录:在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 13:06:47  更:2021-11-11 13:08:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:55:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码